Skip to main content

django-drf-pentest

Use when 黑盒打 Django/DRF 后端站(DEBUG取证/越权矩阵/上传/JWT爆破).

Quellinformationen

Repository
Kur1sulab/blackbox
Letzte Quellaktivität
23. September 2026 um 16:40
Erkannte Sprache von SKILL.md
Chinesisch
Sterne
3
Forks
1

Installationsoptionen

Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.

Quelldateien prüfen

Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.

Datei-Explorer
3 Dateien

SKILL.md wird angezeigt

SKILL.md
Quellanweisungen · Schreibgeschützte Vorschau
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 取证样本、排除清单全貌)
Auf GitHub ansehen