企业级WAF绕过技术深度研究
字数 4546 2025-10-13 22:56:21

企业级WAF绕过技术深度研究教学文档

一、 前言

Web应用防火墙(WAF) 是现代企业安全架构的核心组件,用于防御SQL注入、XSS、RCE等常见Web攻击。本教学文档旨在深度解析WAF的工作机制,并系统性地阐述当前最有效的绕过技术,为安全研究人员和渗透测试工程师提供技术参考。绕过的核心在于利用WAF与后端应用在处理HTTP请求时产生的解析差异

二、 WAF工作原理与检测机制

2.1 WAF架构与部署模式

企业级WAF主要有三种部署模式:

  1. 网络型WAF

    • 部署:位于网络边界,作为硬件设备或专用服务器。
    • 特点:保护整个网络内的所有Web应用。
    • 代表产品:F5 BIG-IP ASM, Imperva SecureSphere。
  2. 主机型WAF

    • 部署:以软件形式直接安装在Web服务器上。
    • 特点:仅保护所在服务器的应用,资源消耗小。
    • 代表产品:ModSecurity, NAXSI。
  3. 云托管WAF

    • 部署:作为SaaS服务提供,由云服务商管理。
    • 特点:易于部署和维护,保护任意位置的Web应用。
    • 代表产品:Cloudflare WAF, AWS WAF, Azure WAF, Akamai。
2.2 核心检测机制

现代WAF采用多层检测机制,形成纵深防御:

  1. 基于签名的检测

    • 原理:维护一个已知攻击模式(如特定字符串、正则表达式)的数据库,将传入请求的各个部分(URL、头部、主体)与签名库进行匹配。
    • 优势:对已知攻击检测准确率高、效率高、误报率低。
    • 示例规则如果URL参数"user_input"包含 "UNION SELECT",则阻断。
  2. 基于规则的过滤

    • 负向安全模型(黑名单):定义明确的恶意模式,默认允许所有流量,仅阻止匹配规则的请求。配置简单,但容易被新型攻击绕过。
    • 正向安全模型(白名单):定义合法的请求模式,默认拒绝所有流量,仅允许符合规则的请求。安全性极高,但配置和维护非常复杂。
  3. 异常检测

    • 原理:通过学习正常流量的基线(如参数长度、类型、频率),识别偏离该基线的异常请求。
    • 优势:有能力检测未知的(0day)攻击。
  4. 基于AI/ML的检测

    • 原理:使用机器学习模型(如随机森林、神经网络)对海量流量数据进行训练,从而对实时请求进行恶意性分类。
    • 优势:能够检测复杂、变形的攻击,并具备持续学习能力。

三、 主流企业级WAF产品与规则集

3.1 主流产品概览
WAF产品 厂商 部署类型 核心规则集
Cloudflare WAF Cloudflare 托管规则 + OWASP CRS
AWS WAF Amazon AWS托管规则 + OWASP CRS
Azure WAF Microsoft DRS 2.1 (基于CRS 3.2)
F5 BIG-IP ASM F5 Networks 网络/虚拟 快速部署策略
ModSecurity OWASP 主机/网络 OWASP CRS
3.2 OWASP CRS核心规则集

OWASP CRS是业界最广泛使用的开源WAF规则集,是许多商业WAF的基础。

  • 覆盖攻击类型:SQLi, XSS, LFI/RFI, RCE, PHP注入,协议违规等。
  • 版本演进:CRS 3.x 被广泛使用,CRS 4.0 为下一代版本。
  • 偏执等级:提供1-4级(PL1-PL4)安全等级,等级越高,检测越严格,误报也可能越高。

四、 WAF绕过的核心原理:解析差异

所有高级绕过技术都基于一个根本原理:WAF与后端Web服务器/应用程序对HTTP请求的解析方式存在差异。攻击者精心构造的请求可能被WAF认为是合法的,但被后端解析后却执行了恶意操作。

