wafw00f 的指纹。Go 的速度。原生流水线。
172 个 WAF 产品标识,基于 wafw00f 的指纹构建。
一个用于实时 HTTP 和离线保存响应分析的 Go CLI 和库。
快速开始 · 从 wafw00f 迁移 · 基准测试 · 文档
wafmeow 是一个用于 Go 中 WAF 检测的 wafw00f 替代品,基于上游项目的指纹工作构建。它将快速的 WAF 指纹识别引入并发、结构化的流水线,适合需要大规模检测 WAF 的团队。
jq、通知工具或数据库,
同时将人类可读的诊断信息保留在 stderr。# Set AUTHORIZED_DOMAIN to a domain you own or are authorized to test.
set -o pipefail
subfinder -d "${AUTHORIZED_DOMAIN:?set an authorized domain}" -silent |
httpx -silent |
wafmeow --target-file - --fast --jsonl --silent
此流水线使用 --fast 对每个发现的 URL 进行快速主动扫描。
对于已有的 httpx 响应导出文件,请使用
离线导入流水线。
使用 Go 1.26 或更新版本 构建,并使用已打安全补丁的工具链。发布构建 使用 Go 1.27.3。
git clone https://github.com/Lu1sDV/wafmeow.git
cd wafmeow
go build -o wafmeow ./cmd/wafmeow
./wafmeow --help
生产环境请使用通过发布验证门禁的版本。 v1.0.0 的下载包早于本源码树中的安全加固。
预编译二进制文件、Go 模块和 Homebrew 安装方式见 发布与安装:
go install github.com/Lu1sDV/wafmeow/v3/cmd/wafmeow@latest
brew install Lu1sDV/tap/wafmeow
/v3 的 Go 安装命令需要已发布的 v3 版本。在该版本发布之前,请从上述源代码检出目录进行构建;Homebrew 会继续安装最新发布的稳定版本。
# Use your own local HTTP server on port 8080.
./wafmeow --target http://127.0.0.1:8080 --fast
这会打印人类可读的结果。使用 --target / -t 指定一个 URL,并重复使用以指定多个 URL。使用 --target-file PATH 指定包含 URL 行的文件,或使用 --target-file - 从标准输入读取。
--input PATH 和 -I PATH 仍然是 --target-file PATH 的等价写法。
选择一个输入源;保存的响应用于离线分析时使用 --evidence。
| 目标 | 选择 | 采集 |
|---|---|---|
| 快速主动指纹识别 | --fast | 普通、无 user-agent 和组合探测 |
| 更广泛的主动探测 | --deep | 八种选定的请求类型;在未指定模式时也是默认值 |
| 仅检查普通响应 | --baseline | 一次普通请求,不进行主动探测 |
| 复用已保存的响应 | --evidence FILE | 离线分类,不发起新请求 |
--baseline 可以找到普通响应中已经存在的指纹。当你希望在不进行主动探测的情况下进行普通 HTTP 检查时使用它;它不是 --fast 或 --deep 的准备步骤。三种实时模式互斥,重定向和预算会影响实际请求数量。有关权衡取舍,请参阅
采集模式与载荷。
# Discover URLs, then send new wafmeow requests:
httpx -l authorized-hosts.txt -silent |
./wafmeow --target-file - --fast --jsonl --silent
# Classify exported responses without additional requests:
httpx -l authorized-hosts.txt -silent -json -irr -probe -rstr 1048576 -rsts 1048576 |
./wafmeow --evidence - --evidence-format httpx --jsonl --silent
导入器面向 httpx v1.12.0。导出的响应体缺少完整性证明:
内容匹配保持未知,而可信的状态码/响应头/cookie 证据可以
匹配。这不等同于主动获取或证明 WAF 不存在。
当上游进程失败必须导致 shell 管道失败时,使用 set -o pipefail。
编码、限制、局限与下游配方。
Go 库使用模块 github.com/Lu1sDV/wafmeow/v3。结果 JSON 使用
schema 1;模块版本与报告版本是相互独立的契约。
# targets.txt: one authorized URL per line.
./wafmeow --target-file targets.txt --fast --jsonl --output results.json --strict
--jsonl 将结果流式输出到 stdout;--output / -O 写入原子报告。
使用 .json、.jsonl、.csv 或 .txt 来选择其格式;其他文件名
生成 TXT。人类可读的诊断信息输出到 stderr。--strict 检查证据质量:
它在发布不完整、失败或已诊断的结果后以 2 退出,而不仅仅
因为匹配到 WAF。配置、输入和输出失败以 1 退出;
取消以 130 退出。报告包含结果,而非可重放的响应
捕获。参见输出契约和
速率与截止时间调优。
在这些历史测量中,更广泛的探测模式被称为 full;
现在它是 --deep。以下数据未因重命名而重新运行。
600 个活跃 HTTP/HTTPS 目标的中位耗时——500 个非 CDN 目标加上 100 个 从 Tranco 前 10,000 中采样的已知 CDN 目标——每种配置运行三次, 在 Hetzner Helsinki VPS(4 vCPU,7.6 GiB RAM)上完成, 日期为 2026 年 10 月 31 日。越低越好。
目标选择、完整 VPS 规格、方法论、历史运行和 离线一致性检查。
| Workers / processes | wafw00f 2.4.2 | Speedup fast | Speedup deep | ||
|---|---|---|---|---|---|
| 1 | 31m 38s | 7m 49s | 15m 50s | 4.04× | 2.00× |
| 5 | 6m 53s | 2m 18s | 3m 10s | 2.99× | 2.17× |
| 10 | 4m 47s | 1m 16s | 1m 35s | 3.79× | 3.03× |
| 50 | 1m 59s | 16.1s | 26.6s | 7.40× | 4.49× |
| 100 | 1m 52s | 9.0s | 21.9s | 12.45× | 5.12× |
在 100 workers/processes 下比较检测——600 个目标中,三次运行 的范围。