引言:绕过WAF的核心哲学

绕过WAF的本质,是在寻找 “三方解析之间的差异” :

  1. WAF的解析(规则库、正则表达式)

  2. Web服务器的解析(IIS/Apache/Nginx)

  3. 后端应用/数据库的解析(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 为 GooglebotBaiduspiderBingbot

  • 原因:大多数网站为了SEO,不会拦截搜索引擎抓取,WAF通常配置了爬虫白名单。

2. 白名单路径/文件利用

  • 场景:某些后台路径(如 /admin/include)或静态文件类型(.js.css.jpg)可能不在WAF检测范围内。

  • 手法:将攻击文件伪装成图片上传,或寻找包含漏洞的文件路径发起攻击。


第五部分:案例分析 —— 经典绕过复盘

案例1:Discuz! X2.5 绕过

  • 目标:绕过 _do_query_safe() 函数。

  • 手法演变

    1. 首次绕过@`'union select`... 利用反引号和@符号混淆。

    2. 二次修补后@`'or @\'union select... 通过引入额外的 ``'`` 来隐藏和替换@符号,继续绕过。

  • 启示:特定CMS的内置防护往往存在逻辑死角,需要深入理解其过滤函数的实现。

案例2:智创防火墙 + IIS 组合绕过

  • 目标:智创专业级防火墙。

  • 手法SEL%E%CT

  • 分析:防火墙在网络层解码后没匹配到select。数据包到达IIS的asp.dll时,%E%被过滤,变成了select

  • 启示中间件特性 > WAF规则。这是最经典的“底层特性绕过上层防护”案例。

案例3:早期安全狗绕过

  • 手法

    1. NULL字节截断%00. 插入在参数前,导致WAF解析参数时被截断,无法检测后续的SQL语句。

    2. 参数污染?id=1&id=1/**/union/**/select... 利用重复参数混淆。


总结:WAF绕过的进化趋势与防御建议

攻击者视角的“绕过公式”

一个高级的绕过Payload通常是多种基础手法的组合:
绕过 = 编码混淆 + 特性注释 + 参数拆分 + 身份伪装

例如:User-Agent: Googlebot + GET /news.php?id=1%20/*!50000union*/%0Ase%lect%201,2

防御者视角的建议

  1. 语义分析:不再依赖正则匹配关键词,而是分析SQL语句的抽象语法树(AST),识别出“用户输入”是否变成了“代码逻辑”。

  2. 归一化处理:在检测前,对所有输入进行彻底的、与后端一致的解码和标准化(包括URL解码、Unicode归一化、注释移除等)。

  3. 中间件特性适配:针对IIS、Nginx、Apache的不同解析特性,定制对应的防御策略。

  4. 行为基线:对API的访问频率、参数类型建立基线,识别异常(如大量分块传输、超长数据包)。

这份总结希望能帮你把零散的技巧构建成系统的知识体系。WAF绕过是攻防双方不断博弈的过程,理解这些底层原理比记忆具体Payload更有价值。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