4.1 HTTP解析差异
  • 场景示例:Content-Type

    • 攻击:WAF可能只严格检查application/x-www-form-urlencoded类型的数据,但后端应用可能同时接受multipart/form-data。将恶意载荷放在multipart请求中可能直接绕过检测。
    • Payload:
      POST /api/search HTTP/1.1
      Content-Type: multipart/form-data; boundary=----Boundary
      
      ------Boundary
      Content-Disposition: form-data; name="query"
      
      ' UNION SELECT password FROM users
      ------Boundary--
      
  • 场景示例:重复参数处理

    • 问题:对于GET /search?q=safe&q=malicious,不同后端技术栈处理方式不同。
    • 差异:
      技术栈 处理方式
      PHP 使用最后一个值 (malicious)
      ASP.NET 用逗号连接所有值 (safe,malicious)
      Java Servlet 返回数组
      Python Flask 使用第一个值 (safe)
    • 绕过:如果WAF只检查第一个q=safe(安全),而后端PHP使用最后一个q=malicious(恶意),则攻击成功。
4.2 归一化不一致

WAF和后端在应用规则前,都需要对请求进行归一化处理(如URL解码、路径规范化),如果逻辑不一致,会产生绕过。

  • URL编码层级

    • 攻击%253Cscript%253E (双重编码)
    • WAF解码一次%3Cscript%3E (看起来无害)
    • 后端再次解码<script> (恶意代码执行)
  • Unicode归一化

    • 攻击\u003Cscript\u003E
    • 后端解码<script>
  • 路径规范化

    • 攻击/path/./to/../file.php
    • WAF可能不处理:按原路径检查
    • 后端规范化为/path/file.php,可能绕过基于路径的规则。

五、 高级WAF绕过技术详解

5.1 编码与混淆技术

这是一个庞大的技术矩阵,旨在破坏签名的匹配。

  1. URL编码变种:

    • 单次编码:< -> %3C
    • 双重编码:< -> %253C
    • 混合编码:<script> -> %3Cscr%69pt%3E
    • 大小写变种:%3c%3C
  2. Unicode编码:

    • JavaScript: \u003Cscript\u003E, \u{3c}script\u{3e}
    • HTML Entity: &lt;script&gt;, &#60;script&#62;, &#x3C;script&#x3E;
    • UTF-7: +ADw-script+AD4-
  3. SQL注入编码:

    • 十六进制: SELECT -> 0x53454C454354
    • 字符函数: CHAR(83,69,76,69,67,84)
    • 注释分割: SEL/**/ECT
    • 空白字符: SELECT%09*%0AFROM%0Dusers (使用Tab, 换行符等)
  4. 字符集利用:

    • 针对IIS/ASP.NET,使用不常见的字符集(如IBM037)对载荷进行编码,后端支持解码而WAF不支持。
    • 示例:将 id='union select * from users-- 编码为 %89%84=%7D%A4%95%89%96%95...
5.2 HTTP请求走私

这是一种利用代理服务器(或WAF)与后端服务器对请求边界解析不一致的技术,将恶意请求"隐藏"在正常请求中送达后端。

  • 核心Content-Length (CL) 头和 Transfer-Encoding: chunked (TE) 头的优先级冲突。

  • 类型:

    1. CL.TE走私:前端认CL,后端认TE。

      POST / HTTP/1.1
      Host: vulnerable.com
      Content-Length: 6
      Transfer-Encoding: chunked
      
      0
      
      G
      
      • 前端看到CL=6,读取0\r\n\r\nG后认为请求结束。
      • 后端使用TE,读到0\r\n\r\n(块结束标志)后停止,剩余的G被当作下一个请求的开始,从而走私了一个G开头的请求。
    2. TE.CL走私:前端认TE,后端认CL。

    3. TE.TE走私:通过混淆Transfer-Encoding头(如添加空格、制表符、额外头等),造成前后端解析差异。

  • 危害:绕过WAF检测、缓存投毒、会话劫持等。

5.3 HTTP参数污染

