WAF绕过艺术:解码差异与实战技巧
摘要:本文系统阐述了绕过WAF(Web应用防火墙)的五大核心技术:1)编码混淆(URL/Unicode/二次解码);2)数据库特性利用(内联注释/空白符替换/冷门函数);3)协议层攻击(参数污染/请求方法变更/分块传输);4)身份伪装(伪造爬虫/白名单路径);5)经典案例分析(Discuz/IIS/安全狗绕过)。核心思想是寻找WAF、Web服务器和后端应用三者间的解析差异,通过组合编码变形、语法混
引言:绕过WAF的核心哲学
绕过WAF的本质,是在寻找 “三方解析之间的差异” :
-
WAF的解析(规则库、正则表达式)
-
Web服务器的解析(IIS/Apache/Nginx)
-
后端应用/数据库的解析(PHP/ASP/MySQL/MSSQL)
当这三者对一个数据包的解析结果不一致时,就存在绕过的可能。
第一部分:编码与混淆绕过 —— 欺骗WAF的“眼睛”
这类方法旨在改变Payload的表现形式,但不改变其最终语义。
1. URL编码绕过
-
原理:WAF可能只解码一次,或者对特定字符解码不全。
-
基础:
union->%75%6e%69%6f%6e -
进阶(IIS特性,重点):
-
机制:IIS的asp.dll在解码时,会过滤掉
%后跟非十六进制字符的组合。 -
案例:
SEL%E%CT。-
WAF看到:
SEL%E%CT(不匹配SELECT) -
IIS解码后:去掉
%E%,变成SELECT(匹配)
-
-
衍生:利用
%进行混淆,如%+ 空格、%+ 特殊符号。
-
2. Unicode/UTF编码绕过
-
原理:早期WAF可能未覆盖全部Unicode编码标准,或者数据库/系统进行了编码转换。
-
案例:
-
%u0069=i -
union->un%u0069on -
IIS特有:
%u0069在IIS中会被解析为i。
-
3. 二次解码绕过
-
场景:如果WAF只做一次URL解码,但后端服务器(如某些Tomcat配置)或程序会做两次解码。
-
手法:
%2527-> 第一次解码变成%27(WAF看到的是%27,可能放行) -> 第二次解码变成'(单引号,攻击生效)。
第二部分:数据库特性与语法绕过 —— 欺骗WAF的“语法感”
这类方法利用特定数据库引擎的语法宽容性,插入WAF正则无法匹配的“噪音”。
1. 内联注释(MySQL专长)
-
标准:
/*!union*/。对MySQL是代码,对WAF是注释。 -
版本号伪装:
/*!50000union*/(指定版本执行)。
2. 空白符与分隔符替换
-
空格替换:
-
+(URL中是%20) -
/**/ -
%0A(换行)、%0C(换页)、%0D(回车)、%09(Tab)
-
-
特殊字符连接:
-
1.union(点号连接) -
id-1 union(减号连接) -
@符号:@`'union` (如你笔记中的Discuz绕过案例)
-
3. 关键字拆分
-
注释拆分:
UNI/**/ON SEL/**/ECT(MySQL) -
字符串拼接(MSSQL):
EXEC('ma'+'ster..x'+'p_cm'+'dsh'+'ell "net user"') -
HEX编码(MSSQL):将命令转为HEX,赋值给变量后执行。如你笔记中的
0x6e0065007400...绕过IDS检测。
4. 冷门函数/标签替代
-
报错注入:用
updatexml()、extractvalue()代替floor()。 -
延时注入:用
BENCHMARK()、WAITFOR DELAY代替sleep()。 -
XSS:用
<svg>、<details>、onmouseenter代替<script>和onerror。
第三部分:协议层与逻辑层绕过 —— 攻击WAF的“盲区”
这类方法针对WAF作为HTTP中间件的固有缺陷。
1. 参数污染 (HPP - HTTP Parameter Pollution)
-
核心:同参数名出现多次,不同容器解析结果不同。
-
ASP/ASP.NET:
-
?id=1&id=2-> 解析为1,2 -
绕过案例:将完整的注入语句拆分为
?id=UNION SELECT 1&id=FROM admin,WAF检测第一段无害,但后端合并为UNION SELECT 1,FROM admin。
-
-
PHP/Apache:
-
通常取最后一个值。可以给WAF看第一个无害的值,给后端传最后一个有害的值。
-
-
Tomcat:
-
通常取第一个值。与PHP相反,需要针对性调整。
-
2. 请求方法/协议差异
-
Method替换:将GET改为POST(POST的检测规则可能较松)。
-
协议降级:使用HTTP/1.0代替HTTP/1.1,有些WAF对老协议支持不完善。
-
COOKIE注入:将注入点从GET/POST参数移到Cookie头,早期WAF忽略Cookie检测。
3. 数据包分块与溢出
-
分块传输:
-
原理:使用
Transfer-Encoding: chunked将恶意Payload拆分成多块发送。WAF可能需要缓存所有块才能检测,而后端服务器可以实时处理。 -
绕过:在分块中插入随机长度,扰乱WAF的拼接还原。
-
-
缓冲区溢出:
-
原理:发送超长数据包(如几MB的垃圾数据+少量Payload),耗尽WAF的检测资源或触发其“跳过检测”的保护机制。
-
4. 伪静态与路径混淆
-
PATH_INFO:
-
http://target.com/index.php/news/1实际执行index.php,参数是/news/1。 -
WAF可能只检测
index.php后的标准参数,忽略PATH_INFO部分。
-
-
URL重写:
-
利用复杂的URL重写规则,将攻击参数隐藏在看似无害的路径中。
-
第四部分:身份伪装与信任利用 —— 假扮“好人”
这类方法让WAF将攻击流量误判为合法流量。
1. 搜索引擎爬虫伪造
-
手法:修改
User-Agent为Googlebot、Baiduspider、Bingbot。 -
原因:大多数网站为了SEO,不会拦截搜索引擎抓取,WAF通常配置了爬虫白名单。
2. 白名单路径/文件利用
-
场景:某些后台路径(如
/admin、/include)或静态文件类型(.js、.css、.jpg)可能不在WAF检测范围内。 -
手法:将攻击文件伪装成图片上传,或寻找包含漏洞的文件路径发起攻击。
第五部分:案例分析 —— 经典绕过复盘
案例1:Discuz! X2.5 绕过
-
目标:绕过
_do_query_safe()函数。 -
手法演变:
-
首次绕过:
@`'union select`... 利用反引号和@符号混淆。 -
二次修补后:
@`'or @\'union select... 通过引入额外的 ``'`` 来隐藏和替换@符号,继续绕过。
-
-
启示:特定CMS的内置防护往往存在逻辑死角,需要深入理解其过滤函数的实现。
案例2:智创防火墙 + IIS 组合绕过
-
目标:智创专业级防火墙。
-
手法:
SEL%E%CT。 -
分析:防火墙在网络层解码后没匹配到
select。数据包到达IIS的asp.dll时,%E%被过滤,变成了select。 -
启示:中间件特性 > WAF规则。这是最经典的“底层特性绕过上层防护”案例。
案例3:早期安全狗绕过
-
手法:
-
NULL字节截断:
%00.插入在参数前,导致WAF解析参数时被截断,无法检测后续的SQL语句。 -
参数污染:
?id=1&id=1/**/union/**/select...利用重复参数混淆。
-
总结:WAF绕过的进化趋势与防御建议
攻击者视角的“绕过公式”
一个高级的绕过Payload通常是多种基础手法的组合:绕过 = 编码混淆 + 特性注释 + 参数拆分 + 身份伪装
例如:User-Agent: Googlebot + GET /news.php?id=1%20/*!50000union*/%0Ase%lect%201,2
防御者视角的建议
-
语义分析:不再依赖正则匹配关键词,而是分析SQL语句的抽象语法树(AST),识别出“用户输入”是否变成了“代码逻辑”。
-
归一化处理:在检测前,对所有输入进行彻底的、与后端一致的解码和标准化(包括URL解码、Unicode归一化、注释移除等)。
-
中间件特性适配:针对IIS、Nginx、Apache的不同解析特性,定制对应的防御策略。
-
行为基线:对API的访问频率、参数类型建立基线,识别异常(如大量分块传输、超长数据包)。
这份总结希望能帮你把零散的技巧构建成系统的知识体系。WAF绕过是攻防双方不断博弈的过程,理解这些底层原理比记忆具体Payload更有价值。
更多推荐
所有评论(0)