一、漏洞原理
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/
- 根据响应差异进行判断:
快速无回显
→ 端口开放关闭都有可能。慢速
→ 端口过滤(如防火墙等拒绝访问,没有返回包)快速报连接错误或服务器错误
→ 端口关闭。有返回内容
→ 服务可被访问,潜在危害更大。
- 构造内网 IP 和端口:
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 → RCESMTP
:发送邮件 → 钓鱼或垃圾邮件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:
{ "AccessKeyId": "AKIAxxx", "SecretAccessKey": "xxx", "Token": "xxx", "Expiration": "2025-09-10T12:00:00Z" }
-
这些凭证可用于调用 AWS API,比如:
aws s3 ls --access-key ... --secret-key ... --token ...
五、实战案例
之后更新哈~
这一切,似未曾拥有