企业级 WAF 评估工具 — 真实的攻击载荷。真实的结果。符合合规要求的报告。
WAF 测试器通过向用户提供的 URL 发送真实攻击载荷,并报告这些载荷是否被拦截,从而评估 Web 应用防火墙(WAF)。提供 Windows 桌面应用(Electron)和可在任何地方运行的 Python CLI 两种形式。

此工具仅供授权的安全测试使用。 仅用于您拥有所有权或已获得明确书面许可的系统。 未经授权对第三方系统进行测试可能违反《计算机欺诈与滥用法》(CFAA)及您所在司法辖区的等效法律。 作者不对滥用行为承担任何责任。
| 套件 | 测试数量 | 覆盖内容 |
|---|---|---|
| OWASP / CWE 核心 | 44 | SQL 注入(12 种变体)、XSS(10 种变体)、路径遍历、命令注入、XXE、SSRF、Log4Shell、SSTI、开放重定向 |
| 速率限制 | 3 | 突发洪水攻击(30 并发)、顺序洪水攻击、X-Forwarded-For IP 旋转绕过 |
| 机器人检测 | 10 | sqlmap、Nikto、Nmap、Scrapy、Masscan、HeadlessChrome、python-requests、curl、空 User-Agent、缺少 Accept 头 |
| 绕过尝试 | 15 | 双重 URL 编码、Unicode 全角、空字节、大小写变换、注释混淆、CRLF 注入、Host 头注入、方法覆盖、路径技巧 |
| API 安全 | 10 | GraphQL 内省/批量/枚举、JWT none 算法及算法混淆、批量赋值、HTTP 动词篡改、BOLA、内容类型混淆 |
| 业务逻辑 | 8 | 负数数量、零价格提交、管理端点访问、HTTP 参数污染、账号枚举、过度数据暴露、强制浏览、权限提升 |
每项测试都标记了一个或多个合规框架:
HIGH、LIKELY 或 UNCERTAIN 评级,而非简单的通过/失败git clone https://github.com/kpomin57/waf-tester.git
cd waf-tester
npm install
npm start
npm run build
输出出现在 dist/ 目录下,包含一个 NSIS 安装程序和一个便携版 .exe 文件。目标机器上无需任何前置条件 — Electron 自带运行时。
一个单文件 Python 版本,可在任何安装了 Python 的环境中运行 — Linux 服务器、CI/CD 流水线、Docker 容器、WSL 或任何无法使用 Windows .exe 的环境。
pip install rich requests
python waf_tester.py --url https://target.example.com
运行全部 90 项测试,提示授权确认,在终端中打印彩色结果,并将 JSON 和 HTML 报告保存到当前目录。
# 运行所有套件
python waf_tester.py --url https://app.example.com
# 仅运行 OWASP 和 API 套件
python waf_tester.py --url https://app.example.com --suites owasp,api
# Bearer 令牌认证
python waf_tester.py --url https://app.example.com/api \
--auth-type bearer --auth-value eyJhbGciOiJIUzI1NiJ9...
# API 密钥认证
python waf_tester.py --url https://app.example.com/api \
--auth-type apikey --auth-header X-API-Key --auth-value mykey123
# 将报告保存到文件夹,跳过确认(CI/CD)
python waf_tester.py --url https://app.example.com \
--output-dir ./reports --confirm
# 仅终端输出 — 不保存文件
python waf_tester.py --url https://app.example.com --output terminal
# 通过 Burp Suite 路由流量
python waf_tester.py --url https://app.example.com --proxy http://127.0.0.1:8080
docker run --rm -v $(pwd)/reports:/reports \
python:3.12-slim sh -c \
"pip install rich requests -q && python waf_tester.py \
--url https://target.example.com \
--output-dir /reports --confirm"
- name: WAF 评估
run: |
pip install rich requests
python waf_tester.py \
--url ${{ secrets.WAF_TARGET_URL }} \
--suites owasp,api,bypass \
--output json \
--output-dir ./reports \
--confirm
- name: 上传报告
uses: actions/upload-artifact@v3
with:
name: waf-report
path: reports/
Python CLI 可以将所有测试流量通过 Burp Suite 路由,让您获得 WAF 测试器发送的每个载荷的完整 HTTP 历史记录。这对于手动检查请求和响应、微调载荷、排查意外的 WAF 行为,以及在有趣的结果上使用 Burp 自己的扫描器或 Repeater 非常有用。
Burp Suite 运行一个本地代理监听器(默认 127.0.0.1:8080)。当您将 WAF 测试器的代理环境变量指向该地址时,该工具发出的每个请求都会在到达目标之前经过 Burp。您可以在 Burp 的 HTTP 历史记录中看到每个载荷的完整请求和响应 — 状态码、头部、响应正文 — 与 WAF 看到的完全一致。
1. 启动 Burp Suite 并确认代理监听器已启用:
打开 Burp → Proxy → Proxy Settings → 确认监听器在 127.0.0.1:8080(如果端口不同请记下)。
2. 导出 Burp 的 CA 证书并信任它(一次性设置):
WAF 测试器连接 HTTPS 目标,因此 Burp 需要拦截 TLS。转到 Burp → Proxy → Proxy Settings → Import/Export CA Certificate → 导出为 DER。将其作为受信任的根 CA 安装到您的系统上,或者设置下面的环境变量以跳过验证(适合实验室环境,不适用于生产环境)。
3. 使用 --proxy 运行 WAF 测试器:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
在 Windows 上:
python waf_tester.py --url https://target.example.com --proxy http://127.0.0.1:8080
如果您愿意,也可以继续使用环境变量:
HTTPS_PROXY=http://127.0.0.1:8080 HTTP_PROXY=http://127.0.0.1:8080 \
python waf_tester.py --url https://target.example.com
4. 关闭 Burp 的拦截功能:
在 Burp → Proxy → Intercept 中,确保拦截已关闭 — 否则 Burp 会在每个请求上暂停,等待您手动转发,导致 WAF 测试器超时。您希望 Burp 被动记录流量,而不是拦截它。
5. 在 Burp 的 HTTP 历史记录中观察请求到达:
每个 WAF 测试器载荷都会作为一个单独的条目出现。您可以右键单击任何请求,将其发送到 Repeater 手动调整并重新发送,或发送到 Intruder 进行进一步模糊测试。
如果 Burp CA 证书不受信任,可以通过临时禁用工具中的 SSL 验证来添加 --no-verify 变通方法。或者,在系统范围内信任 Burp CA 证书,或使用 HTTP(而非 HTTPS)目标进行初始测试。
置信度级别:
HIGH — 明确拦截状态码(403、406、429),无歧义LIKELY — 响应正文中包含 WAF 关键词,或状态码与基线不同UNCERTAIN — 软拦截(400、503),可能是正常应用错误# Juice Shop(无 WAF — 预期全部绕过)
docker run -d -p 3000:3000 bkimminich/juice-shop
# ModSecurity 配合 OWASP CRS(预期大部分被拦截)
docker run -d -p 80:80 owasp/modsecurity-crs:nginx
waf-tester/
├── src/
│ ├── main.js # Electron 主进程 — 所有测试逻辑和 IPC
│ ├── preload.js # 安全上下文桥接
│ └── renderer/
│ ├── index.html # 应用外壳
│ ├── styles.css # 深色军事/SOC 用户界面主题
│ └── app.js # 用户界面逻辑、过滤器、实时信息流、导出
├── waf_tester.py # Python CLI — 单文件,无需配置
├── package.json
└── README.md
waf_tester.py)— 单文件,随处运行MIT — 详见 LICENSE。
专为需要超越复选框合规性的 WAF 验证的安全工程师打造。
| 标志 | 描述 | 默认值 |
|---|
--url | 目标 URL (必填) | — |
--suites | 要运行的套件(逗号分隔) | all |
--auth-type | none / bearer / apikey / cookie / basic | none |
--auth-value | 令牌、Cookie 字符串或 API 密钥值 | — |
--auth-header | API 密钥认证的头部名称 | X-API-Key |
--auth-user | 基本认证的用户名 | — |
--auth-pass | 基本认证的密码 | — |
--no-baseline | 禁用基线比较 | off |
--no-rotate-ua | 禁用 User-Agent 轮换 | off |
--waf-header | 发送 X-WAF-Tester 标识头部 | off |
--output | terminal、json、html(逗号分隔) | all three |
--output-dir | 保存报告文件的目录 | . |
--timeout | 每个请求的超时时间(秒) | 10 |
--proxy | 所有请求的代理 URL(例如 http://127.0.0.1:8080) | off |
--confirm | 跳过授权确认提示 | off |
| 得分 | 等级 | 含义 |
|---|
| 90–100% | A | 优秀 — WAF 几乎拦截了所有攻击向量 |
| 80–89% | B | 良好 — 存在少量值得调查的缺口 |
| 65–79% | C | 一般 — 存在明显的绕过向量 |
| 50–64% | D | 较差 — 存在显著的保护缺口 |
| < 50% | F | 严重 — WAF 基本无效 |