关于 ssrf
用于检测服务端请求伪造风险的代码审查技能,面向分析出站请求逻辑的安全审查人员。它结合扫描器结果与手动追踪,检查 URL 输入、验证、重定向、DNS 解析及云元数据访问。
主要功能
- 01限定相关文件的分析范围
- 02检查 URL 输入与协议验证
- 03追踪内网 IP 和元数据访问
- 04检查重定向与 DNS 重绑定
- 05集成 semgrep、bandit 和 gosec
- 06输出含修复建议及引用的发现
适用场景
- 01审计 webhook 和回调处理程序
- 02审查 URL 预览与导入代码
- 03检查云元数据暴露风险
- 04追踪用户控制的 URL 到请求调用
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ florianbuetow/ claude-code --skill ssrf安装后在 Claude Code 中输入/ssrf确认已加载。
附带文件references/detection-patterns.md
详细介绍
服务端请求伪造(A10:2021)
分析源代码,查找服务端请求伪造漏洞,包括从用户输入中获取 URL、缺少 URL 验证、访问内部网络、跟随重定向、DNS 重绑定,以及访问云元数据端点。在云环境中,SSRF 尤其严重,因为元数据端点会暴露凭据和实例配置。
支持的标志
阅读 ../../shared/schemas/flags.md,了解完整的标志规范。此技能支持所有通用标志。此技能的关键标志:
--scope用于确定要分析的文件(默认值:changed)--depth standard用于读取代码,并检查 URL 获取调用是否包含用户控制的输入--depth deep用于追踪 URL 输入从请求参数经过所有转换后到达获取调用的过程--severity用于筛选输出(针对云元数据的 SSRF 为critical,一般 SSRF 为high)
框架背景
阅读 ../../shared/frameworks/owasp-top10-2021.md 中的 A10:2021 - 服务端请求伪造(SSRF) 部分,了解完整的类别说明、常见漏洞和预防指南。
涉及的主要 CWE:
- CWE-918:服务端请求伪造(SSRF)
- CWE-441:非预期代理或中间人
- CWE-601:重定向到不可信网站的 URL(可能导致 SSRF 攻击链的开放重定向)
检测模式
阅读 references/detection-patterns.md,了解完整的代码模式目录、搜索启发式方法、特定语言示例和误报指南。
工作流
1. 确定范围
解析标志,并根据 ../../shared/schemas/flags.md 确定文件列表。
筛选可能包含出站 HTTP 请求逻辑的文件:
- HTTP 客户端用法(
**/http/**、**/client/**、**/fetch/**、**/request/**) - Webhook 和回调处理程序(
**/webhooks/**、**/callbacks/**) - 代理和网关代码(
**/proxy/**、**/gateway/**) - 集成模块(
**/integrations/**、**/connectors/**、**/services/**) - 文件导入/上传处理程序(
**/upload/**、**/import/**) - URL 预览或展开代码(
**/preview/**、**/unfurl/**、**/embed/**) - PDF 生成和屏幕截图服务(
**/pdf/**、**/screenshot/**、**/render/**)
2. 检查可用扫描器
根据 ../../shared/schemas/scanners.md 检测扫描器:
semgrep—— SSRF 模式的主要扫描器(用于 URL 流的污点分析)bandit—— Python 专用请求模式gosec—— Go HTTP 客户端模式
记录哪些扫描器可用,哪些缺失。
3. 运行扫描器(如果可用)
如果 semgrep 可用,则运行针对 SSRF 的规则:
semgrep scan --config auto --json --quiet <target>
筛选出与 SSRF、URL 获取和请求伪造模式匹配的规则结果。 将输出规范化为发现项架构。
4. Claude Code 分析
无论扫描器是否可用,都要手动分析代码:
- 来自用户输入的 URL:查找 HTTP 客户端调用(fetch、requests、http.get 等),并追踪 URL 或其任何组成部分是否源自用户输入(查询参数、请求正文、标头、路径参数)。
- URL 协议验证:检查 URL 协议是否仅限于
http://和https://,并阻止file://、gopher://、dict://、ftp://及其他危险协议。 - 阻止内部 IP:确认发起请求前会验证 URL,确保其不属于内部/私有 IP 范围(127.0.0.0/8、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、169.254.0.0/16、0.0.0.0、::1、fd00::/8)。
- 云元数据保护:检查是否会阻止访问云元数据端点(169.254.169.254、metadata.google.internal、169.254.170.2),以及是否在 AWS 上强制使用 IMDSv2。
- 重定向处理:确认 HTTP 重定向已禁用,或每次跳转都会经过验证,以防止通过重定向绕过 SSRF 防护。
- DNS 重绑定:检查 DNS 解析与连接是否以原子方式进行,或是否存在 TOCTOU 时间窗口,导致主机名在验证时解析为安全 IP、实际请求时却解析为私有 IP。
使用 --depth deep 时,还要追踪:
- 从请求参数到 HTTP 客户端调用的完整数据流
- 通过字符串拼接、模板渲染或 URL 构建器 API 构造 URL 的过程
- 经由 PDF 生成器、截图服务、SVG/XML 处理器或 Webhook URL 引发的间接 SSRF
5. 报告发现
按照 ../../shared/schemas/findings.md 中的格式输出,并使用 SSRF 前缀
(例如,SSRF-001、SSRF-002)。
每项发现都要包含:
- 严重性和置信度
- 精确的文件位置及代码片段
- 针对 SSRF 场景的影响说明(云元数据、内部网络扫描、数据外泄)
- 具体修复方案;如可行,请附上差异
- CWE 和 OWASP 参考资料
需要查找的内容
以下是 SSRF 特有的高信号模式。每种模式都对应 references/detection-patterns.md 中的一个检测模式。
-
将来自用户输入的 URL 传递给 HTTP 客户端——任何 HTTP 请求函数(fetch、requests.get、http.Get、HttpClient)使用未经验证且源自用户可控输入的 URL 调用。
-
缺少 URL 协议白名单——URL 验证未将协议限制为 http/https,因而允许 file://、gopher:// 或其他危险协议。
-
未阻止内部 IP 范围——向用户提供的 URL 发起出站请求前,未检查解析出的 IP 是否属于私有/保留范围,从而可能导致内部网络扫描和服务访问。
-
可访问云元数据端点——未专门阻止访问 169.254.169.254(AWS/Azure/GCP 元数据)、metadata.google.internal 或 169.254.170.2(ECS 任务元数据),可能导致云环境凭据被窃取。
-
跟随用户提供 URL 的重定向——HTTP 客户端配置为在获取用户提供的 URL 时跟随重定向,使攻击者能够将请求从允许的域名重定向到内部目标,从而绕过 URL 验证。
-
DNS 重绑定漏洞——URL 验证时会解析主机名并检查其 IP,但实际 HTTP 请求会再次解析该主机名,使攻击者能够利用 TTL 较短的 DNS 记录,在第二次解析时返回不同的(内部)IP。
-
经由文档处理器引发的间接 SSRF——PDF 生成器(wkhtmltopdf、Puppeteer)、SVG 渲染器、XML 解析器(XXE)或 Webhook 注册端点在缺少 SSRF 防护的情况下获取 URL。
扫描器集成
| 扫描器 | 覆盖范围 | 命令 |
|---|---|---|
| semgrep | 用户输入中的 URL,以及通过请求调用进行污点跟踪 | semgrep scan --config auto --json --quiet <target> |
| bandit | 使用用户输入的 Python requests/urllib | bandit -r <target> -f json -q |
| gosec | 使用用户输入的 Go net/http | gosec -fmt json ./... |
回退方案(无扫描器时):使用 Grep 和 references/detection-patterns.md 中的模式,
查找 HTTP 客户端调用、由用户输入构造的 URL,以及缺失的验证。
报告发现时使用 confidence: medium。
相关的 semgrep 规则类别:
python.requests.security.ssrf.*python.urllib.security.audit.ssrf.*javascript.fetch.security.ssrf.*java.net.security.audit.ssrf.*go.net.security.audit.ssrf.*
输出格式
使用 ../../shared/schemas/findings.md 中的发现项架构。
- ID 前缀:
SSRF(例如SSRF-001) - metadata.tool:
ssrf - metadata.framework:
owasp - metadata.category:
A10 - references.owasp:
A10:2021 - references.stride:
I(信息泄露)或E(权限提升)
此类别的严重性指导:
- critical:SSRF 指向云元数据端点(169.254.169.254);未认证端点且没有 URL 验证
- high:SSRF 指向内部网络且没有 IP 范围拦截;对用户提供的 URL 启用了重定向跟随
- medium:部分 URL 验证(检查了 scheme,但未验证 IP);可能发生 DNS 重绑定
- low:仅在内部服务中存在 SSRF 风险,且该服务未向外部用户开放;使用部分受控的输入构造 URL