原理
SSRF(服务器端请求伪造)的本质是让服务器成为攻击者的代理。当应用程序需要"替用户"去访问一个远程资源时,如果未能对用户提供的目标地址进行严格限制,攻击者就能诱导服务器向本不该访问的内部系统发起请求。

漏洞位置
第一类是远程资源加载,比如远程图片加载、网页抓取、分享预览、在线文档生成、文件远程导入、RSS 订阅、在线翻译或转码。这类功能通常接受一个 URL 参数,服务器会根据这个地址去下载内容,如果没校验目标地址,就可能被用来访问内网或本地服务。
第二类是回调和代理类入口,比如 Webhook、回调地址、API 代理、网关转发、对象存储远程拉取。这些位置往往允许用户提供一个目标地址,服务器会向该地址发起请求,容易被当成跳板。
第三类是解析类入口,比如 XML、SVG、HTML 解析中如果支持外部实体或远程引用,也可能触发 SSRF。尤其是 XXE 和 SSRF 经常联动出现。
第四类是比较隐蔽的位置,比如请求头中的 X-Forwarded-For、Referer,或者后端把用户输入拼进 curl、requests、file_get_contents、HttpURLConnection 等网络请求函数时,也可能形成 SSRF。
伪协议
SSRF 里协议是"怎么让服务器发起请求"的关键。后端如果直接把用户输入交给 cURL、file_get_contents、requests、HttpURLConnection 这类网络请求函数,就可能被切换协议,访问本地文件、内网服务或云元数据。
HTTP / HTTPS
最基础,也最常见。
用途主要是让服务器访问原本从外网无法访问的内部资源。
常见利用:
- 访问内网 Web 服务,例如
http://127.0.0.1:8080/admin - 访问内网微服务、管理后台
- 访问云实例元数据,例如
http://169.254.169.254 - 探测内网端口是否开放,根据响应状态、延时或报错判断
示例:
http://127.0.0.1:8080/
https://169.254.169.254/latest/meta-data/
HTTP/HTTPS 本身不能直接发送任意 TCP 数据,但可以用来探测服务、读取返回内容,或触发内网 Web 漏洞。
FILE
用于访问服务器本地文件系统。
如果 SSRF 点有回显,file 协议常被用来读取本地敏感文件。
常见利用:
- 读取
/etc/passwd - 读取
/etc/hosts - 读取 Web 配置文件、日志、环境变量
- 读取应用源码或数据库配置
示例:
file:///etc/passwd
file:///var/www/html/config.php
file:///C:/Windows/System32/drivers/etc/hosts
防御上,file 协议通常应直接禁用,尤其不能让用户可控的 URL 进入文件读取函数。
DICT
DICT 是基于 TCP 的字典查询协议,但在 SSRF 里更多被用来探测端口和攻击内网服务,尤其是 Redis。
常见利用:
- 探测端口是否开放
- 识别服务指纹
- 攻击未授权 Redis,执行简单单行命令
示例:
dict://127.0.0.1:6379/info
dict://127.0.0.1:6379/keys:*
DICT 的限制是每次通常只能发送单行命令,复杂操作需要分步执行,并且要对特殊字符做编码。
GOPHER
Gopher 是 SSRF 里最强大的协议之一。
它可以构造原始 TCP 数据流,所以能攻击 Redis、FastCGI、SMTP、MySQL 等内网服务。
常见利用:
- 攻击内网 Redis,写 Webshell 或写计划任务反弹 Shell
- 攻击 FastCGI,执行系统命令
- 构造 HTTP GET/POST 请求访问内网服务
- 绕过只允许 HTTP/HTTPS 的简单校验
示例格式:
gopher://127.0.0.1:6379/_[编码后的TCP数据]
Gopher 的关键在于 URL 中 _ 后面的内容会被当作 TCP 数据发送给目标端口,所以可以拼出 Redis 命令、FastCGI 包或 HTTP 请求包。
FTP
FTP 主要用于文件传输,但在 SSRF 里危害相对弱一些,更多用于探测端口或尝试访问远程文件。
常见利用:
- 探测 FTP 端口是否开放
- 尝试访问远程 FTP 文件
- 某些环境下可能扩大协议攻击面
示例:
ftp://127.0.0.1:21/
ftp://user:pass@target/file
FTP 是否能被利用,取决于后端使用的网络库是否支持该协议,以及是否允许访问内网地址。
面试记忆版
- HTTP/HTTPS:访问内网 Web、探测端口、读云元数据。
- FILE:读本地文件。
- DICT:探测端口、识别服务、攻击 Redis。
- GOPHER:构造任意 TCP 数据,最危险。
- FTP:探测端口、访问远程文件,危害相对小。
最稳防御仍是:只允许 http/https,禁用 file、dict、gopher、ftp 等协议,再做 IP 白名单、DNS 解析后校验、禁止自动重定向和出站网络隔离。
防御
只允许 http/https
禁用 file://、gopher://、dict://、ftp:// 等危险协议。
域名/IP 用白名单,不用黑名单
能白名单就白名单;必须开放公网时,至少校验不是内网、回环、链路本地和云元数据地址。
DNS 解析后再校验 IP
域名解析出真实 IP,确认不在禁止网段;如果业务允许,把解析结果绑定到连接,防 DNS 重绑定。
禁止自动重定向
关闭 HTTP 客户端的 30x 自动跳转;必须跳转时,对最终目标重新校验协议、域名和 IP。
出站网络隔离
服务器出口流量禁止访问内网段和元数据地址,最好走受控出站代理。
常见绕过手法
绕过通常发生在"校验层"和"实际请求层"不一致时。
协议绕过:file://、gopher://、dict:// 等危险协议
本地回环绕过:localhost、127.0.0.1、::1、0、127.1 等
IP 变形:八进制、十六进制、十进制整数、混合进制
URL 解析差异:http://example.com@127.0.0.1、# 片段截断
重定向绕过:先通过白名单,再 301/302 跳转到内网
DNS 重绑定:首次解析返回公网 IP,二次解析返回内网 IP
短链接 / 开放重定向:用可信域名做跳板
NAT64 / IPv6 翻译:用 IPv6 地址绕过 IPv4 黑名单
危害
SSRF 的危险点在于它能穿透网络边界:
探测内网存活主机、端口
读取本地文件,如 file:///etc/passwd
访问内网管理后台、微服务、Redis、MySQL、FastCGI
窃取云实例元数据,例如 AWS/Aliyun/TencentCloud 的临时凭证
结合 Gopher/Dict 等协议攻击内网服务
触发 DoS,甚至链式利用实现 RCE