利用后端对多个同名参数的处理特性进行绕过。

  • ASP.NET示例:ASP.NET会将同名参数的值用逗号连接。

    • 攻击/?q=1'&q=alert(1)&q='2
    • 后端结果q = "1',alert(1),'2"
    • 在JS上下文中var query = '1', alert(1), '2'; 逗号操作符会执行alert(1)
  • PHP示例:PHP默认使用最后一个参数值。

    • 攻击/?id=safe&id=malicious
    • WAF检查id=safe (安全)
    • PHP使用id=malicious (恶意)
5.4 基于Content-Type的绕过
  1. JSON-Based SQL注入

    • 背景:研究发现许多WAF对JSON语法支持不完善。
    • 绕过:将恶意SQL隐藏在JSON函数调用中。
    • 示例
      • 标准SQLi被阻:' UNION SELECT ... --
      • JSON绕过:' OR JSON_LENGTH("{}") <= 8896 UNION SELECT @@version#
      • MySQL:' OR JSON_EXTRACT('{"a":"<script>"}','$.a')--
  2. Multipart/Form-Data解析差异

    • Boundary参数延续 (RFC 2231)
      Content-Type: multipart/form-data; boundary=fake-boundary; boundary*0=real-; boundary*1=boundary
      
      • WAF使用第一个boundary=fake-boundary
      • 后端拼接参数值,得到boundary=real-boundary
      • 攻击者可以将恶意载荷放在real-boundary部分,而将无害内容放在fake-boundary部分以欺骗WAF。
  3. XML外部实体注入绕过

    • 添加额外字段或属性。
    • 混淆DOCTYPE声明结构。
    • 移除或修改Content-Type头,诱使后端以XML解析非XML内容。
5.5 协议层绕过
  • 利用HTTP协议规范中的模糊性或不同实现之间的差异。
  • 例如,使用非标准的换行符、畸形的头部字段、特定的字符集编码等,造成WAF解析失败或误判,而后端能够容错处理。

六、 总结与建议

对于攻击者(红队/渗透测试)

  • WAF绕过是一个持续的过程,需要深刻理解目标WAF的特性和后端技术栈。
  • 模糊测试是发现新解析差异的有效手段。
  • 结合多种技术(如走私+编码)可以大大提高绕过成功率。

对于防御者(蓝队)

  • WAF不是银弹,它只是纵深防御体系中的一层。
  • 尽可能采用正向安全模型(白名单)
  • 定期更新WAF规则集(如OWASP CRS)。
  • 对WAF和设备进行严格的配置审计和测试,模拟攻击以验证其有效性。
  • 日志监控与分析至关重要,需要能够识别绕过WAF的潜在攻击行为。

