Deparos — 现代自适应内容发现¶
Deparos 是一个智能内容发现引擎,可对 Web 应用执行目录枚举、目录模糊测试和端点发现。它超越了静态字典暴力破解,通过从每个响应中学习——自适应调整策略、动态扩充字典,并通过基于指纹的软 404 检测来过滤误报。
工作原理¶
目标 URL
│
▼
┌──────────────────────────────────────────────────────┐
│ 初始化 │
│ 1. 探测目标,提取主机组件 │
│ 2. 获取 robots.txt │
│ 3. 学习基线指纹(3 样本软 404 检测) │
│ 4. 加载之前的会话数据(如果恢复扫描) │
│ 5. 从字典 + 观测数据生成初始任务 │
└──────────────────┬───────────────────────────────────┘
▼
┌──────────────────────────────────────────────────────┐
│ 优先级队列 │
│ ┌────┬────┬────┬────┬─────┬──────┬──────┬────────┐ │
│ │ P0 │ P1 │ P2 │ P4 │ P5 │ P7 │ P11 │ P12 │ │
│ │爬虫│观测│观测│观测│短词 │扩展变│长词 │模糊 │ │
│ │ JS │名称│文件│路径│典 │体数字│典 │ │ │
│ └────┴────┴────┴────┴─────┴──────┴──────┴────────┘ │
└──────────────────┬───────────────────────────────────┘
▼
┌──────────────────────────────────────────────────────┐
│ 载荷协调器 │
│ 扩展器拉取任务 → Expand() 生成载荷 │
│ N 个工作线程并发执行载荷 │
│ │
│ 对每个响应: │
│ 指纹检查(软 404?)──→ 丢弃 │
│ WAF 检测 ──→ 跟踪/退避 │
│ 真实发现 ──→ 回调 │
└──────────────────┬───────────────────────────────────┘
▼
┌──────────────────────────────────────────────────────┐
│ 发现回调 │
│ OnDirectoryDiscovered(): │
│ • 学习目录的新指纹 │
│ • 创建递归任务(字典 + 观测数据) │
│ • 提取面包屑目录 │
│ OnFileDiscovered(): │
│ • 提取扩展名 → 触发扩展名任务 │
│ • 数字段 → 模糊测试 ±10 个变体 │
│ • 排队扩展名变体探测(.bak, .old, …) │
└──────────────────┬───────────────────────────────────┘
▼
┌──── 循环回优先级队列 ────┐
│ (来自发现的新任务) │
└─────────────────────────┘
自适应特性¶
1. 基于指纹的软 404 检测¶
扫描前,引擎请求 3 个随机的不存在路径,提取响应属性(状态码、内容类型、标头、正文哈希、内容长度范围)。只有 3 个样本中全部稳定 的属性才成为基线签名。扫描时,匹配此签名的响应将被丢弃为误报。
当出现未知响应模式时,通过 4 策略通配符验证(前缀、后缀、扩展名、中间)确认发现是真实的还是新的软 404 变体——并学习新模式。
2. 观测收集系统¶
四个数据池在扫描过程中持续增长:
| 池 | 来源 | 优先级 |
|---|---|---|
| 观测名称 | 爬虫链接、JS 解析、响应正文分词 | P1 |
| 观测文件 | 发现中的完整文件名 | P2 |
| 观测扩展名 | 发现中的文件扩展名 | P5 |
| 观测路径 | URL 中的完整路径段 | P4 |
每个新发现的目录都会使用所有观测值作为高优先级任务进行探测。当首次发现新扩展名时,会触发对所有已知目录的任务。
3. JavaScript 智能分析¶
两层 JS 分析将端点反馈到发现队列:
- JSScan(嵌入式二进制):反混淆打包的 JS,解析字符串拼接,追踪变量赋值,提取
fetch()/XMLHttpRequest/$.ajax调用位置为完整的 HTTP 请求规范。 - 爬虫提取器:解析内联
<script>标签和 JS 字符串字面量中的 URL 模式。
提取的端点成为优先级 0 的任务——在任何字典模糊测试之前进行测试。
4. 动态字典增长¶
响应正文被分词(根据内容类型感知 HTML、JSON、JS、CSS)以提取候选词。这些词进入观测名称池,并在每个目录上重放。
5. 递归目录扩展¶
当在 /a/b/c/file.txt 发现文件时,引擎提取 /a/、/a/b/、/a/b/c/ 作为待测试的目录。每个新目录触发其自己的完整任务集(字典 + 观测 + 模块)。
任务类型¶
| 任务 | 优先级 | 描述 |
|---|---|---|
| 爬虫/JS 提取 | 0 | 来自链接提取和 JS 分析的 URL |
| 观测名称 | 1 | 扫描期间看到的文件名,按目录重放 |
| 观测文件 | 2 | 完整的名称+扩展名对 |
| 观测路径 | 4 | URL 中的完整路径段 |
| 短字典(文件) | 5 | 来自短字典的常见文件名 × 扩展名 |
| 短字典(目录) | 6 | 来自短字典的常见目录名 |
| 扩展名变体 | 7 | 备份/替代扩展名(.bak, .old, .zip, .tar.gz) |
| 数字模糊 | 7 | 数字路径段的 ±10 个变体 |
| 长字典(文件) | 9 | 扩展文件名词典 × 扩展名 |
| 长字典(目录) | 11 | 扩展目录词典 |
| FUZZ | 12 | 基于模板的模糊测试(FUZZ 标记替换) |
去重¶
多层机制防止冗余工作:
- 任务级别:FNV-1a 哈希防止重复任务入队
- 请求级别:缓存防止发送相同的 HTTP 请求两次
- URL 级别:DiskSet 跟踪已处理的 URL
- 正文级别:哈希防止使用 JSScan 重新分析相同的响应
- 目录/文件跟踪器:防止重新处理相同的发现
内置模块¶
YAML 配置的模块在找到匹配目录时触发专门任务:
| 模块 | 触发条件 | 功能 |
|---|---|---|
backup |
任何目录 | 测试备份扩展名(.bak, .old, .zip, .tar.gz) |
js |
任何目录 | 测试 .js, .mjs, .map 扩展名 |
api |
/api/, /v1/ 等 |
REST/GraphQL/SOAP 端点字典 |
admin |
/admin/, /manage/ |
管理面板路径 |
docs |
/docs/, /api-docs/ |
Swagger, OpenAPI, GraphQL playground |
static |
/static/, /assets/ |
阻止递归以避免噪音 |
支撑系统¶
| 组件 | 用途 |
|---|---|
| WAF 检测 | 识别 Cloudflare, Akamai, AWS WAF, F5, Imperva, Sucuri, ModSecurity。跟踪连续拦截以进行退避/提前退出 |
| 范围强制 | 三种模式:any(不检查)、subdomain(相同 eTLD+1)、exact(相同主机)。每次发现和重定向时检查 |
| 大小写敏感检测 | 在首次发现文件时通过以更改的大小写重新请求自动检测 |
| 存储 | SQLite 支持的站点地图,具有语义去重(FNV-1a-64)。支持跨运行的会话比较以进行差异扫描 |
与 Vigolium 集成¶
Deparos 作为输入源(DeparosDiscoverySource)在扫描流水线中运行。每个发现被转换为 httpmsg.HttpRequestResponse 并作为工作项馈送给执行器——然后流经主动和被动漏洞扫描模块。