Caloogy 文章
English

SSRF:让服务器替你访问内网

日期
2025 年 4 月 8 日
系列
基础设施
阅读
3 分钟
主题
InfraSsrfCloud metadataImdsv2

一句话版本

很多功能需要服务器"去访问一个用户给的网址":抓取链接预览、导入图片、调用 Webhook、AI 的网页浏览工具。如果不加限制,攻击者就可以给一个内网地址,让服务器替他去访问外人本来碰不到的东西。这叫服务端请求伪造(SSRF)。 在云环境里,最危险的目标是云元数据接口(169.254.169.254):访问它就能拿到这台服务器的临时云凭证。2019 年 Capital One 约 1 亿客户数据泄露,关键一步就是这个。

全文分三层:

  1. 通俗理解:让前台帮你去机房拿东西
  2. 实际用处:Capital One 事件、链接预览、AI 浏览工具
  3. 原理与工程要点:常见目标、绕过手法、防御清单

第一层:通俗理解

1.1 让前台帮你去机房拿东西

一家公司的前台提供一项服务:"你给我一个地址,我帮你去取件。"外人进不了公司内部,但前台可以。

如果前台不检查地址,有人就会说:"请帮我去三楼机房,把服务器上的那个文件拿出来。"前台照做了。

服务器就是这个前台。它通常位于内网,能访问数据库、管理后台、云平台的内部接口,而这些都是外人直接访问不到的。

1.2 为什么越来越常见

"服务器替用户访问一个网址"的功能越来越多:


第二层:实际用处


第三层:原理与工程要点

3.1 常见目标

目标 后果
云元数据接口 169.254.169.254 拿到实例的临时云凭证、用户数据脚本
localhost / 127.0.0.1 上的管理端口 访问只对本机开放的管理接口、数据库、缓存
内网的其他服务 内部 API、监控面板、CI 系统
文件协议 file:// 读取服务器本地文件

3.2 常见绕过手法(防御时要考虑到)

手法 说明
IP 的其他写法 十进制、八进制、IPv6 映射地址都可能指向 127.0.0.1
重定向 先访问一个合法的外部地址,它再 302 跳转到内网地址
DNS 重绑定 一个域名第一次解析时返回合法外部 IP(通过检查),第二次解析时返回内网 IP(实际请求)
解析差异 校验网址的代码和真正发请求的代码对网址的解析结果不同

所以"检查网址字符串里有没有 localhost"是远远不够的。

3.3 防御清单

层次 措施
网络 发起外部请求的服务放在独立的网络区域,从网络层面就无法访问内网和元数据接口(最可靠,见《网络出口控制》)
解析后校验 先把域名解析成 IP,用这个 IP 发请求,并检查它不在私有、回环、链路本地等地址段
重定向 禁止自动跟随重定向,或每次跳转都重新校验
协议 只允许 http / https
云元数据 强制 IMDSv2(需要先用 PUT 请求获取令牌,普通 SSRF 很难做到);不需要时直接禁用;容器里阻断
最小权限 实例角色只给必需的权限,SSRF 成功了损失也有限(见《最小权限与密钥管理》)
响应 不把抓取到的原始内容(尤其是错误信息)直接返回给用户

3.4 对 AI 工具的特别提醒

AI 的网页工具除了要防 SSRF,还要考虑:抓取到的内容可能包含注入指令(见《间接提示词注入》),而模型可能被引导去访问攻击者指定的地址(见《Markdown图片数据外泄》)。最好的做法是让抓取服务运行在一个只能访问公网、完全碰不到内网的隔离环境里。


总结

层次 要点
直觉 让前台替你去机房拿东西
最危险目标 云元数据接口:拿到临时凭证(Capital One)
绕过 IP 变形、重定向、DNS 重绑定、解析差异
防御 网络隔离最可靠;解析后按 IP 校验;IMDSv2;最小权限