基于 dirsearch 的 Web 安全扫描增强工具
一键串联目录扫描、403 绕过、JS 信息收集、指纹识别、前端打包器检测、Swagger 未授权、子域名爆破等多个安全测试模块。
dirsearchPlus 是一个增强版的 Web 路径扫描工具,在原版 dirsearch 基础上集成了多个安全测试模块,并将它们编排为一条可容错、可阶段化运行的扫描流水线。
- 🛠️ 目录扫描:基于 dirsearch,支持线程、字典、状态码过滤、递归等
- 🔓 403 绕过:头部伪造 + URL 重写,支持对单条路径单独绕过
- 🔍 JS 信息收集:从 JavaScript 中提取 URL、子域名与敏感信息
- 🧾 指纹识别:集成 EHole,识别目标技术框架
- 📦 前端打包器检测:集成 Packer-Fuzzer(Webpack 等)
- 🌐 Swagger 未授权:对发现的接口做未授权访问测试
- 🔍 子域名爆破:集成 SubFinder(subfinder-x)
⚠️ 参数污染检测:HPP/HFP 行为差异分析- 🔥 SSRF 深度探测 & 🧠 动态 API 枚举(基于行为推断)
- 🚀 一键启用:
-a/--all串联全部模块,单阶段异常不中断流水线 - 🔀 Clash 自动切换IP:扫描中通过 Clash 外部控制器后台轮转节点,自动更换出口 IP
| 分类 | 技术 / 组件 |
|---|---|
| 语言/运行时 | Python 3.7+(开发测试于 3.13) |
| 核心引擎 | dirsearch(lib/ 下 connection / controller / parse / reports / utils / core) |
| 网络请求 | requests、urllib3、pyOpenSSL、ntlm-auth / requests_ntlm、pyspnego |
| 解析与匹配 | beautifulsoup4、tldextract、validators、chardet |
| 日志/输出 | loguru、colorama、pyfiglet、Jinja2 |
| 浏览器/报表(可选) | Selenium、openpyxl(供 Swagger 扫描) |
| 外部工具 | EHole(指纹)、subfinder-x(子域名)、Packer-Fuzzer(打包器) |
目录扫描 → 保存 403 状态路径 → JS 信息收集 → 403 绕过测试 → 指纹识别 → Packer-Fuzzer → 子域名爆破
各阶段以流水线方式串联:单个阶段异常(含 sys.exit)不会中断整条流水线,并会输出每个阶段的耗时。
# 核心依赖
pip install -r requirements.txt
# 可选:启用 Swagger 扫描的浏览器/报表能力
pip install -r requirements-browser.txt环境要求:最低 Python 3.7(启动时校验),当前开发与测试环境为 Python 3.13。
ehole、subfinder-x以可执行文件形式随仓库提供;Packer-Fuzzer在首次启用时按需浅克隆。
# 基础目录扫描
python dirsearchplus.py -u "http://www.example.com/"
# 分别启用 403 绕过 / JS 收集 / 子域名爆破
python dirsearchplus.py -u "http://www.example.com/" -b yes -j yes -d yes
# 一键启用所有模块
python dirsearchplus.py -u "http://www.example.com/" -apython dirsearchplus.py -u https://target.com -a -r --deep-recursive \
--recursion-status 200-399 \
--exclude-text "404" --exclude-text "Not Found" --exclude-text "Error" \
-t 50 --wordlists .\db\simple_dicc.txt在 dirsearch 原有参数之外,本工具额外提供运行时开关,用于日志、TLS 校验和外部依赖来源控制。这些开关会在启动时从命令行参数中摘除,不与 dirsearch 的参数解析冲突;也可通过环境变量设置。
| 开关 / 环境变量 | 说明 |
|---|---|
--debug 或 DIRSEARCHPLUS_DEBUG=1 |
启用控制台调试日志(将内部 logger 输出到终端),便于定位各阶段错误 |
--secure 或 DIRSEARCHPLUS_VERIFY_TLS=1 |
开启 TLS 证书校验(verify=True) |
--insecure 或 DIRSEARCHPLUS_INSECURE=1 |
显式关闭 TLS 证书校验(即扫描器默认行为,便于测试自签名/异常证书站点) |
PACKER_FUZZER_REF |
锁定 Packer-Fuzzer 运行时克隆所使用的标签/分支名或提交 SHA,降低动态克隆的供应链风险 |
TLS 校验默认关闭(便于安全测试场景)。若你的测试不需要绕过证书,推荐加上
--secure提升安全性。
# 调试模式 + 强制 TLS 校验
python dirsearchplus.py -u "https://www.example.com/" -a --debug --secure# 锁定 Packer-Fuzzer 版本后再启用该模块
$env:PACKER_FUZZER_REF="v2.0"; python dirsearchplus.py -u "https://www.example.com/" -p yes在长时间/大范围扫描时,单一出口 IP 容易被目标限流或封禁。本模式让所有扫描请求走本地 Clash 代理端口,并由后台线程按间隔自动切换 Clash 节点,从而在扫描过程中自动更换出口 IP。
启用本模式前,必须在 Clash(内核) 中完成以下配置:
- 开启外部控制器(external-controller):Clash 配置需启用外部控制器 RESTful API(默认端口
9090)。 - 设置好「外部控制器监听地址」:即
external-controller的监听地址(默认http://127.0.0.1:9090),需与下方--clash-api一致。 - 设置好「外部控制器的 API 密钥(secret)」:若 Clash 配置了
secret,必须提供正确的密钥,否则控制器会返回 401/403。 - 此外还需知道 Clash 的本地混合代理端口(mixed-port),扫描请求将通过它出口(默认
7899)。
程序在启动该模式时会自动校验上述控制器地址与密钥:连接失败或密钥错误会给出明确提示,并自动降级为普通扫描模式(不影响其余流水线阶段)。
| 参数 | 说明 | 默认值 | 环境变量 / config.ini |
|---|---|---|---|
--clash |
启用 Clash 自动切换IP模式 | 关闭 | [clash] enable=true |
--clash-api |
外部控制器监听地址(external-controller) | http://127.0.0.1:9090 |
DIRSEARCHPLUS_CLASH_API / [clash] api |
--clash-secret |
外部控制器 API 密钥(secret) | 空 | DIRSEARCHPLUS_CLASH_SECRET / [clash] secret |
--clash-port |
本地混合代理端口(mixed-port) | 7899 |
[clash] port |
--clash-interval |
自动切换节点间隔(秒) | 30 |
[clash] interval |
优先级:命令行参数 > 环境变量 >
config.ini的[clash]段 > 内置默认。出于安全考虑,建议通过环境变量或config.ini提供 secret,避免密钥出现在命令行历史中。
# 指定控制器地址与密钥,扫描时每隔 20 秒自动换一个出口 IP
python dirsearchplus.py -u "https://www.example.com/" --clash \
--clash-api "http://127.0.0.1:9090" --clash-secret "你的密钥" \
--clash-port 7899 --clash-interval 20# 推荐:密钥放环境变量,命令行不暴露
$env:DIRSEARCHPLUS_CLASH_SECRET="你的密钥"; python dirsearchplus.py -u "https://www.example.com/" --clash- 控制器地址可省略协议头:
--clash-api "127.0.0.1:9090"会自动补全为http://127.0.0.1:9090。 - 与其他代理参数互斥:Clash 模式会接管扫描代理,若同时设置了
--proxy/--proxy-file/--tor,启动时会告警并以 Clash 本地端口为准。 - 查看每次切换详情:加
--debug,后台线程每次轮换节点都会输出到控制台/日志。 - 启动即校验:连接失败/超时/密钥错误(401、403)/无可用 Selector 策略组/节点不足 都会给出对应中文提示并自动降级为普通扫描;扫描结束会打印本次共成功/失败切换次数。
- secret 不会回显:启动提示仅显示“已提供/未提供”,不会打印密钥明文。
requirements.txt:核心运行依赖(完整清单,直接pip install -r requirements.txt)。requirements-browser.txt:可选的浏览器 / 报表依赖(Selenium、openpyxl 及其 trio/websocket 依赖栈),主要供 Swagger 扫描 使用。未启用 Swagger 可不安装;缺依赖时 Swagger 阶段会自动优雅跳过,不影响整条流水线。
| 模块 | 启用参数 | 作用 |
|---|---|---|
| 目录扫描 | 默认 | 基于 dirsearch 的路径/目录爆破 |
| 403 绕过 | -b yes |
对 403 状态路径进行绕过测试 |
| JS 信息收集 | -j yes |
从 JS 中提取 URL / 子域名 / 敏感信息 |
| 指纹识别 | -z yes |
使用 EHole 识别技术框架 |
| Packer-Fuzzer | -p yes |
前端打包器检测与模糊测试 |
| Swagger 扫描 | --swagger yes |
Swagger 接口未授权访问测试 |
| 子域名爆破 | -d yes |
使用 SubFinder 爆破子域名 |
| 参数污染 / SSRF / 动态 API | 随流水线自动 | 深度漏洞探测 |
| 全模块启动 | -a / --all |
一键启用上述所有模块 |
👉 每个模块的详细用法、单路径绕过、注意事项见:docs/modules.md 👉 框架专用字典、API 响应过滤与认证策略见:docs/api-scanning.md
dirsearchplus/
├── dirsearchplus.py # 主入口(流水线编排 + 运行时开关)
├── config.ini / options.ini # 扫描配置
├── requirements.txt # 核心依赖
├── requirements-browser.txt # 可选浏览器/报表依赖(Swagger)
├── db/ # 字典、黑/白名单
│ ├── api-endpoints.txt / spring-boot-*.txt / ruoyi-endpoints.txt
│ ├── simple_dicc.txt / dicc.txt
│ └── *_blacklist.txt / sensitive_whitelist.txt
├── resources/ # 403 绕过 URL、敏感词白名单
├── docs/ # 详细文档(本目录)
│ ├── README.md / modules.md / api-scanning.md / changelog.md
├── script/ # 辅助脚本
│ ├── single_403pass.py # 单路径 403 绕过
│ ├── clash_proxy_rotator.py # Clash 节点自动轮转(Clash 模式依赖库)
│ └── swagger.py # Swagger 扫描
├── tests/ # 单元测试(utils / parse / connection / reports)
└── lib/ # 核心库
├── core/ # 设置、选项、日志、敏感信息正则
├── controller/ # 扫描调度与报告写入
├── connection/ # 请求 / DNS
├── parse/ # URL / Header 解析
├── reports/ # 报告生成
├── utils/ # 工具函数
├── ehole/ # 指纹识别(EHole)
├── subfinderX/ # 子域名爆破(SubFinder)
├── Packer-Fuzzer/ # 前端打包器检测
├── JSFinder.py # JS 信息收集
├── pass403.py / pass403_optimized.py # 403 绕过
└── qc.py # 参数污染检测
tests/ 目录覆盖 dirsearch 核心的纯函数模块,便于二次改动后回归:
| 目录 | 覆盖内容 |
|---|---|
tests/utils/ |
common、crawl、diff、mimetype、random、schemedet |
tests/parse/ |
URL 解析、请求头解析 |
tests/connection/ |
DNS 解析 |
tests/reports/ |
报告生成 |
运行:
pip install pytest
pytest tests/ # 运行全部单元测试
pytest tests/utils -v # 运行指定目录
script/下另有若干手动验证脚本(test_subfinder.py、test_sensitive_info.py、test_packer_import.py等),用于对特定外部模块做冒烟测试。
深入内容已抽离至 docs/:
- docs/modules.md — 模块功能详解
- docs/api-scanning.md — API 接口扫描指南
- docs/changelog.md — 更新日志与历史提交
本项目基于并参考了以下优秀开源项目:
- dirsearch — Web 路径扫描工具
- 403bypasser — 403 绕过工具
- JSFinder — JavaScript 信息收集工具
- EHole — 指纹识别工具
- Packer-Fuzzer — 前端打包器检测工具
- SubFinder — 子域名爆破工具
本项目基于 dirsearch 二次开发,遵循 MIT License,仅供学习交流与安全测试使用。
如有问题或建议,欢迎提交 Issue。
最后更新时间:2026-10-07 最近变更:稳定性与安全加固([1.5.12],详见 docs/changelog.md)