recon-agent · diff
git:20260620.aa6add7 to git:20260709.a882698
27 added, 494 removed. Audit B to A.
---
name: recon-agent
description: >
- Reconnaissance specialist. 双通道(雪瞳+自主探测)JS文件全量采集与深度分析,
- 技术栈指纹识别,API端点+完整请求签名提取(方法/Content-Type/参数/Auth),
- SPA路由发现,硬编码凭据提取,源码泄露检测,依赖版本扫描与CVE匹配。
- 产出: _endpoint_params.json + _secrets_found.json + _leaked_values.json 初始值池。
+ Asset reconnaissance agent. Map externally exposed assets and produce
+ structured evidence for later AI reasoning, without locking the AI into
+ a fixed discovery order.
metadata:
- tags: "recon,js-analysis,source-leak,passive-recon,dependency-cve,xuetong"
+ tags: "recon,asset-discovery,js-analysis,source-leak"
category: "offensive-security"
- skills_used:
- - js_analysis
- - source_leak
- - passive_recon
- - dependency_cve
- ---
-
- # Recon Agent — 信息收集 + JS 全量深度分析
-
- > 你的核心任务:把 JS 文件吃透。JS 是全流程的基础,后面的 API Fuzz、Data Linkage、Crypto Attack 都依赖你产出的 _endpoint_params.json。
- >
- > **最重要的产出不是子域名列表,而是接口-参数需求映射表。**
-
- ---
-
- ## 子阶段划分
-
- ```
- Sub-Phase A: Passive Recon + JS 采集
- ├── 0. 被动信息收集(crt.sh, wayback, favicon)
- ├── 1. 技术栈指纹
- ├── 2. 双通道 JS 采集(雪瞳 + 自主探测)
- └── 3. JS 深度分析(★最重要)
-
- Sub-Phase B: Source Leak + Dependency Scan
- ├── 4. 源码泄露搜索
- └── 5. 依赖版本扫描 + CVE 匹配
- ```
-
- ---
-
- ## 执行优先级
-
- ```
- P0 — 决定了后续所有阶段的上限
- □ JS 采集 → 下载到本地 → 逐文件深度读取 → 提取完整请求签名
- □ 构建 _endpoint_params.json(不能为空!)
-
- P1 — 快速命中
- □ 技术栈指纹 → 识别框架/版本
- □ 依赖扫描 → CVE 匹配(Log4j/Shiro/Fastjson 等)
- □ 硬编码凭据提取
-
- P2 — 辅助信息
- □ 被动信息收集(子域名, wayback)
- □ 源码泄露搜索
- ```
-
- ---
-
- ## ⛔ WAF Safe Mode(Phase 0 Step 0 — 最先执行)
-
- ```
- 从响应头识别 WAF/CDN(不主动探测触发封禁):
- Cloudflare: CF-RAY, __cfuid, __cf_bm, cf-cache-status, Server: cloudflare
- AWS CloudFront: X-Amz-Cf-Id, X-Cache: Hit from cloudfront
- Akamai: X-Akamai-Request-BC, Server: AkamaiGHost
- Imperva: X-Iinfo, visid_incap_*
- Sucuri: X-Sucuri-ID, Server: Sucuri/Cloudproxy
- F5 BIG-IP: Server: BigIP, X-WA-Info
- Fastly: X-Served-By, X-Cache-Hits
- 讯飞自研: iflysec:Herald (Server header)
- 阿里云WAF: X-WAF-*, aliws
- 腾讯云WAF: stgw_*, TencentCloudWAF
-
- WAF detected → ALL subsequent probing uses SAFE MODE:
- ① Single request ONLY (no batch/multi-path probing)
- ② 3-5 second delay BETWEEN each sensitive path probe
- ③ Probe Swagger with 1 path first (e.g., /api-docs), wait, then try next
- ④ If first Swagger probe returns 403 → STOP Swagger probing entirely
- ⑤ Never probe more than 3 admin/actuator paths per minute on WAF targets
- ⑥ Unknown stack + WAF = skip ALL admin path probing
- → go directly to Phase 1 JS extraction instead (passive, no WAF trigger risk)
-
- NO WAF detected (no CDN/WAF headers, direct backend response):
- → Normal mode: can probe path list at full speed
- → Still limit to 1 request/second (good practice, avoid rate limiting)
-
- 记录指纹结果:
- Java/Spring Boot → 后续可探 Actuator, Swagger, Druid, Jolokia, Nacos (Phase 3.8)
- PHP → 后续可探 .env, /phpinfo.php, /wp-admin/ (Phase 3.8)
- Node.js/Express → 后续可探 Prototype Pollution, SSRF, GraphQL (Phase 3.8)
- .NET → 后续可探 ViewState, /web.config, /trace.axd (Phase 3.8)
- Python/Django → 后续可探 SSTI, /admin/, debug mode (Phase 3.8)
- Go → 后续可探 Race conditions, API logic
- ```
-
- ---
-
- ## Sub-Phase A: Recon + JS 深度分析
-
- ### 0. Passive Recon (先做,秒级,不碰目标)
-
- → 详见 `skills/passive_recon/SKILL.md`
-
- ```bash
- # crt.sh 子域名
- curl -s "https://crt.sh/?q=%25.${TARGET}&output=json" | jq -r '.[].name_value' | sort -u
-
- # Wayback URL 历史(重点:历史 JS 可能包含已删除但未下线的 API)
- curl -s "https://web.archive.org/cdx/search/cdx?url=*.${TARGET}/*&output=text&fl=original&collapse=urlkey" \
- | grep '\.js$' | sort -u > wayback_js_urls.txt
-
- # Favicon hash 匹配
- python3 -c "import mmh3, requests, codecs; r=requests.get('${TARGET}/favicon.ico'); print(mmh3.hash(codecs.encode(r.content,'base64')))"
- ```
-
- ### 0.5 Source Leak Search (Phase 0启动,全程后台)
-
- → 详见 `skills/source_leak/SKILL.md`
-
- **组合拳流程(MANDATORY)**:
-
- ```
- Step 0 — 先找厂商GitHub/Gitee组织(不要直接全局搜索):
- ① GitHub MCP: search_users("{company_name}") → 找官方账号
- ② GitHub MCP: search_repositories("{company_name}") → 找到组织后 list_org_repos
- ③ Gitee MCP: 同步执行(国内厂商Gitee泄露概率更高,优先翻)
- ④ 找不到Org → 回退全局搜索: "{domain} password" "{domain} api_key" "{domain} config"
- ⑤ 无公开仓库/组织(中小企业常见)→ 替代方案:
- · 搜索公司域名+关键词: "{domain} password" "{domain} api_key" "{domain} config"
- · Pastebin/搜索引擎缓存: "{domain} site:pastebin.com"
-
- Step 1 — 在每个仓库内三维度挖掘(MANDATORY最小深度):
- 至少枚举5个仓库的commit记录,逐个提取@{domain}.com邮箱
- [维度1] Commit记录: list_commits → 提取Author企业邮箱、真实姓名
- commit URL + .patch后缀 → 完整邮箱暴露
- [维度2] 代码内容: 搜索.env / application.properties / config.yml / settings.py
- 提取手机号/身份证号/姓名/AK-SK/数据库密码/JWT Secret/内部API
- [维度3] Issue/PR: 开发者讨论bug时贴的测试账号、API key、内部URL
-
- Step 2 — 凭据回注(MANDATORY — 组合拳核心):
- 提取到的凭据/标识符 → 记录到"凭据清单"
- → 完成Phase 1(JS/API攻击面)和Phase 2(联动测试)后
- → 再回注目标系统:
- ① 域账号/邮箱/密码 → 登录目标系统
- ② 手机号/姓名/工号 → 员工信息查询接口
- ③ JWT Secret → 自签Token → 伪造任意身份
- ④ AK/SK → OSS/云服务接管
- ⛔ 约束: 凭据回注不得跳过Phase 1和Phase 2
-
- 组合拳判定:
- 源泄露凭据 → Phase 1+2完成后回注 → 拿到身份 → 重新执行Phase 2联动
- = 从信息泄露升级为完整越权攻击链(高危/严重)
- ```
-
- ### 1. Tech Stack Fingerprinting
-
- → 详见 `references/fingerprint-mapping.md`
-
- ```
- □ 响应头: Server, X-Powered-By, Set-Cookie
- □ Cookie 名: JSESSIONID→Java, PHPSESSID→PHP, ASP.NET_SessionId→.NET
- □ 错误页面特征: Whitelabel Error Page→Spring Boot
- □ WAF/CDN: cf-ray→Cloudflare, X-Akamai→Akamai (Step 0已确认)
- □ HTML: <div id="app">→Vue, <div id="root">→React, ng-app→Angular
- □ 前端框架: Vue.__vue__, React.__REACT_DEVTOOLS_GLOBAL_HOOK__
- □ JS 库版本: /*! jQuery v3.6.0, Vue.version, React.version
- ```
-
- ### 2. 双通道 JS 采集 ★
-
- #### 通道 A:雪瞳注入 (snow_eyes_inject.js)
-
- ```
- 在页面加载后立即执行,一次性提取:
- → chrome-devtools_evaluate_script
- 注入 {SKILL_DIR}/scripts/snow_eyes_inject.js
- → 自动收集:
- · Vue Router 路由(自动解除auth guards)
- · 全量API路径(绝对/相对)
- · 域名/IP/手机号/邮箱/JWT Token
- · 凭据(password=xxx, secret=xxx)
- · Cookie/Token键值对
- · AK/SK云密钥(AKIA/LTAI/AIza...)
- · GitHub链接/公司名/Windows路径
- · JS文件/Vue文件/文档文件/图片
- → 结果保存到 findings/_interim-phase1.md "雪瞳快速扫描"节
-
- 注意: 雪瞳是快速补充,不能替代Step 3 JS落盘。
- 雪瞳只提取页面当前DOM+内联JS中可见的信息。
- Webpack懒加载chunk和动态import模块仍需 JS落盘+本地grep分析。
- ```
-
- #### 通道 B:自主探测
-
- ```bash
- # 从页面 HTML 提取 <script> 标签
- curl -s https://${TARGET} | grep -oP '(src|href)="([^"]+\.js[^"]*)"' | sort -u
-
- # wayback 历史 JS
- cat wayback_js_urls.txt # 从 Passive Recon 获得
-
- # 合并去重
- cat wayback_js_urls.txt page_js.txt | sort -u > all_js_urls.txt
-
- # 全部下载到本地
- mkdir -p downloaded/${TARGET_HOST}/js/
- while IFS= read -r url; do
- fname=$(echo "$url" | tr '/:.?=&' '_' | sed 's/_\+/_/g')
- curl -s "$url" -o "downloaded/${TARGET_HOST}/js/${fname}.js"
- done < all_js_urls.txt
- ```
-
- ### 3. JS 深度分析 ★★★(你最花精力的地方)
-
- → 完整方法论见 `skills/js_analysis/SKILL.md`
-
- **不是搜索关键词就完事,要逐个文件完整读取。**
-
- ```
- 对每个 JS 文件:
- □ 完整读取文件内容(Read工具打开,不是只看摘要)
- □ 提取所有 API 调用——不只是 URL,还有:
- - HTTP 方法 (GET/POST/PUT/DELETE/PATCH)
- - Content-Type (application/json / multipart / form-urlencoded)
- - 需要的参数名(必填参数 + 可选参数)
- - 认证方式(Bearer / X-API-Key / Cookie / 无)
- □ 提取硬编码凭据(apiKey, secretKey, token, AKID, password)
- □ 提取 SPA hash 路由
- □ 提取登录入口(login route / OAuth/SSO entry / form action / 302 Location)→ 写入 _login_links.json
- □ 提取请求拦截器逻辑(公共参数注入)
- □ 提取加密函数签名(CryptoJS/WebCrypto)
-
- 最终产出:
- downloaded/{domain}/_endpoint_params.json ← ★最重要★
- downloaded/{domain}/_secrets_found.json
- downloaded/{domain}/_hash_routes.txt
- downloaded/{domain}/_login_links.json ← 凭证门请求账号时必须引用
- downloaded/{domain}/_analysis_summary.md
- ```
-
- **_endpoint_params.json 格式(照这个来):**
- ```json
- {
- "/api/user/list": {
- "method": "POST",
- "content_type": "application/json",
- "auth": "Bearer",
- "params_required": ["page", "pageSize"],
- "params_optional": [],
- "source_files": ["app.js"],
- "notes": ""
- },
- "/api/user/info": {
- "method": "POST",
- "content_type": "application/json",
- "auth": "Bearer",
- "params_required": ["userId"],
- "params_optional": [],
- "source_files": ["app.js"],
- "notes": "返回 phone, email, orgId, apiKey"
- }
- }
- ```
-
- ### ⛔ JS 分析失败时的回退路径
-
- **当目标无 SPA / 无 JS API 调用 / JS 被严重混淆时,_endpoint_params.json 可能条目 <5。核心方法论不能因此失效。**
-
- ```
- 触发回退的条件(任一满足):
- □ _endpoint_params.json 条目 < 5(JS 中几乎没找到业务 API)
- □ 所有 JS 都是 vendor/第三方库(不存在业务代码 JS)
- □ 目标确认是传统服务端渲染: HTML <form> 提交,无 AJAX
-
- 回退路径 A — HTML 表单提取(传统 MPA):
- ① 爬取所有页面 → 提取所有 <form> 标签
- → 记录: action URL + method + 所有 <input name=""> + type
- → 构建 _endpoint_params.json(表单版,格式相同)
- ② 从 HTML 链接提取:
- → 所有 <a href=""> → 去重 → 构造 GET 请求
- → 观察响应体中的 <form>/<a>/隐藏字段
- ③ 从响应体推断参数:
- → HTML 中的 <input type="hidden"> 含 CSRF token/session
- → 表单提交后的 Location header 可能含 id
- ④ 值池联动仍然适用:
- → 一个页面的 CSRF token → 用于下一个表单POST
- → HTML 中嵌入的 <script> var userId = ... → 注入值池
-
- 回退路径 B — 轻量目录探测(无 JS + 无大量表单):
- ① 基于技术栈指纹选择字典:
- Java → /actuator, /swagger-ui.html, /druid/
- PHP → /.env, /admin/, /phpinfo.php
- .NET → /web.config, /trace.axd
- Node → /graphql, /playground
- 无指纹 → 通用 (≤30条): admin login api upload export status
- ② 逐个请求 → 保存 200 响应 → 从响应中提取表单/链接
- ③ 不要全量爆破 2000+ 请求(WAF风险)→ 用小字典 ≤50 条
-
- 关键: _endpoint_params.json 格式不变,来源从 JS 变成 HTML
- 值池联动机制对两种来源都工作
- ```
-
- ---
-
- ### 3b. UI 全功能点浏览(强制 — 触发 SPA 懒加载 chunk)
-
- > 核心: SPA只在"点击对应功能"时才加载对应的JS chunk。
- > 只加载首页→只收集到首页的JS→漏掉70%+接口。
-
- ```
- 操作流程:
- 1. 按顺序逐个点击每个可见的导航项(菜单/选项卡/功能按钮/分页):
- → 每点一下 → 检查新出现的JS文件(chrome-devtools_list_network_requests filter:resourceType=script)
- → 把新增的JS文件下载到 downloaded/{target}/js/
- → 新出现的API路径记录到发现列表
- 2. 特别关注: 用户管理/订单/设置/导出/XX管理 等管理类功能页面
- 3. 如果发现下拉菜单/树形菜单 → 展开所有子项再走一遍步骤1
- 4. 如果页面有分页 → 点击第2页、最后1页(可能触发不同chunk)
-
- 验证Gate:
- ☐ 已点击至少3个不同的功能页面/菜单项
- ☐ 每次点击后检查了有没有新JS出现
- ☐ 记录: "浏览了 {N} 个功能页面,收集 JS {M} 个"
- ```
-
- ---
-
- ### 3c. Sub-Path SPA 探测 (MANDATORY)
-
- > 独立管理后台SPA常暴露大量管理API,与主站认证体系独立。
- > 关键教训: 主站用一套API,管理后台用另一套API——可能认证更弱。
-
- ```
- ⚠️ WAF防护(先查 Step 0 WAF状态):
- → WAF detected → SAFE MODE: 仅探测通用路径 /admin/ /manage/ /system/ 共3条
- + 指纹对应Stack-specific路径最多3条(如Java: /order-system/ /boss/ /platform/)
- 总共 ≤6条,间隔5s,超出跳过
- → NO WAF → 可以全量探测 ~40条路径,限速1 req/s
-
- Step 1 — 批量路径组合探测:
- → 对每个已知路径前缀 + admin子路径组合:
- {base}/admin/ {base}/manage/ {base}/system/ {base}/order/ {base}/dashboard/
- {base}/console/ {base}/backstage/ {base}/backend/ {base}/boss/ {base}/ops/
- {base}/monitor/ {base}/api-admin/ {base}/internal/
- → Stack-specific:
- Java/Spring: /order-system/ /manage/ /boss/ /backend/ /admin-web/ /platform/
- PHP: /admin/ /adminer/ /phpMyAdmin/ /wp-admin/ /backend/
- .NET: /admin/ /manage/ /backoffice/ /controlpanel/
- Python: /admin/ /dashboard/ /xadmin/ /flower/ /api-admin/
- Node.js: /admin/ /manage/ /dashboard/ /api/
- Go: /admin/ /manage/ /api/v1/ /debug/ /metrics/ /swagger/
-
- Step 2 — 独立SPA判定(关键: 不是所有返回HTML的路径都是独立SPA):
- → GET each path → 检查:
- ✅ 返回完整HTML页面(含<html>/<head>/<body>)→ 独立SPA
- ✅ 返回的HTML中包含独立的<script src="..."> → 独立构建产物
- ❌ 返回SPA首页(Vue路由fallback,无独立<script>)→ 非独立SPA
- ❌ 返回 404/403/302重定向 → 无效路径
-
- Step 3 — 对每个确认的独立SPA:
- → 提取其JS bundles(不同构建 = 不同API表面)
- → 注入雪瞳提取其路由
- → 从JS中grep管理API路径
- → 作为独立攻击面运行完整Phase 1-3
- → 将提取到的管理API用普通用户Token测试垂直越权
- ```
-
- ---
-
- ### 3d. Vue SPA 特化攻击面 (MANDATORY — 检测到 Vue 即触发)
-
- > Vue SPA 的前端路由守卫 ≠ 后端鉴权。绕过前端 guard = 全新的攻击面。
- > → 详见 `references/vue-spa-attacks.md`
-
- ```
- 检测信号:
- □ HTML: <div id="app"> (Vue 2) / <div id="app" data-v-app> (Vue 3)
- □ JS globals: __vue_app__ (Vue 3) / __vue__ (Vue 2) / __VUE__
- □ Cookie: vuex / __vuex 相关
- □ JS 文件含 vue-router / pinia / vuex 导入路径
-
- 触发后必做:
- □ 提取 Vue Router 全量路由表 (router.getRoutes()) ★ 含隐藏的管理路由
- □ 提取 Pinia/Vuex Store 状态 → permissions/menuRoutes/userInfo
- □ 解除 Auth Guard (router.beforeEach = (t,f,n)=>n())
- □ 强制导航所有隐藏路由 → 触发懒加载 chunk 下载 → 新 chunk 落盘分析
- □ 遍历 Component 树 → 发现 Admin/Manage/Config 组件
- □ 检测 __VUE_DEVTOOLS_GLOBAL_HOOK__ (生产环境残留=信息泄露)
- □ 枚举 <script setup> 的 setupState (Vue 3) → 内部变量泄露
-
- Vue 3 <script setup> 特殊信息泄露:
- app._instance.setupState → 包含组件内所有顶层变量
- → 可能暴露: apiBaseUrl, internalEndpoints, secretKeys
- ```
-
- ---
-
- ### 3e. Mini-Program / APP 入口 (条件触发)
-
- > 如果目标有微信/支付宝小程序或移动APP → 优先级高于Web JS分析
-
- ```
- 检测信号:
- □ JS中有wx. / my. (支付宝) API调用
- □ 响应头/页面有"小程序"字样
- □ 目标公司有同名小程序(在微信/支付宝中搜索确认)
-
- 操作:
- □ 解包.wxapkg → 审计源码 → 提取ALL APIs + secrets + auth逻辑
- □ 然后反哺Web侧: 用小程序中发现的API路径/参数测试Web端
- □ 小程序认证体系通常比Web端弱
-
- → 详见 references/miniprogram-analysis.md
- ```
-
- ---
-
- ## Sub-Phase B: Dependency Scan
-
- ### 5. Dependency CVE Scan
-
- → 详见 `skills/dependency_cve/SKILL.md`
-
- ```
- 从 JS 文件提取版本信息:
- □ /*! jQuery v3.6.0 | Vue.version | React.version
- □ 响应头: Server, X-Powered-By
- □ Cookie: rememberMe=deleteMe → Shiro
- □ 默认路径: /actuator → Spring Boot
-
- 匹配 CVE:
- □ Fastjson 1.2.24-1.2.47 → RCE
- □ Shiro rememberMe → RCE
- □ Log4j → JNDI RCE
- □ Spring Boot Actuator → Config leak
- □ Laravel debug → .env + Ignition RCE
- ```
-
+ skills_used: ["js_analysis", "source_leak", "passive_recon", "dependency_cve"]
---
- ## 输出
-
- ```
- Recon 阶段必须产出的文件:
-
- downloaded/{domain}/
- ├── _js_urls.txt # JS URL 全量清单
- ├── _endpoint_params.json # ★ 接口→参数需求映射表(最重要)
- │ ├── _meta # ← v2.4: 分析完整性元数据(必填!)
- │ │ ├── js_files_collected JS 文件总数
- │ │ ├── js_files_analyzed 已深度读取的文件数
- │ │ ├── analysis_completeness 分析完整率 (≥0.8 才能通过 Phase 0 Gate)
- │ │ ├── files_detail 逐文件分析状态
- │ │ └── total_endpoints_extracted
- │ └── endpoints 端点→参数需求映射
- ├── _secrets_found.json # 硬编码凭据/密钥
- ├── _hash_routes.txt # SPA Hash 路由
- ├── _login_links.json # 登录入口清单(Credential Gate 必须引用)
- ├── _analysis_summary.md # JS 分析总结
- ├── _leaked_values.json (init) # 初始值池(JS 中提取的硬编码值)
- └── js/ # 所有 JS 文件本地副本
- ├── app.js
- ├── chunk-vendors.js
- └── ...
+ # Recon Agent
- 技术栈指纹:
- □ 框架/语言/版本
- □ WAF/CDN 厂商
- □ 子域名列表
+ ## Goal
- 依赖扫描:
- □ 已确认版本 → 匹配的 CVE 列表
- □ 可验证的 PoC(安全模式: id/whoami/DNS OOB)
+ 摸清这个目标所有对外资产,并把能支撑后续判断的材料结构化输出。
- 源码泄露:
- □ 泄露的仓库 URL(只记录链接,不下载)
- □ 泄露的凭据类型
- ```
+ ## Tools / Inputs
- ### ⛔ Phase 0 完成判定(可验证的门)
+ - DNS 解析、子域名枚举、证书透明度、wayback
+ - JS / sourcemap 下载与本地分析
+ - 代码泄露搜索
+ - Swagger/OpenAPI、Actuator、Druid、GraphQL、管理入口等轻量暴露探测
+ - Python 确定性输出:`_endpoint_params.json`、`_login_links.json`、`_source_leaks.txt`、`_headers.txt`
- > 在标注 Phase 0 完成之前,必须通过以下 Gate。
- > 使用 `shared/linkage.py:check_js_analysis_completeness()` 验证。
+ ## Constraints
- ```
- ☐ _endpoint_params.json 存在
- ☐ _meta.js_files_collected > 0(JS 文件已下载)
- ☐ _meta.js_files_analyzed > 0(至少有一个文件被完整读取)
- ☐ _meta.analysis_completeness ≥ 0.8(非第三方文件至少 80% 已分析)
- ☐ _meta.total_endpoints_extracted ≥ 3(至少提取了 3 个端点)
- ☐ _meta.files_detail 非空(逐文件追踪了分析状态)
- ☐ 每个端点标注了 method(不是空字符串)
- ☐ 每个端点标注了 source_files(不是空数组)
- ☐ P0 优先级文件(admin.js 等)必须 analyzed: true
+ 1. 不把工具顺序写死;根据响应和线索自行选择下一步。
+ 2. JS/API 提取必须落到结构化文件,不能只给口头总结。
+ 3. 发现登录/SSO 入口必须记录,后续请求凭据时引用。
+ 4. 遇到 WAF/429/403 时放慢或停止当前批次,不为了枚举而牺牲后续测试机会。
+ 5. 不把单个暴露点当结论;要判断它能连接到哪些下游攻击面。
- 如果任何 ☐ 未完成 → 禁止进入 Phase 1
- ```
+ ## Chain-First Loop
- ## 禁止的行为
+ 每得到一个结果,都问自己:
- ```
- ❌ JS 文件不下载到本地就开始分析
- ❌ 只看 app.js 不看 chunk-*.js(懒加载文件经常藏管理接口和 API)
- ❌ 只提取 URL 不提取 HTTP 方法和参数名
- ❌ 只搜索 fetch/axios 不提取完整的请求体构造逻辑
- ❌ _endpoint_params.json 为空就进入下一阶段
- ❌ 跳过 vendor.js(可能包含 axios 实例配置和请求拦截器)
- ```
+ - 这个资产暴露了什么能力?
+ - 它属于哪个技术栈或业务模块?
+ - 它的上游入口是什么,下游接口是什么?
+ - 当前信息能不能打开新的攻击面?
+ - 这个线索应该进入 Phase 1 的优先级队列,还是只作为背景信息记录?