sa-akhavani/waffled
GitHub: sa-akhavani/waffled
WAFFLED 是一个通过 HTTP 请求模糊测试自动发现 WAF 解析差异并检测绕过路径的安全研究工具,附带论文数据集与多框架 Echo 服务器。
Stars: 22 | Forks: 3
# WAFFLED:利用解析差异绕过 Web 应用防火墙
本仓库包含了与以下论文相关的数据集和源代码:
“WAFFLED:利用解析差异绕过 Web 应用防火墙”,
该论文已被 ACSAC 2025 会议录用。
论文可通过[此处](https://akhavani.net/publications/waffled.pdf)访问。如果您打算使用本仓库,请考虑使用以下 BibTeX 引用本论文:
```
@INPROCEEDINGS{acsac2025waffled,
title={WAFFLED: Exploiting Parsing Discrepancies to Bypass Web Application Firewalls},
author={Ali Akhavani, Seyed and Jabiyev, Bahruz and Kallus, Ben and Topcuoglu, Cem and Bratus, Sergey and Kirda, Engin},
booktitle={2025 IEEE Annual Computer Security Applications Conference (ACSAC)},
year={2025},
volume={},
number={},
pages={689-702},
keywords={Cloud computing;Firewalls (computing);Fuzzing;Logic gates;Information filters;HTTP;Usability;Protection;Standards;Payloads;Web Security;Web Application Firewalls;Fuzzing;HTTP;Parsing Discrepancies;Request Smuggling;WAF Evasion},
doi={10.1109/ACSAC67867.2025.00062}
}
```
## 概述
通过本仓库的内容,我们旨在为社区和 WAF 供应商
提供一个工具,以针对不同 content-type 严格测试其产品是否存在解析差异。
我们还提供了我们在流行 WAF 中发现的绕过方法的数据集(已脱敏)。
代码库包括:
- 一个 HTTP/1.1 fuzzer,用于生成具有不同 content-type 的请求。
- 用于 fuzzer 的多个语法,以测试每种 content-type 和 RFC 的不同特性。
- 一个解析器,用于从 fuzzer 输出中提取生成的请求结果。
- Echo 服务器,用于测试 WAF 背后的 Web 应用程序能否正确解析请求 payload。
- HTTP 请求中继,以二进制字符串格式将 http 请求转发到目标,而不进行任何修改。
- 在流行 WAF 中发现的绕过方法数据集(已脱敏)。
- HTTP Normalizer,用于规范化(净化)或阻止格式错误的 HTTP 请求。
## Content-Types
我们在实验中重点关注以下 content-type:
- application/json
- multipart/form-data
- application/xml
- application/x-www-form-urlencoded
fuzzer 中为每种 content-type 提供了多种语法,以测试每种 content-type 和 RFC 的不同特性。查看 `fuzzer-grammar` 目录了解更多详情。
您可以通过在 fuzzer 中为其添加自定义语法来测试任何其他 content-type。
## 攻击 Payload
实验中可以使用任何攻击 payload,因为 waffled 不会触碰攻击 payload。
它仅修改请求结构。如果您正在测试 WAF,请确保这些攻击 payload 在正常请求中发送时会被 WAF 检测到。
我们在实验中使用了两个简单的攻击 payload,它们被大多数 WAF 的默认规则集阻止。
这些被硬编码在 Echo 服务器的 Dockerfile 中,并将作为名为 `ATTACK_PAYLOAD` 的环境变量传递给 Web 应用。
- XSS Payload:
```
```
- SQL Injection Payload:
```
' and 1=1 --
```
## Echo 服务器
我们为以下 Web 服务器提供了 Echo 服务器基础设施和代码:
- PHP Laravel
- Java Spring Boot
- Python Flask
- Python FastAPI
- Node.js Express
- Golang Gin
- Node.js HTTP JSON
- Node.js HTTP Multipart
这些 Echo 服务器将解析请求体,并以 JSON 格式在响应中返回解析的内容。
此外,它们将检查解析的内容中是否存在攻击 payload。
如果找到攻击 payload,它们会在响应中添加 `success: 1`。
否则,它们的响应中将包含 `success: 0`。
您可以在 `echo-servers` 目录的 README 中找到有关 api endpoint 以及如何运行它们的详细信息。
## HTTP 请求中继
要手动测试请求,您可以使用 HTTP 请求中继以二进制字符串格式将 http 请求转发到目标,而不进行任何修改。
有关中继的更多详细信息以及如何使用它,可以在 `http-request-relay` 目录的 README 中找到。
_重要提示_:请勿使用 `curl` 或任何其他 HTTP 客户端将生成的请求发送到 WAF 或 Echo 服务器,因为它们在将请求发送到目标之前会修改请求。
## PublicWWW 数据集与研究
我们发现许多框架和库使用相同的 api 或函数来解析 `multipart/form-data` 和 `application/x-www-form-urlencoded` content-type。
这可能会导致令人担忧的攻击:网站期望收到 `application/x-www-form-urlencoded` content-type 的请求,但攻击者使用相同的 api 并利用已知的 `multipart/form-data` content-type 绕过方法发送请求,而目标网站在不知道其 Web 服务器接受该 content-type 的情况下接受了该请求。
该数据集用于研究 multipart/form-data 和 x-www-form-urlencoded 的可互换 content-type。
这是通过搜索著名网站的忘记密码表单实现的。
## HTTP Normalizer
文档编写中。
## 待办事项:
- 更新 README 以提供更多详细信息
- 将 t-reqs 分支 Dockerize
- 更新 HTTP-Normalizer 文档
## 如何贡献
我们欢迎社区做出贡献以增强本仓库的功能。
您可以通过以下几种方式做出贡献:
- 为不同的 content-type 添加更多语法,并测试每种 content-type 和 RFC 的不同特性。
- 自动移除共享相同绕过根本原因的 mutation。
(例如,如果 2 个绕过之间共享一个 mutation 字符串,则数据集中应仅保留其中一个。)
目前,这是通过手动分析绕过及其 mutation 字符串来完成的。
- 为不同的 Web 框架和语言添加更多 Echo 服务器。
- 为 Echo 服务器提供 HTTP/2 支持,并使用新的 fuzzer。
- 使用绕过数据库对目标网站的 WAF 和 Web 框架进行自动指纹识别。
## 重要免责声明:
本仓库中提供的任何代码、数据集或信息仅供测试、教育和研究用途。
我们强烈反对在任何可能造成损害或破坏的环境中使用所提供的任何材料,
包括任何不属于您的生产系统。
作者对任何滥用本仓库所提供信息的行为概不负责。
标签:CISA项目, DNS 反向解析, HTTP解析, WAF绕过, Web安全, 蓝队分析, 请求拦截, 逆向工具