mcpField
A
attack-surface-mapping

attack-surface-mapping

github.com/yaklang安全2.6k682 次安装6 周前更新
代码仓库

关于 attack-surface-mapping

attack-surface-mapping 是用于漏洞测试前梳理单个 Web 应用暴露面的安全技能。它指导 Agent 在授权范围内记录主机、端点、密钥、响应类别和对象关系。

主要功能

  1. 01概述应用业务与对象
  2. 02盘点主机、端点和密钥
  3. 03分类响应行为
  4. 04梳理业务对象关系
  5. 05合并重复页面与登录门槛
  6. 06将已梳理的攻击面交接测试

适用场景

  1. 01梳理新发现的应用
  2. 02在漏洞测试前建立攻击面清单
  3. 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 业务平面。没有新平面 → 不要展开完整矩阵。

相同门槛(满足以下四项):

  1. 已提取业务路径
  2. 已探测未认证例外
  3. 剩余业务端点返回相同的登录代码系列
  4. 没有未认证的其他主体数据,也没有缺少参数时的转储

此时停止检查此门槛。对于 baseURL 相同且代码相同的同组应用,快速查看是否有新路径或代码变化。如果存在,仍将认证端点(签发会话 / 重置 / 重新绑定 / 票据交换)列入清单;它们不属于“请登录,所以跳过”的情况。

同一主机不代表外观相同。同一主机上的额外路径始终要纳入检查。

如果同一登录代码系列后面没有业务脚本、默认服务器页面或遗留内容:验证一次后结束。不要为了凑数而展开完整矩阵。

7. 表面梳理完成(然后移交)

满足以下条件,即视为映射完成:

  1. 已有应用画像,或已记录这是一个没有业务对象的空壳
  2. 已有端点清单(完整或降级);各项键均有值或为 none — 保存在本地证据库中,不要求使用指定路径
  3. 已标注响应类别;已勾选未认证例外
  4. 已记录对象图,或已记录为不可枚举
  5. 已查看同类界面/同类门禁下的剩余部分,未重新制作矩阵
  6. 若清单中有 issue-session / reset / rebind / ticket-swap / 2FA,则已列出认证端点 — 仅列出,尚未利用

然后加载 hack,了解工作量排序和匹配的类别技能。不要在此文件中开始测试。

移交

已梳理的表面加载
未认证即可访问其他主体的数据、对象 IDauth-sec、idor-broken-object-authorization
Issue-session / reset / rebind / ticket-swapauthbypass-authentication-flaws
差异过滤器、URL 抓取参数、模板injection-checking
上传/预览/转换upload-insecure-files
金钱/优惠券/库存/审批business-logic-vuln
REST / GraphQL / 网关文档api-sec
公开的中间件管理界面unauthorized-access-common-services

反模式

  • 一开始就进行目录爆破或全模板扫描
  • 在登录 HTML 上反复破解验证码/尝试默认密码
  • 看到登录页面就去修改资源文件
  • 脚本只提取了路径;盐值、密文 ID、隐藏路由、演示账户均未读取
  • 把 401 / 403 / 登录拦截页视为无效
  • 将完整矩阵倾注到同一类登录代码中
  • 当前应用的在线攻击面尚未梳理完,就扩展到新集群
  • 仅因主页返回 200,就宣称映射「完成」
  • 工作区或代理项目已保存证据,却另建一套笔记目录

评论

支持 Markdown