ソース情報
- リポジトリ
- Kur1sulab/blackbox
- ソースの最終更新活動
- 2026年9月23日 16:40
- 検出された SKILL.md の言語
- 中国語
- スター
- 3
- フォーク
- 1
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
ファイルエクスプローラー
3 ファイルSKILL.md を表示中
SKILL.md
ソースの指示 · 読み取り専用プレビュー- name
- django-drf-pentest
- description
- Use when 黑盒打 Django/DRF 后端站(DEBUG取证/越权矩阵/上传/JWT爆破).
- version
- 1.0.0
- author
- rem
- license
- MIT
- platforms
- ["windows","linux"]
- metadata
- {"hermes":{"tags":["django","drf","rest-api","idor","jwt","spa","pentest"]}}
# Django + DRF 应用黑盒渗透 playbook
> 识别指纹:`/admin/` 302、cookie `csrftoken`、DRF 三件套 `/api/docs/`+`/api/schema/`+`/api/redoc/`(drf-spectacular)、登录返回 `{"refresh","access"}`(simplejwt)、字段命名 `first_name/last_name/is_staff/is_active`、DRF JSON 404 `{"detail":"Not found"}`。
## 1. SPA 前端 → 全量 API 面(Vite 站通用)
1. 抓首页拿 `/assets/js/index-<hash>.js` → 正则 `"assets/js/[^"]+?\.js"` 解 `__vite__mapDeps` 数组得全部懒加载 chunk(300+ 个常见)。
2. 并发下载全部 chunk → 正则 `["'](/[a-zA-Z][\w\-/.]{2,100})["']` 提 API 路径;**`baseURL` 字面量直接给真实后端**(常为 `http://IP:8000/api` 绕过前端 nginx)。
3. **上传/提交的真实字段名从前端 FormData 挖**:`grep -o '\.append("[^"]*"'`——字段名常不是后端 OPTIONS 显示的那个(实测:OPTIONS 显示 `uploaded_file`,前端真传 `file`)。
4. 现成脚本 `scripts/spa_api_extract.py <index.js路径|URL> <outdir>`:chunk 下载 + API 提取 + 敏感关键词(appSecret/privateKey 等)上下文一次出。
## 2. DEBUG=True 取证(生产开 DEBUG 的目标)
- **入口**:`/api/schema/` 500 页(drf-spectacular 生成报错)、任意 404 技术页(31KB)。
- **🔑 按模块打 404 枚举全量 URL conf**:Django 技术 404 页只列**匹配链路所在模块**的 patterns——对 `/api/<mod>/zzz_nonexistent/` 逐个模块发请求,每页提取 pattern 行,合并得全站路由表(含前端 JS 没暴露的 `audit/`、`files/` 等隐藏模块)。
- **敏感值天花板**:Django 对 settings 里键名含 SECRET/PASSWORD/KEY/TOKEN 的值自动打码(`****`);traceback 局部变量表(`<table class="vars" id="v...">`)里 `self/request` 全是对象 repr(`<jobs.views.X object at 0x...>`)——**不打码但无明文**,别指望从局部变量捞 key。
- **响应格式由 Accept 决定**:`Accept: application/json` → 纯文本 traceback(含 INSTALLED_APPS/MIDDLEWARE/Python Path,无变量表);`Accept: text/html` + 浏览器 UA → 完整 HTML DEBUG 页(有变量表)。两个都抓。
- 顺带固定收获:绝对路径(`/www/wwwroot/...`→宝塔=`/www/server/` 特征)、DB 实例名、Redis、SMTP 账号、第三方端点(Dify/OSS)、`CORS_ALLOW_ALL_ORIGINS`、`ALLOWED_HOSTS`、精确版本号、自定义中间件/类名(→GitHub 搜源码泄露)。
## 3. 认证/越权测试矩阵(低权限 token 在手时)
- **垂直**:管理端点 × 方法矩阵(GET/POST/PUT/PATCH)——权限类统一时全 403;405(方法不允许)泄露端点存在性,≠可利用。
- **水平 IDOR**:详情端点改 id。判读:`404 {"detail":"No X matches the given query"}`(自己 id 200、别人 id 404)= **queryset 按登录态隔离(防护正常)**;200 出别人数据 = 实锤。
- **🔑 不对称越权(本场实锤模式)**:集合端点 POST 创建时外键字段(如 `student`)可指定他人(服务端不强制绑定当前用户),而 GET/PATCH/DELETE 有 queryset 隔离——形成"能写不能读改删"。**创建响应回显受害者姓名/学号** = 遍历 id 拖映射表;副作用是自己删不掉造的垃圾数据(测试残留须写进报告请管理员清理)。
- **mass assignment**:资料更新接口夹带 `role/is_staff/is_superuser`——响应回显原值不变 = 字段被忽略(防护正常)。
- **register**:邀请码必填/假码 400/"admin 不是合法选项" = 服务端强校验即死;`check-email` exists:true/false = 用户枚举低危。
- **switch-user/演示端点**:报错信息 `Use admin/test_teacher/test_student` 白送测试账号命名——记录用于喷洒。
## 4. 密码喷洒纪律(`login_fail_limit=5, lock=60min` 类目标)
- 每账号 ≤2 发最弱口令、间隔 ≥3s;先打公开配置端点(`/auth/system-settings/public/` 常泄 `captcha_enabled`/`login_fail_limit`)探策略。
- 统一"用户名或密码错误" = 防枚举好;test_*/演示账号优先。
- **⚠️ 改密接口只准用错误旧密码探防护**——用真旧密码+新密码走通流程会真改密(本场事故:改完必须立刻改回并重登录刷新 token)。真实变更类接口默认不打通,除非备好恢复链。
## 5. 文件上传(Django 栈)
- **两步流程**:`POST /resumes/` 拿 id → `POST /resumes/{id}/upload_file/`(字段名从前端 FormData 挖)。直接对集合端点 multipart 会被静默忽略(201 但文件字段=None——假成功,必须回查详情验证)。
- Django `get_valid_name`/`get_available_name` 把 `../../x.pdf`、分号、反斜杠、URL 编码**全部规范化剥掉**——文件名穿越在 Django 栈别浪费时间(8 变体全灭实测)。
- 扩展名白名单只验后缀不验内容时:HTML 改名 .pdf 可传 = 恶意文件托管(低危);Django/nginx 不按扩展名执行 → **PDF 后缀下 XSS/RCE 不成立**,如实定级别硬报。
- ImageField 有 PIL 内容验证("请上传有效图片")——非图片死透;图片马在纯 Django 栈无解析面。
- 落地文件若匿名可 GET(`/media/uploaded_resumes/<原名>`)且保留原文件名 = 可预测托管面;目录列表默认 404。
## 6. 存储 XSS 快速判死
全 chunk 扫 `v-html=` 与 `innerHTML=`——**0 命中即死透**(Vue `{{}}` 默认转义),评论/昵称等注入点直接排除,不再试 payload。
## 7. JWT HS256 离线爆破(Kali 操作链)
1. access token payload 看字段(`user_id/sid/jti`);refresh 续期 `POST /auth/token/refresh/ {"refresh":...}`(access 常 1h 过期)。
2. `echo '<jwt>' > /tmp/rem.jwt`;rockyou 是 .gz:**kali 用户对 /usr/share/wordlists 无写权限**,`gunzip -c ... > /tmp/rockyou.txt`。
3. `john --format=HMAC-SHA256 --wordlist=/tmp/rockyou.txt /tmp/rem.jwt`(CPU ~1M/s,1434 万词十几秒);第二轮情报字典(项目名/厂商拼音/年份组合)+ `--rules:Best64`。
4. **坑**:①hashcat 跑大字典可能报 "Not enough allocatable device memory"(VM 内存小)→ 换 john 流式读;②**`pkill -f 'hashcat.*rem.jwt'` 会匹配 ssh 自己的 `zsh -c` 命令行把会话杀掉**——pkill 模式串绝不能出现在同一条 ssh 命令文本里。
5. 全灭即如实报"密钥不弱",别编。
## 8. 反幻觉验证(登录/爆破/注入/OOB 判定)
- "登录成功"判定**禁用页面关键词**("站点管理"在登录页本身就有——本场误报教训):三证据=①302 链跳离登录页 ②`sessionid` cookie 种植 ③带会话访问内页不再跳登录。
- 注入判定必须布尔对照(`and 1=1` vs `and 1=2` 响应完全一致 = 不成立;宽字节 `%df%27` 只改文本不算)。
- OOB 回源要核 UA:webhook 收到的请求 UA 是浏览器(Mac Safari)≠ 服务端 PHP 拉取——可能是**后台预览/blind XSS 面**而非 SSRF 下载链。
## 9. 止损与诚实收口
- 30+ 路线全排除后给"实测不可达"结论是合规交付(全路线打满 > 画饼)。报告写清:已实锤项 / 排除项 / 测试残留(需管理员清理的自造数据)/ 范围外资产(只记录不动)。
- 证据全落盘:每个 200/异常响应存 evidence/,URL conf、API 面、DEBUG 页原文留档。
## 支持文件
- `scripts/spa_api_extract.py` — Vite SPA chunk 下载 + API/敏感串提取(§1)
- `references/django-drf-case-zpt-20260817.md` — 鸥鹏智聘通实战案例(不对称越权细节、DEBUG 取证样本、排除清单全貌)
GitHubで見る