关于 attack-surface-mapping
attack-surface-mapping 是用于漏洞测试前梳理单个 Web 应用暴露面的安全技能。它指导 Agent 在授权范围内记录主机、端点、密钥、响应类别和对象关系。
主要功能
- 01概述应用业务与对象
- 02盘点主机、端点和密钥
- 03分类响应行为
- 04梳理业务对象关系
- 05合并重复页面与登录门槛
- 06将已梳理的攻击面交接测试
适用场景
- 01梳理新发现的应用
- 02在漏洞测试前建立攻击面清单
- 03调查最初只显示登录页的应用
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ yaklang/ hack-skills --skill attack-surface-mapping安装后在 Claude Code 中输入/attack-surface-mapping确认已加载。
附带文件SURFACE_PATTERNS.md
详细介绍
攻击面映射
给定一个目标和一个应用,根据该应用已经暴露的内容绘制攻击面。然后就此停止。测试属于其他技能的范畴。
这是快速路径。成功的标志是一份概况、一份主机/API 清单、一张密钥表、响应类别标签以及一张对象关系图。探测次数不代表成功。
有关攻击面其他部分实际所在位置的实战模式,请参阅:SURFACE_PATTERNS.md。
适用场景
- 遇到新 URL、新应用,或“我只看到一个登录页”
- 在加载注入 / 身份验证 / 上传技能前,需要知道要测试什么
- Agent 正准备暴力枚举目录、批量发送引号,或扩展到无关主机
不要用此技能扩展整个组织的主机范围。映射当前应用集群。完成后,如果范围允许,再处理下一个集群。
授权和破坏性操作边界:hack 开始前检查。请勿超出范围。
必须具备的内容(不是文件树)
在使用任何漏洞技能前,必须能够查到以下信息。将其保存在本地工作区现有的笔记和证据存储中——例如已有的任务文件夹、代理项目、会话笔记或工单。如果已有存储正在使用,就不要另建目录结构。
| 信息 | 保留内容 |
|---|---|
| 概况 | 3–5 句话,不要写成文章 |
| 主机 | 此应用已命名的业务主机、网关、API 域名 |
| 端点 | 方法、路径、参数、是否需要身份验证 |
| 密钥 | 签名盐、密文 ID + 前端公钥、隐藏 / 管理路由、硬编码的演示账号。如不存在,每行记录 none |
| 响应类别 | 登录门槛 / 差异响应 / 未经身份验证的异常 |
| 对象关系图 | 列表 → 详情 → 附件 / 导出 / 审批 |
如果请求、差异和截图已保存在当前工作存储中,就继续保留在原处。清单为空,接着说“我接下来会暴力枚举路径”,这就算映射失败。
快速路径
Portrait
→ find the business plane (login is a shell)
→ inventory from the app (JS / traffic / docs), keys not just paths
→ classify responses
→ grow the object graph from responses
→ same-skin / same-gate collapse
→ surface-done → hand off
不要在此流程中加入目录暴力枚举、全模板扫描或密码喷洒。
1. 概况(强制要求,必须在批量发送请求前完成)
写三到五句话:
- 谁在使用此应用(消费者 / 商户 / 操作员)
- 核心对象(订单、工单、优惠券、文档、租户)
- 哪些字段承载金额、权限或状态
- 未经身份验证的调用方已经可以触及什么
写不出来 → 先捕获一个真实页面的流量。不要在概况空白时开始扫描。
小程序、原生应用、GraphQL、WebSocket、批量导出、带工具的 Agent、模板预览、文件转换、命令 RPC:将它们视为此网站的攻击面,而不是顺带一提的内容。
2. 找到业务平面
登录页只是外壳。攻击面是登录后的业务主机,或表单背后的同主机网关。看到登录页并不是更换目标的理由。
无需登录即可找到业务平面:
- 查询:
service=/redirect_uri=/callback=/returnUrl=/jumpUrl=/next= - 客户端:
env.js/baseURL/apiHost//prod-api/VUE_APP_*/REACT_APP_* - 传输:302
Location、X-Frame-Options: ALLOW-FROM - 命名:同一产品的
api/admin/gateway/ 产品主机
如果遇到他人的 SSO / CAS / OAuth 页面:不要审计身份产品。沿线找回此产品的业务平面。判断标准:登录页的所有者并非此业务的所有者。
存活与失效:
| 视为存活 | 视为失效 |
|---|---|
| 401、403、登录墙、管理界面质询 | 超时、停放页、没有业务响应 |
| 管理控制台质询 | 没有脚本的默认 CDN / 空静态外壳 |
存活 ≠ 反复试探表单。验证码 OCR、滑块验证服务和登录框字典都不属于映射工作。
适用于映射的表单检查(执行一次,然后停止):空密码、跳过密码步骤、登录 API 中的额外字段(tenant / corpId / moduleId)、表单旁已可见的业务路径(列表 / 详情 / 统计)。用户名和密码框不是业务参数。
3. 从应用中盘点
存在前端: 打开业务页面 → 收集脚本(包括异步代码块和源码映射)→ 提取 API 和密钥 → 捕获流量以补足缺口 → 将端点和密钥保存到本地证据库。
JS 提取的不只是 /api/ 路径。每一行都要填写具体值或 none:
| 提取项 | 为什么属于攻击面 |
|---|---|
/api/ 路径、RPC 命令编号、GraphQL 操作 | 端点列表 |
签名盐、硬编码密钥、无需 Cookie 的 sign | 无会话即可重放 |
密文 ID + 前端公钥(modulus / JSEncrypt) | 邻近 ID 可加密 |
| 路由器中的隐藏 / 管理路由、未发布的代码块 | UI 从不显示的 API |
| 硬编码的演示账号、测试租户、体验入口 | 一把密钥,而不是登录表单字典 |
| 命令 / 模板 / 表达式 / 文件转换 / 带执行功能的 RPC / Agent 工具 | 执行平面;若不存在参数,不要凭空编造 |
不存在前端 / JS 被阻止: 检查 Swagger、OpenAPI、捕获的流量、HTML 内联内容、已知网关前缀。不要空等完整的 JS 转储。
存在前端,但盘点结果为空 → 禁止进行目录暴力枚举。
如果此应用已经关联了文档和调试平面:api-recon-and-docs。暴露的 VCS / 备份:insecure-source-code-management。两者都是此集群的额外平面,不是新的搜索目标。
4. 先对响应分类,再进行任何探测
| 响应 | 分类 | 映射操作 |
|---|---|---|
一句“请登录” / NotLogin,没有列表 / 总数 / 名册 / 详情 | 登录门槛 | 不要标记为注入攻击面 |
包含列表 / 总数 / 业务字段,即使 total=0 | 差异响应 | 保留在测试列表中 |
| 错误、500、超时,或长度 / 时序偏离基线 | 差异响应 | 保留;差异不稳定时,比较一到两次后停止 |
| 缺少参数时会转储名册或详情 | 未认证例外 | 最高优先级的未认证攻击面 |
空列表表示“已返回结构,数量为 0”,而不是登录门槛。
5. 对象图本身就是攻击面
任何字段名中的标识符(id / userId / tenantId / fileKey / openid / 密文 PK)都属于攻击面。
逐步遍历并记录:
list → detail → attachment / export / preview / approval
父对象已授权,子对象往往未授权。列表检查通过后,下一个攻击面是附件,而不是新主机。
响应中新出现的任何内容——ID、下载 URL、令牌、内部主机、角色字段——都要立即加入此站点的队列。切换页面时不要遗漏。
6. 合并相同外观和相同门槛
指纹相同(标题、骨架、构建哈希、API 前缀、登录链):选 2–3 个代表。对同组应用只需快速查看:是否有新路径 / 新端口 / 其他应用 / 另一个 jump / service= / moduleId 业务平面。没有新平面 → 不要展开完整矩阵。
相同门槛(满足以下四项):
- 已提取业务路径
- 已探测未认证例外
- 剩余业务端点返回相同的登录代码系列
- 没有未认证的其他主体数据,也没有缺少参数时的转储
此时停止检查此门槛。对于 baseURL 相同且代码相同的同组应用,快速查看是否有新路径或代码变化。如果存在,仍将认证端点(签发会话 / 重置 / 重新绑定 / 票据交换)列入清单;它们不属于“请登录,所以跳过”的情况。
同一主机不代表外观相同。同一主机上的额外路径始终要纳入检查。
如果同一登录代码系列后面没有业务脚本、默认服务器页面或遗留内容:验证一次后结束。不要为了凑数而展开完整矩阵。
7. 表面梳理完成(然后移交)
满足以下条件,即视为映射完成:
- 已有应用画像,或已记录这是一个没有业务对象的空壳
- 已有端点清单(完整或降级);各项键均有值或为
none— 保存在本地证据库中,不要求使用指定路径 - 已标注响应类别;已勾选未认证例外
- 已记录对象图,或已记录为不可枚举
- 已查看同类界面/同类门禁下的剩余部分,未重新制作矩阵
- 若清单中有 issue-session / reset / rebind / ticket-swap / 2FA,则已列出认证端点 — 仅列出,尚未利用
然后加载 hack,了解工作量排序和匹配的类别技能。不要在此文件中开始测试。
移交
| 已梳理的表面 | 加载 |
|---|---|
| 未认证即可访问其他主体的数据、对象 ID | auth-sec、idor-broken-object-authorization |
| Issue-session / reset / rebind / ticket-swap | authbypass-authentication-flaws |
| 差异过滤器、URL 抓取参数、模板 | injection-checking |
| 上传/预览/转换 | upload-insecure-files |
| 金钱/优惠券/库存/审批 | business-logic-vuln |
| REST / GraphQL / 网关文档 | api-sec |
| 公开的中间件管理界面 | unauthorized-access-common-services |
反模式
- 一开始就进行目录爆破或全模板扫描
- 在登录 HTML 上反复破解验证码/尝试默认密码
- 看到登录页面就去修改资源文件
- 脚本只提取了路径;盐值、密文 ID、隐藏路由、演示账户均未读取
- 把 401 / 403 / 登录拦截页视为无效
- 将完整矩阵倾注到同一类登录代码中
- 当前应用的在线攻击面尚未梳理完,就扩展到新集群
- 仅因主页返回 200,就宣称映射「完成」
- 工作区或代理项目已保存证据,却另建一套笔记目录