unauth-path-key-hunt — 零身份公开面:路径与密钥猎杀
编排型 skill。只解决「没有后台账号、路径不在当前前端时,如何独立还原接口并证伪加密=鉴权」。不替代 JS 拆包、越权矩阵、API 全方法。
何时调用
- 未授权 / 攻击者没有该业务账号(纯零身份)
- 路径不在主站 JS;用户要求不要用登录 Network 截图当发现源
- 独立 H5、旧子域 NXDOMAIN、品牌迁域(旧 Host 301/消失)
- 兄弟域、同 IP、
--resolve换 Host 漏出路径 - 网关
405 Method Not Allowed、200 data:[]、短文案「链接不存在」 getRsaKey/ JSEncrypt / SM2 / 前端 AES,怀疑只是传输混淆
不要调用(交给别人)
- 攻击面不清、要广撒网拆 webpack / 脏收集 →
recon-js-analysis - 路径已通,打角色/IDOR/JWT/验证码 →
auth-access-control - 路径已通,全方法、BOLA、Swagger、走私 →
api-protocol-security - 调试面板/中间件/对象存储未授权 →
cloud-infra-supply-chain - 路径在 APK/小程序包里 →
android-security-audit/miniprogram-security - 已验证要成稿 →
report
与其它技能分工
怀疑隐藏未授权
│
▼
unauth-path-key-hunt 找 Host/路径/钥,证伪加密
├─ 拆 webpack / 脏收集 / 提字符串 → recon-js-analysis
├─ 路径已通,角色墙 / IDOR → auth-access-control
├─ 路径已通,全方法 / 旧版 / 网关协议 → api-protocol-security
├─ 路径在包里 → android / miniprogram
└─ 已验证成稿 → report
拆 JS、Wayback、Packer 的细则以 recon-js-analysis 为准,此处不重复。
跨轮线索落盘以 hunt-clueboard 为准:开工先读 hunts/<目标>/CLUEBOARD.md,P2 指纹/405/[]/迁域结论当轮写回,禁止只写在对话里。
铁律
- 发现阶段禁止把「已登录 Network」当路径出处。截图只作假设,公开面复原才是证据。
- 主站 JS 没有 ≠ 接口不存在。
- 客户端能拿到的 RSA/AES/uuid ≠ 鉴权。
- SPA 的 404 不是接口的 404。没到失败升级 L4 不准写「无此接口」。
- 旧 H5 / 旧 Host 下线 ≠ 后端方法下线。
P0 零身份约束
允许的发现源: 未登录 HTML/JS/map;CT / urlscan / Wayback / GitHub;兄弟域与同 IP;301 Location;公开文档;未登录可下的 APP/小程序包。
不允许当发现源: 业务账号登录后的 DevTools;报告截图里的 URL(降级为待验证假设)。
口令:截图里的路径 = 假设;公开面复原 = 证据。
P1 入口地图
分清四类 Host,标 DNS/IP,不要只盯主域:
| 类 | 典型 | 下一步 |
|---|---|---|
| C 端壳 | 主站 / m / 品牌新域 Next/Vue | 在此搜路径常失败,记录后换场 |
| API 网关 | appgw / apigw / qr / gateway | P2 指纹,不要当 SPA 扫目录 |
| 独立业务 H5 | invoice / vat / asp / mag / 活动 CDN | 优先拆 JS、打 /gp /mag 等前缀 |
| 后台/SSO | passport / admin / 服务商域 | 记下 sid;零身份只证「墙在哪」 |
品牌新域、301 目标必须列入地图。
通过门: 至少标出「C 端壳 / 疑似网关 / 疑似业务 H5」三类。
P2 响应指纹(禁止 -L 跟着 302 再看 body)
记录四元组:状态码 / Content-Type / Server / body 形态。
| 指纹 | 含义 | 动作 |
|---|---|---|
SPA HTML 404(Next X-Powered-By,几十 KB index) |
前端路由吞路径,不是这个后端 | 换 Host |
网关 JSON:no api / Route Not Found / divide: selector |
网关活着,这条 route 没挂 | 换 Host 或前缀 |
业务 JSON:success/code/message,path 出现在 body |
真应用 | 进入 P4/P5 |
| 短 body 业务文案(「链接不存在」)vs 统一 404 页 | 路径存在、资源不存在 | 保留前缀,补 module/method |
| 302 → SSO | 有鉴权墙,不是「没有服务」 | 记下 Location 的 sid/应用名 |
405 Request method 'GET' not supported |
控制器在,方法不对 | 立刻 POST |
200 + data:[] |
已进控制器,只是没命中数据 | 补参数/加密/字段名 |
同 IP 换 Host → 403 / 404 Route Not Found |
虚拟主机隔离 | 继续找对的 ServerName |
通过门: 每个候选路径都归入上表。禁止再写「404 所以没有」。
P3 路径发现五源(并行)
优先级从「更像零身份攻击者」到「更脏」。webpack/脏收集操作见 recon-js-analysis。
| 源 | 做什么 | 通过信号 |
|---|---|---|
| 1 现网 JS | 首页、buildManifest、异步 chunk、baseURL | 路径或方法名字符串有公开出处 |
| 2 历史旁路 | urlscan / Wayback / CT / 第三方脚本引用的 Host | 旧 URL、CDN 活动页、发票/售后等业务词 |
| 3 兄弟域 + 同 IP | 对未解析旧 Host --resolve 到网关 IP |
对 Host=业务 200;错 Host=网关 404/403 |
| 4 命名习惯 | 有第一段后续猜:/{svc}/{module}/{method}/{id}、/gp/{ctx}/{action}、ForFree/open/anon |
405 或业务 JSON |
| 5 包 | C 端 Web 没有的方法名 | 交给 android / miniprogram,产物回到本 skill 打 Host |
主站源1 为空是常态,进入源2/3,不要结案。
通过门: 路径字符串能指出公开出处(JS 行 / urlscan / 兄弟域指纹)。没有出处仍是假设。
P4 密钥还原与鉴权证伪
目标不是解密,是判断密码学有没有替代鉴权。
从 JS 必须对齐 6 项(提取步骤走 recon-js-analysis):
- 取钥接口(
getRsaKey/getPublicKey/ ticket) - 算法与填充(JSEncrypt 默认 PKCS#1 v1.5)
- POST 字段名(响应里的
uuid可能要改名为rsaUuid) - 密钥生命周期(多次 GET 是否同一 uuid/公钥 → 静态密钥 ID)
- 加密范围(只加密关键字,还是整包)
- 无 Cookie 能否取钥
口令:
- 客户端能取的「密钥」,对攻击者不是密钥。
- 加密查询字 ≠ 证明你是谁。
- 字段名以 JS 为准,猜错会假阴性(空数组)。
T0–T3 对照(详细越权矩阵见 auth-access-control)
| 编号 | 条件 | 仍业务成功则 |
|---|---|---|
| T0 | 无 Cookie、无 Authorization | 未授权 |
| T1 | 错误/过期 Token | 鉴权没校验 |
| T2 | 有登录但无该业务角色 | SSO 与 ACL 分离,记录「能进门不能办事」 |
| T3 | 去掉加密或改错绑定字段 | 加密是协议还是装饰 |
T0 成功 + 敏感字段 → 未授权成立。T0 仅 302/ACL、业务接口已下线 → 路径存在但利用链断,分开写。
P5 字段对齐(空结果最易误判)
- GET 目标方法 → 吃 405,改 POST
- POST
{}→data:[]说明已进控制器 - 明文关键字 / 错字段名 / 对字段名+密文 三组对照
- 从同类加密接口抄字段名(改密用
rsaUuid,查询多半同一个)
示例(字段名错了会像没洞):
| body | 常见结果 |
|---|---|
{} |
200 [](无鉴权) |
{title: 密文} |
[](缺绑定) |
{title, uuid} |
[](名错) |
{title, rsaUuid} |
非空列表 |
通过门: 至少一种变体能把 [] 变成非空,或错误信息给出参数名。否则只写「接口暴露,危害未证实」。
路径对齐之后的全方法/BOLA/分页遍历交给 api-protocol-security。
P6 迁域复查
旧站下线必须四问:
- 旧 Host 是 NXDOMAIN 还是 301?301 的 Location 是新战场。
- 新品牌域有没有把 API 一起搬走,还是只搬了 C 端壳?
- 同 IP 上哪个 ServerName 还在反代这套前缀(
/gp/mag)? - 前端 chunk 删了方法名,网关上方法还在不在?(405/200 比 JS 诚实)
P7 失败升级
没到 L4 不准写「无此接口」:
| Level | 动作 |
|---|---|
| L1 | 主站 JS 全文搜 |
| L2 | 异步 chunk / 独立 H5 JS |
| L3 | 兄弟域、CDN、urlscan、CT |
| L4 | 网关 Host 探测 + 405 / 业务 JSON |
| L5 | 换入口:APP、小程序、开放文档 |
| L6 | 旧方法名 + 新 Host |
| L7 | Wayback 旧 JS 的 baseURL 打现网 |
P8 危害落地与输出
- 列表类:公开公司简称作关键字;统计条数与含账号/税号字段数;正文只出脱敏样本。
- ID 类:先解决 ID 从哪来(公开格式、C 端自己的单、枚举)。没有合法 ID 不能宣称可打任意用户。
- 复现用 curl,证明请求无登录 Cookie。
- 覆盖度必填:✅已测 / ❌未测 / 🔄变种 / 💡关联;同步写进线索板第 7 节。
- 评估表走总纲第 5 节。成稿走
report(只读板上「已证实」行)。
通用决策句
- 主站没有,去兄弟域和历史域。
- SPA 的 404 不是接口的 404。
- 「链接不存在」/405/空数组,往往比统一 404 更值钱。
- 路径跟 Host 走,不跟品牌官网走。
- 前端能取的 RSA/AES/uuid 只是协议,不是登录。
- 加密字段名以 JS 为准,猜错就假阴性。
- H5 下线只删了壳,旧 method 可能还在网关上。
- 截图证明利用,公开面证明发现。
类型对照:角色隔离后台(C 端无路径)/ 专项独立 H5 / 换皮迁域 / 前端已删后端未下。四类可叠加。
修复(未授权接口)
- 网关统一鉴权;
ForFree/open/anon默认视为危险命名,必须有身份或强频控+最小字段。 - 前端加密不能替代登录;取钥接口同样要鉴权或只对已登录会话下发。
- 下线 H5 必须同时下线路由/控制器,不能只删 DNS。
- 企业抬头等财务身份禁止对未登录返回完整银行账号。