一句话版本
很多功能需要服务器"去访问一个用户给的网址":抓取链接预览、导入图片、调用 Webhook、AI 的网页浏览工具。如果不加限制,攻击者就可以给一个内网地址,让服务器替他去访问外人本来碰不到的东西。这叫服务端请求伪造(SSRF)。
在云环境里,最危险的目标是云元数据接口(169.254.169.254):访问它就能拿到这台服务器的临时云凭证。2019 年 Capital One 约 1 亿客户数据泄露,关键一步就是这个。
全文分三层:
- 通俗理解:让前台帮你去机房拿东西
- 实际用处:Capital One 事件、链接预览、AI 浏览工具
- 原理与工程要点:常见目标、绕过手法、防御清单
第一层:通俗理解
1.1 让前台帮你去机房拿东西
一家公司的前台提供一项服务:"你给我一个地址,我帮你去取件。"外人进不了公司内部,但前台可以。
如果前台不检查地址,有人就会说:"请帮我去三楼机房,把服务器上的那个文件拿出来。"前台照做了。
服务器就是这个前台。它通常位于内网,能访问数据库、管理后台、云平台的内部接口,而这些都是外人直接访问不到的。
1.2 为什么越来越常见
"服务器替用户访问一个网址"的功能越来越多:
- 社交和聊天软件的链接预览;
- "从网址导入"图片、文件;
- Webhook 回调;
- PDF 生成(渲染一个包含外部资源的 HTML);
- AI Agent 的网页浏览和抓取工具。
第二层:实际用处
- Capital One(2019):攻击者利用一个配置错误的 Web 应用防火墙存在的 SSRF,访问了 AWS 的实例元数据接口,拿到该实例角色的临时凭证;而这个角色的权限过大,能读取大量存储桶。最终约 1 亿美国客户和约 600 万加拿大客户的数据被盗。此事件之后,AWS 推出了需要令牌的元数据服务 IMDSv2。
- 漏洞赏金中的常客:SSRF 是各大公司漏洞赏金计划中最常见的高危漏洞之一,常出现在图片代理、链接预览、文件导入、Webhook 等功能里。
- AI 工具:给 AI 提供"抓取网页"工具的服务,如果在内网或云上运行,就必须防 SSRF,否则用户(或被注入的模型)可以让工具去访问元数据接口和内网服务。
第三层:原理与工程要点
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;最小权限 |