一、漏洞原理
1.1 核心
SSRF(Server-Side Request Forgery),即服务器端请求伪造。说白了,就是控制了一个内部服务器帮你发送网络请求。该网络请求可以用http/https协议, 也可能可以用dict/ftp/gopher协议。由于其他服务器信任该内部服务器,所以就相当于掌握了一个只会发包的间谍帮你发包,常常起到绕过防火墙,权限访问的作用。
1.2 原理详解
SSRF存在的条件如下
- 应用中存在功能点允许用户指定 URL,常见此类功能点有:
- 图片下载功能:
http://example.com/fetch?url=http://attacker.com/logo.png
- RSS 订阅、接口回调、在线文档解析等。
- 图片下载功能:
- 后端对url没有做严格校验,对一些危险的协议和目标地址没有做限制。
之后攻击者只需要进行一定的检测(见2.1),确认SSRF是否存在及危害程度利用方式,就可以对服务器进行一定程度的控制了。
二、检测与危害
2.1 检测方法
这里主要说明 黑盒检测 的思路与方式,白盒检测属于代码审计范畴,这里不过多阐述。
2.1.1 有回显检测------直接访问
- 适用场景:应用会将请求结果直接返回给前端(回显型 SSRF)。
- 方法:外网检测将url地址换成百度之类的地址看看有没有回显即可。内网检测访问一些内网文件(可能不是很高效,也可以用2.1.3的方法)
2.1.2 无回显外网检测------DNSLog
- 适用场景:应用没有返回请求结果(盲 SSRF)。
- 方法 :
- 使用dnslog平台或自己搭建。dnslog平台可以使用https://dig.pm/
- 控制url访问你的dnslog地址,有记录代表存在SSRF。
- 不止可以用http/https协议,gopher/dict/ftp这些都试试,测试的时候多换换子域名,避免其实访问了但是没重复解析的记录。
2.1.3 内网检测------端口探测
- 适用场景:确认 SSRF 能否访问内网,并进行端口/服务探测。
- 方法 :
-
构造内网 IP 和端口:
http://target.com/fetch?url=http://192.168.0.1:8080/
-
根据响应差异进行判断:
- 快速无回显 → 端口开放关闭都有可能。
- 慢速 → 端口过滤(如防火墙等拒绝访问,没有返回包)
- 快速报连接错误或服务器错误 → 端口关闭。
- 有返回内容 → 服务可被访问,潜在危害更大。
-
2.2 利用与危害
2.2.1 内网服务探测与访问
- 思路:目标服务器通常部署在防火墙或网关后,能访问内网资源
- 利用点 :
- 扫描内网端口,确认存活主机与服务
- 访问只对内开放的 HTTP 管理面板(如 Jenkins、Zabbix、Weblogic Console)
- 访问敏感接口
2.2.2 云平台元数据服务利用
- 思路 :云厂商提供的元数据服务(Metadata Service),常见在
http://169.254.169.254
- 利用点 :
- AWS:
/latest/meta-data/iam/security-credentials/
获取临时凭证 - GCP / 阿里云 / 腾讯云:类似接口获取 API Key / Access Token
- AWS:
- 利用链 :
SSRF → 访问元数据 → 获取云凭证 → 接管云账户(如启动实例、读写存储、注入代码)
2.2.3 gopher/file/dict协议
-
思路:当 SSRF 点支持 gopher://、file:// 等协议
-
利用点:
-
gopher:// → 精确构造 TCP payload,例如:
- 操纵 Redis 写入恶意数据
- 操纵 SMTP 发邮件
- 攻击 FastCGI → 触发 PHP 执行
-
file:// → 读取本地文件(如 /etc/passwd、源码文件、配置文件)
-
-
利用链 :
SSRF → gopher → 内网服务命令执行 → RCE
2.2.4 绕过访问控制 / 防火墙限制
- 思路:SSRF 让目标服务器代替攻击者发请求
- 利用点 :
- 绕过 IP 白名单(服务器自己在白名单里)
- 绕过防火墙(外部禁止访问,但服务器可内部访问)
- 通过 302 跳转、DNS rebinding 绕过限制规则
- 访问敏感信息/敏感接口
5. DoS / DDoS 利用
-
思路:利用 SSRF 让服务器对某个地址发大量请求
-
利用点:
- 对目标外部站点发动反射型 DDoS
- 大量请求消耗本地资源,导致目标服务器性能下降
危害等级 | 典型场景 | 说明 |
---|---|---|
低危 | 外网 HTTP 请求、探测存活 | 只能当跳板,没有直接危害 |
中危 | 内网端口扫描、敏感信息泄露 | 可辅助内网渗透 |
高危 | 元数据服务访问、内网接口接管 | 云凭证泄露、系统敏感接口暴露 |
严重 | gopher 等协议利用 → Redis/DB 注入 → RCE | SSRF 直接变成远程命令执行 |
三、修复与绕过
1. 严格限制协议
-
修复措施:
- 仅允许
http/https
协议 - 禁用
file://
、gopher://
、ftp://
、dict://
等危险协议
- 仅允许
-
绕过技巧:
- 协议变形 :
hTtP://
、HtTpS://
(大小写混合) - URL 伪装 :
http://127.0.0.1@evil.com/
实际请求的是evil.com
,但看起来像访问内网 - URL 编码 :
http://%31%32%37.0.0.1/
- 协议变形 :
2. 限制可访问的目标地址
-
修复措施:
- 拒绝内网 IP 段:127.0.0.0/8、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16
- 拒绝云服务元数据 IP:
169.254.169.254
、100.100.100.200
等
-
绕过技巧:
-
IP 表示绕过:
- 十进制:
2130706433
=127.0.0.1
- 八进制:
0177.0.0.1
- 十六进制:
0x7f.0x00.0x00.0x01
- IPv6:
[::ffff:127.0.0.1]
- 十进制:
-
DNS Rebinding:
a.evil.com
第一次解析 → 外网 IP- 稍后解析 → 内网 IP
-
子域名绕过:
- 白名单
*.trusted.com
- 攻击者注册
evil.trusted.com
- 白名单
-
3. DNS 解析安全
-
修复措施:
- 使用固定解析器
- 检查解析结果是否落在黑名单网段
-
绕过技巧:
- DNS Rebinding(经典):短 TTL + 多次解析结果变化
- DNS 响应污染:攻击者控制权威 DNS 伪造响应
四、补充说明
4.1 gopher协议
gopher 协议是什么
- 原始用途:gopher 是 1990 年代早期的网络协议,用于客户端访问远程文件或目录。
- 特点 :它是 纯 TCP 协议,不像 HTTP 那样有复杂的封装,你可以直接发送任意字节到目标 TCP 服务。
- 核心优势 :可以构造 任意 TCP payload,不局限于文本或 HTTP 格式。
为什么gopher很危险
一些 SSRF 防护只限制 HTTP/HTTPS,但 gopher 可以访问 Redis、SMTP、MySQL 等 TCP 服务,直接发送payload实现利用。http/https协议大多时只能访问一些敏感信息,而gopher很多时候通过Redis可以直接RCE.
可利用服务举例:
- Redis:写入恶意 key、修改 cron → RCE
- SMTP:发送邮件 → 钓鱼或垃圾邮件
- MySQL/PostgreSQL:执行 SQL 命令
- FastCGI/PHP-FPM:发送请求触发命令执行
4.2 元数据服务
元数据服务是什么
-
概念 :
云平台(如 AWS、阿里云、腾讯云、GCP)为了让 云主机(虚拟机/容器) 获取自身信息,提供了一个 特殊的内网 HTTP 服务 ,称为 Instance Metadata Service (IMDS) 。通常固定在内网保留地址:http://169.254.169.254/ ,这是一个特殊的 链路本地地址(只能在云主机内部访问)。
-
作用:
- 提供主机自身信息(IP、主机名、地区)
- 提供身份凭证(临时 Access Key / Token)
- 提供用户自定义数据(User-Data,通常用于初始化脚本)
不同云厂商的元数据服务
云平台 | 地址 | 常见敏感路径 |
---|---|---|
AWS | http://169.254.169.254/latest/meta-data/ |
/iam/security-credentials/ 获取临时凭证 |
GCP | http://169.254.169.254/computeMetadata/v1/ |
需要 Header:Metadata-Flavor: Google |
阿里云 | http://100.100.100.200/latest/meta-data/ |
/ram/security-credentials/ 获取凭证 |
Azure | http://169.254.169.254/metadata/instance?api-version=2021-01-01 |
需要 Header:Metadata: true |
举个例子(AWS)
攻击者发现 SSRF,能访问任意 URL。
-
利用 SSRF 访问:
http://169.254.169.254/latest/meta-data/iam/security-credentials/
返回角色名:
my-ec2-role
-
再访问:
http://169.254.169.254/latest/meta-data/iam/security-credentials/my-ec2-role
返回 JSON:
json{ "AccessKeyId": "AKIAxxx", "SecretAccessKey": "xxx", "Token": "xxx", "Expiration": "2025-09-10T12:00:00Z" }
-
这些凭证可用于调用 AWS API,比如:
aws s3 ls --access-key ... --secret-key ... --token ...
五、实战案例
之后更新哈~