eniat/fuzzer

GitHub: eniat/fuzzer

一款集成爬虫与多种漏洞检测器的 Web 应用安全模糊测试工具,支持 XSS、SQL 注入和路径遍历的自动化发现与报告。

Stars: 0 | Forks: 0

# 用于 Web 漏洞测试的集成爬虫与 Fuzzer ![tests](https://static.pigsec.cn/wp-content/uploads/repos/cas/6b/6b52945adbf8d9e421fe243515ae54cfbd3da263f16b1eabda37cdc0b797b8eb.svg) 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 个表单)。 ![爬虫发现](https://static.pigsec.cn/wp-content/uploads/repos/cas/ce/ce04e119eebd902c714daf932e5c2a2893d416be45e9d5205216fa5ccd28bf9a.png) 实时发现结果。在 fuzzer 运行时将确认的漏洞打印到控制台,这里是通过布尔和时间指标检测到的盲注 SQL injection。 ![CLI 发现输出](https://static.pigsec.cn/wp-content/uploads/repos/cas/32/32531110d47c0516dbcccdf0ac0f603f068f39694814bdf8e8140d8b49be4f07.png) 爬虫输出。发现的 endpoint 和表单被标准化为 fuzzer 使用的扫描输入集。 ![爬虫输出](https://static.pigsec.cn/wp-content/uploads/repos/cas/63/63453cff42939387966402e97449411281232749e4dcb37a8ff343e92b2c2bad.png) 反射型 XSS 发现。Payload、匹配指标、状态和响应证据,全部可重放。 ![XSS 发现](https://static.pigsec.cn/wp-content/uploads/repos/cas/b7/b78de6079f74a393f020dc2d0158d45661f4fb7c96f5fe52e3d7dbea294ea669.png) 盲注 SQL injection 发现。通过响应时间(OR SLEEP)而非报错输出检测到,并记录了尝试的 payload。 ![盲注 SQLi 发现](https://static.pigsec.cn/wp-content/uploads/repos/cas/71/719cd00075da3a9f9d4f3347cc0a9aeb2f70d1cd0653696427b0e5b34d5d44a0.png) 路径遍历发现。确认的目录外文件读取,记录了 payload 和检测指标。 ![路径遍历发现](https://static.pigsec.cn/wp-content/uploads/repos/cas/39/39b68f95d887ddeda6cd042913f73db7559ed6a04dca1c20fc78812675fc335a.png) ## 性能建议 - 保持 `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安全, 安全测试, 攻击性安全, 无后门, 蓝队分析, 逆向工具