eniat/fuzzer
GitHub: eniat/fuzzer
一款集成爬虫与多种漏洞检测器的 Web 应用安全模糊测试工具,支持 XSS、SQL 注入和路径遍历的自动化发现与报告。
Stars: 0 | Forks: 0
# 用于 Web 漏洞测试的集成爬虫与 Fuzzer

Web fuzzing 工具包,包含**爬虫**(动态和静态)以及专注于**路径遍历**、**XSS**(参数、表单、存储型和 DOM)和 **SQL 注入**(基于报错/内容和盲注布尔/时间)的 fuzzer。
## 目录
- [功能](#features)
- [快速开始](#quick-start)
- [配置](#configuration)
- [CLI 使用](#cli-usage)
- [报告内容](#what-gets-reported)
- [基准测试结果](#benchmark-results)
- [截图](#screenshots)
- [性能建议](#performance-tips)
- [安全与使用注意事项](#security-and-usage-notes)
- [许可证](#license)
## 功能
- **爬虫优先工作流**(可选):自动发现 endpoint 和表单。
- **路径**测试套件:
- 带有递归探测 200 状态码和文件/扩展名保护的 fuzzer。
- 基于参数的 fuzzer。
- **XSS** 测试套件:
- 参数和表单反射型 XSS(token化 payload,反射探测)
- 存储型 XSS(提交后重访并带有稳定窗口)
- DOM XSS(Selenium headless,cookie 交接,DOM 探测)
- **SQLi** 测试套件:
- 基于报错/内容的检测
- 盲注(布尔差异 + 基于中位数和串行确认的时间盲注)
- **高度可配置**:并发池、超时、header、重定向策略、样本上限。
- **LLM 辅助 wordlist 过滤**(可选的基于 prompt 的过滤器)。
- **整洁的输出**:终端 + 可选的 JSON。跨发现结果的智能**重复折叠**。
- **便于身份验证**:支持 HTTP 基本认证 + Selenium 登录路径。
## 快速开始
### 前置条件
- Python **3.10+**
- Google Chrome(用于 DOM XSS)。Selenium ≥ **4.6** 会自动管理 ChromeDriver。
## 安装说明
Clone 该仓库并以可编辑(开发)模式安装:
```
git clone https://github.com/eniat/fuzzer fuzzer
cd fuzzer
python -m venv .venv && source .venv/bin/activate
pip install -U pip
pip install -e .
# CLI 入口点现在可以通过以下方式使用:
fuzz -h
```
## 运行与示例
### 完整自动运行
您可能需要根据 webapp 的登录页面修改选择器。可以在 default.yaml 中完成此操作。
```
selectors:
username_field: "login"
password_field: "password"
submit_name: "form"
```
按顺序运行爬虫和所有 fuzzer,包含身份验证和完整报告:
```
fuzz https://target.tld --auth --username user --password password --login-path /login.php --swordlist sql --xwordlist XSS-Jhaddix --pwordlist LFI-Jhaddix --all --use-crawler --report-all --output-to-file
```
运行流程:
1. 爬取 endpoint 和表单(默认 headless)。
2. 运行 **SQLi 盲注**、**SQLi 内容/报错**、**XSS 参数**、**XSS 表单**、**XSS DOM**、**XSS 存储型**、**路径遍历**,然后是**参数遍历**——按此顺序。
3. 对发现结果进行去重并打印;如果提供了标志,则输出可选的 JSON/文件。
### 专项运行
**仅路径遍历(带爬虫)**
```
fuzz https://target.tld --use-crawler --pwordlist LFI-Jhaddix --fuzz-paths --report-all
```
**XSS – 反射在 query 参数中(带爬虫)**
```
fuzz https://target.tld --use-crawler --xwordlist XSS-Jhaddix --xss-params
```
**XSS – 仅表单**
```
fuzz https://target.tld --use-crawler --xwordlist XSS-Jhaddix --xss-forms
```
**XSS – 存储型**
```
fuzz https://target.tld --use-crawler --xwordlist XSS-Jhaddix --xss-stored
```
**XSS – DOM(需要 Chrome)**
```
fuzz https://target.tld --use-crawler --xwordlist XSS-Jhaddix --xss-dom
```
**SQLi – 基于报错/内容**
```
fuzz https://target.tld --use-crawler --swordlist sql --fuzz-sqli
```
**SQLi – 盲注(布尔 + 带确认的时间盲注)**
```
fuzz https://target.tld --use-crawler --swordlist sql --fuzz-sqli-b
```
### 单 URL 模式(无爬虫)
当您**不**使用 `--use-crawler` 时,参数 fuzzer 期望在您的 URL query 中有一个 **`FUZZ` 占位符**:
**参数遍历(单 URL)**
```
fuzz "https://target.tld/download?file=FUZZ" --pwordlist LFI-Jhaddix --fuzz-params
```
**参数中的 XSS(单 URL)**
```
fuzz "https://target.tld/search?q=FUZZ" --xwordlist XSS-Jhaddix --xss-params
```
## 配置
所有运行时旋钮均来自 `get_cfg()`,该函数会合并默认值和本地覆盖。整个代码库中使用的关键区域:
```
http:
user_agent: "uni-fuzzer/0.1 (+https://example.local)"
add_referer: true
timeout_get_seconds: 5
timeout_post_seconds: 5
crawl_get: 5
crawl_post: 5
redirects:
baseline_get: true
baseline_post: true
fuzz_get: false
fuzz_post: false
stored_xss: True
submit: true
concurrency:
max_workers: 10
path_workers_recursive: 5
threads_per_session: 2
max_sessions_cap: 12
crawler:
mode_default: "both"
max_pages_default: 20
rate_limit_default: 0.2
headless_default: true
output_to_file_default: false
option_capacity: 80
xss:
dom_delay_seconds: 0.25
stored_settle_seconds: 3
regex:
script: ").)*({token})(?:(?!).)*"
attr: "\\bon\\w+\\s*=\\s*(['\\\"]).*?({token}).*?\\1"
jsurl: "(?:href|src)\\s*=\\s*(['\\\"])\\s*javascript:.*?({token}).*?\\1"
html_comment: ").)*{token}(?:(?!-->).)*-->"
raw_html: "(?:^|>)[^<]*{token}[^<]*(?:<|$)"
max_samples_per_group: 3
fuzz:
max_depth_default: 3
similarity_skip_threshold: 0.90
baseline_404_path: "/thisshouldnotexist143903458903527903452"
excluded_extensions: [".php", ".js", ".css", ".png", ".jpg", ".json"]
sqli:
max_samples_per_group: 3
timing_threshold_ms: 700
blind_timing_factor: 2.0
blind_time: 1
timeout_blind: 120
timing_baseline_probes: 3
timing_payload_trials: 2
timing_confirm_probes: 2
plain_preprobe_min_delta: 1
confirm_min_size_delta: 30
logging:
format: "%(asctime)s | %(levelname)-7s | %(name)s | %(message)s"
json_format: '{"ts":"%(asctime)s","level":"%(levelname)s","logger":"%(name)s","msg":"%(message)s","file":"%(filename)s","line":%(lineno)d}'
date_format: "%Y-%m-%d %H:%M:%S"
```
## CLI 使用
以下是最常用的标志:
- 目标与发现
- `--use-crawler`
- `--crawler-mode (static, dynamic)`
- `--max-pages N`
- `--rate-limit FLOAT`
- `--no-headless`(用于 Selenium 运行)
- Wordlist
- `--wordlist FILE`(用于所有的 fallback)
- `--pwordlist FILE`(路径/参数)
- `--xwordlist FILE`(XSS)
- `--swordlist FILE`(SQLi)
- `--llm "prompt text..."`(通过语义相似度过滤提供的 `--wordlist`)
- Fuzzer(选择特定项或使用 `--all` 按安全顺序运行)
- 路径:`--fuzz-paths`
- 参数:`--fuzz-params`
- XSS:`--xss-params`, `--xss-forms`, `--xss-stored`, `--xss-dom`
- SQLi:`--fuzz-sqli`(报错/内容),`--fuzz-sqli-b`(盲注)
- 所有:`--all`
- 输出与行为
- `--output-to-file`(同时将控制台输出保存到文件)
- `--output-to-json`(输出机器可读的 JSON)
- `--report-all`(包含“有趣的” 200 响应和潜在的 SQL)
- `--bail-on-hit`(在首次确认漏洞时提前停止特定线程)
- 认证
- `--auth --username USER --password PASS --login-path /login`
- 日志
- `--log` 启用日志;加上 `--log-level`, `--log-file`, `--log-console`, `--log-json`
## 报告内容
发现结果会被标准化,并通过 `collapseDuplicates` 进行去重。每个发现结果遵循一致的结构:
```
{
"type": "xss_form | xss_param | xss_stored | xss_dom | sqli_inj | sqli_blind | sqli_potential | path | param | interesting | interesting_200",
"url": "https://target.tld/some/path",
"method": "GET | POST",
"param": "q | id | ... (nullable)",
"payload": "' OR 1=1 --",
"indicator": "detected_sql_content | blind_sql_timing | dom_element_ctx | ...",
"status_code": 200,
"count": 1,
"payload_samples": ["..."],
"response_snippet": "..."
}
```
### 重复折叠规则(宏观)
- **存储型 XSS** 按 `(type, host, path, indicator)` 折叠,并限制 `payload_samples`。
- **路径/参数遍历**按标准化路径折叠。
- 保留组内观察到的**最高** `status_code`。计数和唯一样本会被聚合。
## 基准测试结果
此工具针对五个成熟的扫描器(OWASP ZAP, SQLMap, Dalfox, XSSer 和 wfuzz)进行了评估,测试平台是两个故意设计的脆弱应用程序,DVWA 和 bWAPP。每个工具都在完全相同且完全自动化的测试环境下运行:相同的爬取输入集、每次运行之间重置的容器化目标、每个工具在每个目标上运行三次,并通过手动重放对照文档记录的 ground truth 集合确认每个发现。
该评估专门测试了**无人值守、范围对齐的自动化**,而不是手动调整的单目标运行。这种设定对于理解下方数据至关重要,并在“为什么基线返回零”中进行了讨论。
### 有效性(F1,越高越好)
| 类别 | 目标 | 此工具 | 最佳基线 | 基线结果 |
|---|---|---|---|---|
| XSS | DVWA | **0.67** | 0.00 | ZAP / Dalfox / XSSer 均为 0 |
| XSS | bWAPP | **0.53** | 0.15 | Dalfox (precision 1.00, recall 0.08) |
| SQLi | DVWA | **0.80** | 0.00 | SQLMap / ZAP 均为 0 |
| SQLi | bWAPP | **0.55** | 0.00 | SQLMap / ZAP 均为 0 |
| 路径遍历 | DVWA | **1.00** | 0.00 | wfuzz / ZAP 均为 0 |
| 路径遍历 | bWAPP | **0.67** | 0.00 | wfuzz / ZAP 均为 0 |
此工具在每个类别和两个目标中都产生了确认的真阳性。
基线仅在表格的一个单元格中产生了确认的发现结果。
Recall 是针对完整记录的 ground truth 报告的,包括本项目范围之外的漏洞实例(基于 DOM 的执行、多步工作流)。针对该工具旨在检测的范围内子集,recall 更高,因此这些数据是保守的底线,而不是上限。
因为检测是由 wordlist 驱动的,recall 也受到 payload 覆盖范围的限制;基于变异的生成(未来的工作)将放宽这一限制。
### 基线表现更好的地方
在这里,诚实比横扫一切更重要。在 bWAPP XSS 上,**Dalfox 达到了完美的 precision (1.00),而此工具为 0.90**——它从未产生过假阳性。它是通过几乎不报告任何东西来做到这一点的:在 24 个 ground truth 中仅发现了 2 个,recall 为 0.08。此工具检测到了 9 个,以单个假阳性换取了高得多的 recall 和更好的 F1(0.53 对比 0.15)。您更喜欢哪种取决于您是要优化安静的报告还是覆盖率。
### 效率(每个已确认漏洞的时间)
原始运行时间具有误导性,因为最快的工具之所以快,部分原因在于它们什么也没发现。ZAP 在 38 秒内完成了 DVWA SQLi 运行,真阳性为零。每个真阳性所用的时间是更公平的衡量标准:
| 类别 | 目标 | 此工具 | TP > 0 的最快基线 |
|---|---|---|---|
| XSS | bWAPP | 0:15 | Dalfox, 5:00 |
| SQLi | bWAPP | 0:33 | 无 |
| XSS | DVWA | 0:41 | 无 |
此工具在绝对时间上很少是最快的,但它是唯一一个能足够快速地返回确认发现结果的工具,以至于运行时间具有实际意义。
### 为什么基线返回零
这是最重要的注意事项,阅读本节的内容比看表格更能让您了解情况。基线并不是在它们最强的单目标配置下运行的;它们是在自动化下跨整个应用程序运行的。在这些条件下:
- **Session 和认证处理占据主导。** 即使重复登录,cookie 和 session 在较长时间的运行中也会过期,从而切断基线与脆弱页面的联系。此工具的集成 session 管理是专门为应对这种情况而构建的,这在很大程度上解释了为什么它得分的地方基线却没有。
- **几个工具并不是为这种规模的、完全自动化的全应用程序扫描而设计的**,并且需要逐页调用,这限制了并发性。
- **严格的默认确认**抑制了一些基线中处于边缘的发现结果。
因此,这些结果应被解读为**“一个具有 session 处理功能的集成流水线,在无人值守、范围对齐的自动化下优于现成的扫描器”**,而不是声称此工具在绝对意义上是比 SQLMap 或 ZAP 更好的漏洞检测器。在给定单一目标和手动配置的情况下,专业工具很可能匹敌或胜过它。
### 这证明了什么
集成。一个跨越爬取、fuzz、确认和报告的 pipeline,加上共享的 session 状态,以适中的运行时间成本和可追溯到特定、文档化原因的假阳性,显著提高了跨多个漏洞类别的*实际*自动化覆盖率。
## 截图
爬虫发现。该工具进行身份验证,启动 headless 浏览器并映射目标的攻击面(在本地 bWAPP 实例上有 110 个 endpoint,99 个表单)。

实时发现结果。在 fuzzer 运行时将确认的漏洞打印到控制台,这里是通过布尔和时间指标检测到的盲注 SQL injection。

爬虫输出。发现的 endpoint 和表单被标准化为 fuzzer 使用的扫描输入集。

反射型 XSS 发现。Payload、匹配指标、状态和响应证据,全部可重放。

盲注 SQL injection 发现。通过响应时间(OR SLEEP)而非报错输出检测到,并记录了尝试的 payload。

路径遍历发现。确认的目录外文件读取,记录了 payload 和检测指标。

## 性能建议
- 保持 `max_workers` 和 `threads_per_session` 平衡,注意文件描述符和服务器速率限制。
- 对于 SQLi 时间盲注,增加 `timing_payload_trials` 以提高信心。
- 当广度比深度更重要时,使用 `--bail-on-hit` 进行更快的分类。
- DOM XSS 运行真实浏览器;在本地尝试 `--no-headless` 进行调试。
## 安全与使用注意事项
本项目仅用于授权的安全测试、本地实验室环境和作品集演示。
仅在您拥有或获得明确测试许可的应用程序、系统或网络上运行此工具。未经书面授权,请勿将其用于公共网站、第三方服务、大学系统、雇主或生产环境。
Fuzzer 可能会生成大量请求,并可能触发安全警报、速率限制、日志记录、帐户锁定或应用程序错误。测试时请使用保守的设置,避免在脆弱或共享的系统上运行。
此工具旨在支持防御性安全学习和 Web 应用程序测试。它不应用于未经授权的漏洞发现、利用、破坏、数据提取,或任何可能损害系统或用户的活动。
任何随附的 payload、wordlist、扫描器集成或概念验证检查仅供受控测试使用。它们旨在帮助识别和理解授权环境中的常见 Web 应用程序弱点,例如注入漏洞、遍历问题和输入验证问题。
本项目并未针对作为公共服务部署进行强化。它只能在本地或受控实验室环境中运行。在提交之前,应审查配置文件、目标 URL、扫描结果、日志和报告,以确保它们不包含敏感信息。
作者不对滥用本软件负责。用户有责任确保其测试符合适用的法律、政策和授权边界。
## 许可证
本项目基于 MIT 许可证授权。有关详细信息,请参阅 `LICENSE` 文件。
标签:C2, CISA项目, Python, Web安全, 安全测试, 攻击性安全, 无后门, 蓝队分析, 逆向工具