cy3erm/driftjs
GitHub: cy3erm/driftjs
driftjs 是一款针对网站 JavaScript 的安全侦察工具,通过差异对比和历史存档分析,帮助漏洞赏金猎人高效发现端点、密钥及隐藏攻击面。
Stars: 0 | Forks: 0
# driftjs
将目标的 JavaScript 拆解以进行侦察,并记录上次的结果,从而只向你展示新增的内容。Endpoints、secrets、有趣的 params、DOM XSS sinks、source maps,以及那些已从当前构建中删除但仍存在于旧存档 JS 中的 routes。
这个想法源于每个 hunter 都会遇到的一个简单问题:JS 文件是真正攻击面隐藏的地方(API routes、隐藏 params、keys),但是每次网站发布新版本时都要手动重新阅读它们是非常痛苦的。因此 driftjs 会对结果进行快照并执行 diff。首次运行是 baseline。之后的每次运行都会告诉你发生了什么变化,而这些通常就是尚未经过测试的内容。
```
$ driftjs https://target.com
[!] 1 SECRET(s) in JS:
! Stripe Live Key: sk_liv...abcd (36 chars)
[*] 4 interesting endpoint(s):
> /api/v1/admin/users?debug&redirect
> /graphql
> /internal/config
[*] interesting param(s): debug, redirect
[*] DOM XSS sink(s) present: innerHTML, eval, dangerouslySetInnerHTML
[*] 1 source map(s) referenced (original source may be recoverable):
~ app.min.js.map
[+] 2 NEW endpoint(s) since last run:
+ /api/v2/internal/transfer
+ /api/v1/payout
```
## 它能提取什么
- **Endpoints 和路径** —— 提取自 fetch/axios/XHR 调用和字符串字面量,并对 ID 和 hashes 进行规范化处理,因此 `/users/1` 和 `/users/2` 会被视为同一个 route(保持 diff 结果清晰)
- **Secrets** —— AWS、Google、Firebase、Stripe、Algolia、Mapbox、Sentry、Slack、GitHub、GitLab、Heroku、Twilio、SendGrid、Square、Shopify、npm、JWTs、私钥等
- **Cloud assets** —— S3 buckets、GCS buckets、Azure blobs、DigitalOcean Spaces、Firebase Storage(值得检查是否存在公开/错误配置的访问权限)
- **重要信号** —— SSRF/cloud-metadata 目标 (`169.254.169.254`)、硬编码的 Bearer/Basic auth、`localStorage` token 访问、GraphQL introspection、debug flags
- **有趣的 params** —— 值得进行 fuzzing 的参数:`redirect`、`url`、`debug`、`admin`、`token`、`callback` 等(open-redirect / SSRF / IDOR 信号)
- **有趣的 endpoints** —— `/admin`、`/internal`、`/graphql`、`/swagger`、`/api-docs`、`/actuator`、api 版本以及其他高价值路径
- **DOM XSS sinks** —— `innerHTML`、`eval`、`document.write`、`dangerouslySetInnerHTML` 及其相关项
- **Source maps** —— 标记 `sourceMappingURL` 引用,因为 `.map` 文件可能会直接向你提供原始源代码和注释
- **Ghost endpoints** (`--wayback`) —— 从 Wayback Machine 提取存档的 JS,并找出存在于旧版本但已从当前版本中消失的 routes。开发者通常会移除 UI 按钮,但保留 endpoint。
并且它会**随着时间推移对所有内容执行 diff** —— 包括自上次运行以来新增的 endpoints、secrets 和 params。
## 运行方式
仅支持 Python 3.10+,无外部依赖。
```
pipx install git+https://github.com/cy3erm/driftjs
driftjs https://target.com
```
或者克隆并运行:
```
git clone https://github.com/cy3erm/driftjs
cd driftjs
python3 -m driftjs https://target.com
```
选项:
```
driftjs https://target.com --wayback # also surface deleted/archived endpoints
driftjs https://target.com --json # JSON output, for piping into other tools
driftjs https://target.com --wordlist out.txt # dump paths+params as a fuzzing wordlist
driftjs https://target.com --probe # ACTIVE: check which endpoints are live
driftjs https://target.com/app.js # a single JS bundle
driftjs --local app.js # a local file
```
`--probe` 是唯一发送网络请求的部分。它会检查哪些已发现的 endpoints(以及使用 `--wayback` 时,哪些被删除的 ghost endpoints)能够真正响应,这样即使某个 route 已从 UI 中移除但仍返回 200,也会被标记为高价值目标。该功能默认关闭,需主动开启,具有速率限制,仅使用 HEAD/GET 请求(绝不使用破坏性方法),并且它只会触碰目标自身的 host 以及任何你通过 `--scope` 明确添加的 host。任何超出范围的都会被跳过,不会被探测。
## 底线所在
阅读和分析 JavaScript 是一种被动行为 —— 就像浏览器在每次加载页面时所做的那样,因此收集这些信息不需要特殊访问权限。唯一的主动功能是 `--probe`,并且它的设计初衷是让你能够控制范围:它拒绝向任何非目标 host 或未通过 `--scope` 明确加入白名单的 host 发送请求。请仅在你获得授权测试的项目和资产上运行探测(以及进行任何形式的挖掘)。
## 添加检测规则
Secret 模式位于 `driftjs/secrets.py` 中,有趣的 params/paths 和 XSS sinks 位于 `driftjs/analyze.py` 中。每一个都是简明直观的条目。项目包含测试套件 (`python -m pytest`),用于锁定提取和过滤行为 —— 在提交更改之前请先运行测试。
## 许可证
MIT
标签:Blue Team, CMS安全, Docker容器, JavaScript, StruQ, 安全助手, 安全规则引擎, 实时处理, 攻击面发现, 敏感信息扫描