mcpField
S
ssrf

ssrf

github.com/florianbuetow安全2060 次安装3 周前更新
代码仓库

关于 ssrf

用于检测服务端请求伪造风险的代码审查技能,面向分析出站请求逻辑的安全审查人员。它结合扫描器结果与手动追踪,检查 URL 输入、验证、重定向、DNS 解析及云元数据访问。

主要功能

  1. 01限定相关文件的分析范围
  2. 02检查 URL 输入与协议验证
  3. 03追踪内网 IP 和元数据访问
  4. 04检查重定向与 DNS 重绑定
  5. 05集成 semgrep、bandit 和 gosec
  6. 06输出含修复建议及引用的发现

适用场景

  1. 01审计 webhook 和回调处理程序
  2. 02审查 URL 预览与导入代码
  3. 03检查云元数据暴露风险
  4. 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 检测扫描器:

  1. semgrep —— SSRF 模式的主要扫描器(用于 URL 流的污点分析)
  2. bandit —— Python 专用请求模式
  3. gosec —— Go HTTP 客户端模式

记录哪些扫描器可用,哪些缺失。

3. 运行扫描器(如果可用)

如果 semgrep 可用,则运行针对 SSRF 的规则:

semgrep scan --config auto --json --quiet <target>

筛选出与 SSRF、URL 获取和请求伪造模式匹配的规则结果。 将输出规范化为发现项架构。

4. Claude Code 分析

无论扫描器是否可用,都要手动分析代码:

  1. 来自用户输入的 URL:查找 HTTP 客户端调用(fetch、requests、http.get 等),并追踪 URL 或其任何组成部分是否源自用户输入(查询参数、请求正文、标头、路径参数)。
  2. URL 协议验证:检查 URL 协议是否仅限于 http:// 和 https://,并阻止 file://、gopher://、dict://、ftp:// 及其他危险协议。
  3. 阻止内部 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)。
  4. 云元数据保护:检查是否会阻止访问云元数据端点(169.254.169.254、metadata.google.internal、169.254.170.2),以及是否在 AWS 上强制使用 IMDSv2。
  5. 重定向处理:确认 HTTP 重定向已禁用,或每次跳转都会经过验证,以防止通过重定向绕过 SSRF 防护。
  6. 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 中的一个检测模式。

  1. 将来自用户输入的 URL 传递给 HTTP 客户端——任何 HTTP 请求函数(fetch、requests.get、http.Get、HttpClient)使用未经验证且源自用户可控输入的 URL 调用。

  2. 缺少 URL 协议白名单——URL 验证未将协议限制为 http/https,因而允许 file://、gopher:// 或其他危险协议。

  3. 未阻止内部 IP 范围——向用户提供的 URL 发起出站请求前,未检查解析出的 IP 是否属于私有/保留范围,从而可能导致内部网络扫描和服务访问。

  4. 可访问云元数据端点——未专门阻止访问 169.254.169.254(AWS/Azure/GCP 元数据)、metadata.google.internal 或 169.254.170.2(ECS 任务元数据),可能导致云环境凭据被窃取。

  5. 跟随用户提供 URL 的重定向——HTTP 客户端配置为在获取用户提供的 URL 时跟随重定向,使攻击者能够将请求从允许的域名重定向到内部目标,从而绕过 URL 验证。

  6. DNS 重绑定漏洞——URL 验证时会解析主机名并检查其 IP,但实际 HTTP 请求会再次解析该主机名,使攻击者能够利用 TTL 较短的 DNS 记录,在第二次解析时返回不同的(内部)IP。

  7. 经由文档处理器引发的间接 SSRF——PDF 生成器(wkhtmltopdf、Puppeteer)、SVG 渲染器、XML 解析器(XXE)或 Webhook 注册端点在缺少 SSRF 防护的情况下获取 URL。

扫描器集成

扫描器覆盖范围命令
semgrep用户输入中的 URL,以及通过请求调用进行污点跟踪semgrep scan --config auto --json --quiet <target>
bandit使用用户输入的 Python requests/urllibbandit -r <target> -f json -q
gosec使用用户输入的 Go net/httpgosec -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

评论

支持 Markdown