企业级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:
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--
- 攻击:WAF可能只严格检查
-
场景示例:重复参数处理
- 问题:对于
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:
<script>,<script>,<script> - UTF-7:
+ADw-script+AD4-
- JavaScript:
-
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。
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开头的请求。
- 前端看到CL=6,读取
-
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')--
- 标准SQLi被阻:
-
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。
- WAF使用第一个
- Boundary参数延续 (RFC 2231):
-
XML外部实体注入绕过:
- 添加额外字段或属性。
- 混淆DOCTYPE声明结构。
- 移除或修改
Content-Type头,诱使后端以XML解析非XML内容。
5.5 协议层绕过
- 利用HTTP协议规范中的模糊性或不同实现之间的差异。
- 例如,使用非标准的换行符、畸形的头部字段、特定的字符集编码等,造成WAF解析失败或误判,而后端能够容错处理。
六、 总结与建议
对于攻击者(红队/渗透测试):
- WAF绕过是一个持续的过程,需要深刻理解目标WAF的特性和后端技术栈。
- 模糊测试是发现新解析差异的有效手段。
- 结合多种技术(如走私+编码)可以大大提高绕过成功率。
对于防御者(蓝队):
- WAF不是银弹,它只是纵深防御体系中的一层。
- 尽可能采用正向安全模型(白名单)。
- 定期更新WAF规则集(如OWASP CRS)。
- 对WAF和设备进行严格的配置审计和测试,模拟攻击以验证其有效性。
- 日志监控与分析至关重要,需要能够识别绕过WAF的潜在攻击行为。