SQL注入Fuzz记录

前言

从今天开始学习各种fuzz测试,今天做了一道sql注入题,通过fuzz来判断过滤字符,从而构造payload进行绕过。


正文

拿到题目进行简单的测试

发现这题进行了一些sql关键字的过滤,我们通过burp的Intruder模块进行fuzz。

字段长度为370的是被过滤的sql语句。
进一步分析看看这题目到底过滤了哪些关键字,通过一个个分析知道过滤了:# –+等注释符,空格,%0a,%0b等绕过过滤空格的url编码,逗号(,),包含and和or的字符。还有很多绕过过滤的关键字,发现没有过滤sleep(),尝试一下时间盲注。
常规的时间盲注为:

1
if(条件,sleep(3),2)

但是题目过滤了逗号,想到用case when替换:
1
case when 条件 then sleep(2) else 1 end

但是过滤了空格等分隔符,同时内联注释 注释符 %0a %0b %0d %a0也多被过滤,我们可以用括号来代替空格:
1
case when(条件)then(sleep(2))else(1)end

但是测试发现case和when中间是不能添加括号的,到这里时间盲注也是不可行的。

可以尝试另类的布尔盲注:

1
select 'admin'='admin'+1 union select 'admin'='admin'+0;

在本地测试发现,第一个输出0,第二个输出1。

这是mysql的一个特性:在第一个查询中,先进行右边的’admin’+1操作,这个时候会强制转换admin为数字,然后相加完在和等号左边的admin比较,这个时候也会强制转换,所以就会形成不相等的情况。
上面就可以形成布尔逻辑判断了。
首先我们可以先判断一些admin账号的密码长度
1
admin'%2b(length(passwd)=32)%2b'

%2b是+号,不能直接使用加号因为被过滤了,这里也可以使用-号,效果相同。
上面的逻辑是:如果passwd长度为32,则返回1,然后和admin作相加操作,这样就会形成逻辑上的差别。如下图:


这样就可以判断admin的密码是个32为的md5值。
然后在猜解每个字符,通过mid函数进行:但for被过滤!
mid(xxx from 1) 第一位开始取剩下的所有字符
ascii(mid(xxx from 1)) 发现截断 取第一个字符的ascii值。
payload:
1
admin'%2b(ascii(mid((passwd)from(1)))=48)%2b'

通过括号绕过空格过滤,通过mysql中的mid,ascii函数特性绕过for过滤。
最后通过burp爆破每一位的ascii值,就可以得到密码的md5值了。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×