SSRF:让服务器替你访问内网的那类漏洞
任何「让服务端去访问一个 URL」的功能都可能是 SSRF:图片抓取、Webhook、PDF 渲染、URL 预览。
攻击者要的不是那个页面,而是通过服务器进入内网、读取云元数据、探测内部端口。
先说结论
网络层出网白名单为主,协议与地址校验为辅。 只做字符串黑名单一定被绕。
- 禁掉非 http/https 协议(file、gopher、dict)
- 解析后的 IP 必须校验,不能只校验域名
- 禁访问私有网段与云元数据地址
- 出网走代理并做白名单
漏洞是怎么产生的
SSRF 的绕过手法围绕「解析差异」:域名解析到内网 IP、十进制/八进制 IP、302 跳转、DNS 重绑定。
所以校验要发生在「实际连接前解析出的 IP」上,而不是原始字符串。
修复与验证
修复不是改一行代码,而是四件事一起做:
- 列出所有由外部控制 URL 的功能点
- 只允许 http/https,禁用重定向或限制跳转次数
- 解析域名得到 IP 后校验:拒绝私有网段、回环、链路本地、云元数据地址
- 出网统一走代理,代理侧做域名白名单
- 云上关闭实例元数据 v1,改用需要 token 的 v2
攻击面与检测点
按影响面排序,先修影响最大的:
| 绕过方式 | 原理 | 防御 |
|---|---|---|
| 十进制 IP | 解析成同一地址 | 解析后校验 IP |
| 302 跳转 | 首跳合法二跳内网 | 禁跳转或逐跳校验 |
| DNS 重绑定 | 两次解析结果不同 | 连接时用已校验的 IP |
| IPv6 映射 | ::ffff:127.0.0.1 | 统一转成规范地址再判断 |

几个容易踩的坑
下面这些是最常见的错误做法:
- 只校验域名后缀:解析到内网照样通
- 校验一次就发起请求:中间还可能跳转
- 忽略云元数据:169.254.169.254 可拿到临时凭证
- 把内网请求当成可信:内网也有横向风险
写在最后
SSRF 是网络问题,最好在网络层解决:默认不出网,需要出网的走白名单代理。
安全不是一次加固,是持续的假设:假设输入不可信、假设边界会破、假设有人会看错。
评论 (3)
修复清单比漏洞描述有用多了,很多文章只讲怎么打不讲怎么防。
白名单那条永远是最有效的,正则黑名单迟早绕过。
建议再补一条:把这类检查加到 CI 里,靠人记必然漏。
发表评论