企业级WAF绕过技术深度研究教学文档 一、 前言 Web应用防火墙(WAF) 是现代企业安全架构的核心组件,用于防御SQL注入、XSS、RCE等常见Web攻击。本教学文档旨在深度解析WAF的工作机制,并系统性地阐述当前最有效的绕过技术,为安全研究人员和渗透测试工程师提供技术参考。绕过的核心在于利用WAF与后端应用在处理HTTP请求时产生的 解析差异 。 二、 WAF工作原理与检测机制 2.1 WAF架构与部署模式 企业级WAF主要有三种部署模式: 网络型WAF : 部署 :位于网络边界,作为硬件设备或专用服务器。 特点 :保护整个网络内的所有Web应用。 代表产品 :F5 BIG-IP ASM, Imperva SecureSphere。 主机型WAF : 部署 :以软件形式直接安装在Web服务器上。 特点 :仅保护所在服务器的应用,资源消耗小。 代表产品 :ModSecurity, NAXSI。 云托管WAF : 部署 :作为SaaS服务提供,由云服务商管理。 特点 :易于部署和维护,保护任意位置的Web应用。 代表产品 :Cloudflare WAF, AWS WAF, Azure WAF, Akamai。 2.2 核心检测机制 现代WAF采用多层检测机制,形成纵深防御: 基于签名的检测 : 原理 :维护一个已知攻击模式(如特定字符串、正则表达式)的数据库,将传入请求的各个部分(URL、头部、主体)与签名库进行匹配。 优势 :对已知攻击检测准确率高、效率高、误报率低。 示例规则 : 如果URL参数"user_input"包含 "UNION SELECT",则阻断。 基于规则的过滤 : 负向安全模型(黑名单) :定义明确的恶意模式,默认允许所有流量,仅阻止匹配规则的请求。配置简单,但容易被新型攻击绕过。 正向安全模型(白名单) :定义合法的请求模式,默认拒绝所有流量,仅允许符合规则的请求。安全性极高,但配置和维护非常复杂。 异常检测 : 原理 :通过学习正常流量的基线(如参数长度、类型、频率),识别偏离该基线的异常请求。 优势 :有能力检测未知的(0day)攻击。 基于AI/ML的检测 : 原理 :使用机器学习模型(如随机森林、神经网络)对海量流量数据进行训练,从而对实时请求进行恶意性分类。 优势 :能够检测复杂、变形的攻击,并具备持续学习能力。 三、 主流企业级WAF产品与规则集 3.1 主流产品概览 | WAF产品 | 厂商 | 部署类型 | 核心规则集 | | :--- | :--- | :--- | :--- | | Cloudflare WAF | Cloudflare | 云 | 托管规则 + OWASP CRS | | AWS WAF | Amazon | 云 | AWS托管规则 + OWASP CRS | | Azure WAF | Microsoft | 云 | DRS 2.1 (基于CRS 3.2) | | F5 BIG-IP ASM | F5 Networks | 网络/虚拟 | 快速部署策略 | | ModSecurity | OWASP | 主机/网络 | OWASP CRS | 3.2 OWASP CRS核心规则集 OWASP CRS是业界最广泛使用的开源WAF规则集,是许多商业WAF的基础。 覆盖攻击类型 :SQLi, XSS, LFI/RFI, RCE, PHP注入,协议违规等。 版本演进 :CRS 3.x 被广泛使用,CRS 4.0 为下一代版本。 偏执等级 :提供1-4级(PL1-PL4)安全等级,等级越高,检测越严格,误报也可能越高。 四、 WAF绕过的核心原理:解析差异 所有高级绕过技术都基于一个根本原理: WAF与后端Web服务器/应用程序对HTTP请求的解析方式存在差异 。攻击者精心构造的请求可能被WAF认为是合法的,但被后端解析后却执行了恶意操作。 4.1 HTTP解析差异 场景示例:Content-Type 攻击 :WAF可能只严格检查 application/x-www-form-urlencoded 类型的数据,但后端应用可能同时接受 multipart/form-data 。将恶意载荷放在 multipart 请求中可能直接绕过检测。 Payload : 场景示例:重复参数处理 问题 :对于 GET /search?q=safe&q=malicious ,不同后端技术栈处理方式不同。 差异 : | 技术栈 | 处理方式 | | :--- | :--- | | PHP | 使用 最后一个 值 ( malicious ) | | ASP.NET | 用逗号 连接 所有值 ( safe,malicious ) | | Java Servlet | 返回 数组 | | Python Flask | 使用 第一个 值 ( safe ) | 绕过 :如果WAF只检查第一个 q=safe (安全),而后端PHP使用最后一个 q=malicious (恶意),则攻击成功。 4.2 归一化不一致 WAF和后端在应用规则前,都需要对请求进行归一化处理(如URL解码、路径规范化),如果逻辑不一致,会产生绕过。 URL编码层级 : 攻击 : %253Cscript%253E (双重编码) WAF解码一次 : %3Cscript%3E (看起来无害) 后端再次解码 : <script> (恶意代码执行) Unicode归一化 : 攻击 : \u003Cscript\u003E 后端解码 : <script> 路径规范化 : 攻击 : /path/./to/../file.php WAF可能不处理 :按原路径检查 后端规范化为 : /path/file.php ,可能绕过基于路径的规则。 五、 高级WAF绕过技术详解 5.1 编码与混淆技术 这是一个庞大的技术矩阵,旨在破坏签名的匹配。 URL编码变种 : 单次编码: < -> %3C 双重编码: < -> %253C 混合编码: <script> -> %3Cscr%69pt%3E 大小写变种: %3c 与 %3C Unicode编码 : JavaScript: \u003Cscript\u003E , \u{3c}script\u{3e} HTML Entity: &lt;script&gt; , &#60;script&#62; , &#x3C;script&#x3E; UTF-7: +ADw-script+AD4- SQL注入编码 : 十六进制: SELECT -> 0x53454C454354 字符函数: CHAR(83,69,76,69,67,84) 注释分割: SEL/**/ECT 空白字符: SELECT%09*%0AFROM%0Dusers (使用Tab, 换行符等) 字符集利用 : 针对IIS/ASP.NET,使用不常见的字符集(如IBM037)对载荷进行编码,后端支持解码而WAF不支持。 示例 :将 id='union select * from users-- 编码为 %89%84=%7D%A4%95%89%96%95... 。 5.2 HTTP请求走私 这是一种利用代理服务器(或WAF)与后端服务器对请求边界解析不一致的技术,将恶意请求"隐藏"在正常请求中送达后端。 核心 : Content-Length (CL) 头和 Transfer-Encoding: chunked (TE) 头的优先级冲突。 类型 : CL.TE走私 :前端认CL,后端认TE。 前端看到CL=6,读取 0\r\n\r\nG 后认为请求结束。 后端使用TE,读到 0\r\n\r\n (块结束标志)后停止,剩余的 G 被当作 下一个请求 的开始,从而走私了一个 G 开头的请求。 TE.CL走私 :前端认TE,后端认CL。 TE.TE走私 :通过混淆 Transfer-Encoding 头(如添加空格、制表符、额外头等),造成前后端解析差异。 危害 :绕过WAF检测、缓存投毒、会话劫持等。 5.3 HTTP参数污染 利用后端对多个同名参数的处理特性进行绕过。 ASP.NET示例 :ASP.NET会将同名参数的值用逗号连接。 攻击 : /?q=1'&q=alert(1)&q='2 后端结果 : q = "1',alert(1),'2" 在JS上下文中 : var query = '1', alert(1), '2'; 逗号操作符会执行 alert(1) 。 PHP示例 :PHP默认使用 最后 一个参数值。 攻击 : /?id=safe&id=malicious WAF检查 : id=safe (安全) PHP使用 : id=malicious (恶意) 5.4 基于Content-Type的绕过 JSON-Based SQL注入 : 背景 :研究发现许多WAF对JSON语法支持不完善。 绕过 :将恶意SQL隐藏在JSON函数调用中。 示例 : 标准SQLi被阻: ' UNION SELECT ... -- JSON绕过: ' OR JSON_LENGTH("{}") <= 8896 UNION SELECT @@version# MySQL: ' OR JSON_EXTRACT('{"a":"<script>"}','$.a')-- Multipart/Form-Data解析差异 : Boundary参数延续 (RFC 2231) : WAF使用第一个 boundary=fake-boundary 。 后端拼接参数值,得到 boundary=real-boundary 。 攻击者可以将恶意载荷放在 real-boundary 部分,而将无害内容放在 fake-boundary 部分以欺骗WAF。 XML外部实体注入绕过 : 添加额外字段或属性。 混淆DOCTYPE声明结构。 移除或修改 Content-Type 头,诱使后端以XML解析非XML内容。 5.5 协议层绕过 利用HTTP协议规范中的模糊性或不同实现之间的差异。 例如,使用非标准的换行符、畸形的头部字段、特定的字符集编码等,造成WAF解析失败或误判,而后端能够容错处理。 六、 总结与建议 对于攻击者(红队/渗透测试) : WAF绕过是一个持续的过程,需要深刻理解目标WAF的特性和后端技术栈。 ​ 模糊测试 是发现新解析差异的有效手段。 结合多种技术(如走私+编码)可以大大提高绕过成功率。 对于防御者(蓝队) : WAF不是银弹 ,它只是纵深防御体系中的一层。 尽可能采用 正向安全模型(白名单) 。 定期更新WAF规则集(如OWASP CRS)。 对WAF和设备进行 严格的配置审计和测试 ,模拟攻击以验证其有效性。 日志监控与分析 至关重要,需要能够识别绕过WAF的潜在攻击行为。