一、漏洞原理
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
- 利用链:
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 注入 → RCESSRF 直接变成远程命令执行三、修复与绕过
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,通常用于初始化脚本)
不同云厂商的元数据服务
云平台地址常见敏感路径AWShttp://169.254.169.254/latest/meta-data//iam/security-credentials/ 获取临时凭证GCPhttp://169.254.169.254/computeMetadata/v1/需要 Header:Metadata-Flavor: Google阿里云http://100.100.100.200/latest/meta-data//ram/security-credentials/ 获取凭证Azurehttp://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/
复制代码 返回角色名: - 再访问:
- 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 ...
复制代码 五、实战案例
之后更新哈~
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |