SSRF(Server-Side Request Forgery,服务器端请求伪造)是 Web 安全中高频高危漏洞之一,常被用于攻击内网未暴露服务、读取敏感文件、端口扫描等。
目录
[一、SSRF 漏洞核心原理](#一、SSRF 漏洞核心原理)
[1.1 定义](#1.1 定义)
[1.2 攻击流程](#1.2 攻击流程)
[1.3 成因分析](#1.3 成因分析)
[1.4 核心危害](#1.4 核心危害)
[二、SSRF 漏洞挖掘技巧](#二、SSRF 漏洞挖掘技巧)
[2.1 功能场景挖掘](#2.1 功能场景挖掘)
[2.2 URL 关键字挖掘](#2.2 URL 关键字挖掘)
[2.3 漏洞验证方法](#2.3 漏洞验证方法)
[三、SSRF 漏洞具体利用](#三、SSRF 漏洞具体利用)
[3.1 常用协议及用途](#3.1 常用协议及用途)
[3.2 典型利用场景](#3.2 典型利用场景)
[四、SSRF 防御与绕过技巧](#四、SSRF 防御与绕过技巧)
[4.1 核心防御措施](#4.1 核心防御措施)
[4.2 常见绕过技巧](#4.2 常见绕过技巧)
[五、靶场实战(CTFhub 经典题型)](#五、靶场实战(CTFhub 经典题型))
[5.1 进入ssrf练习平台(CTFHub)](#5.1 进入ssrf练习平台(CTFHub))
[5.2 内网访问(CTFHub实战)](#5.2 内网访问(CTFHub实战))
[5.3 伪协议读取文件(CTFHub实战)](#5.3 伪协议读取文件(CTFHub实战))
[5.4 端口扫描(CTFHub实战)](#5.4 端口扫描(CTFHub实战))
[六、SSRF vs CSRF 易混淆点对比](#六、SSRF vs CSRF 易混淆点对比)
一、SSRF 漏洞核心原理
1.1 定义
攻击者通过有漏洞的 Web 应用,以服务器身份发起伪造请求,攻击外网无法直接访问的内网系统或本地资源(本质是服务器充当 "跳板")。
1.2 攻击流程

1.3 成因分析
服务器提供了 "远程获取资源" 功能,但未对用户输入的 URL/IP 做过滤限制,常见危险函数如下:
| 危险函数(PHP) | 功能描述 | 风险点 |
|---|---|---|
curl_exec() |
执行 HTTP/HTTPS 等协议请求 | 支持多协议(file/dict 等),未过滤则可跨网段访问 |
file_get_contents() |
读取本地 / 远程文件 | 可通过php://伪协议读取源码、file://读本地文件 |
fsockopen() |
建立网络连接并读写数据 | 可探测端口存活状态 |
1.4 核心危害
- 内网探测:扫描内网主机存活状态、开放端口
- 敏感数据泄露:读取服务器本地文件(/etc/passwd、配置文件等)
- 内网服务攻击:利用内网应用漏洞(如 Redis 未授权访问)
- 端口利用:攻击开放端口对应的服务(如 8080 Tomcat、3306 MySQL)
二、SSRF 漏洞挖掘技巧
2.1 功能场景挖掘
所有 "需要用户输入 URL/IP" 的功能都可能存在漏洞,汇总如下:
| 功能场景 | 示例场景 | 风险点 |
|---|---|---|
| 社交分享 | 分享链接时获取网页标题 | 未过滤目标 URL 可指向内网 |
| 在线翻译 | 翻译指定 URL 的网页内容 | 服务器代访问输入的地址 |
| 图片加载 / 下载 | 富文本编辑器远程图片上传 | image=参数未过滤协议 |
| 转码服务 | 网页适配手机屏幕转码 | 代访问用户输入的 URL |
| 未公开 API | 网站评分、远程资源加载 | API 参数(如sourceURL)未校验 |
| 云服务状态检测 | 云厂商判断网站是否存活 | 探测逻辑可被篡改指向内网 |
2.2 URL 关键字挖掘
通过 Google 语法 + 关键字搜索潜在漏洞点,关键字汇总:
| 核心关键字 | 扩展关键字 | 搜索语法示例 |
|---|---|---|
| url | sourceURL、imageURL | inurl:"sourceURL" site:xxx.com |
| link | target、domain | inurl:"link" + "http://" |
| share | wap、3g | inurl:"share" + "url=" |
| display | SIC、source | inurl:"display" + "ip=" |
2.3 漏洞验证方法

三、SSRF 漏洞具体利用
3.1 常用协议及用途
| 协议 | 核心作用 | 实战示例 Payload |
|---|---|---|
| http:// | 探测内网主机存活、端口扫描 | ?url=http://127.0.0.1:8080 |
| file:// | 读取服务器本地文件 | ?url=file:///etc/passwd(Linux)、file:///C:/WINDOWS/win.ini(Windows) |
| dict:// | 泄露软件版本、端口探测 | ?url=dict://127.0.0.1:6379/info(Redis 版本) |
| gopher:// | 发送 POST/GET 请求、攻击内网应用 | ?url=gopher://127.0.0.1:80/_GET /flag.php HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n |
| php:// | 读取 PHP 源码(伪协议) | ?url=php://filter/read=convert.base64-encode/resource=ssrf.php |
3.2 典型利用场景
| 利用场景 | 操作步骤 | 示例结果 |
|---|---|---|
| 内网访问 | 拼接内网 IP + 目标文件 | ?url=http://127.0.0.1/flag.php(CTF 常见) |
| 读取敏感文件 | 使用 file:// 协议指定文件路径 | 获得 /etc/passwd 用户列表 |
| 端口扫描 | 遍历端口 + http/dict 协议 | 200 状态码 = 端口开放,503 = 未开放 |
| 读取 PHP 源码 | php://filter 伪协议 Base64 编码读取 | 解码后得到服务器脚本源码 |
四、SSRF 防御与绕过技巧
4.1 核心防御措施
| 防御方向 | 具体操作 | 效果 |
|---|---|---|
| 过滤 URL/IP | 黑名单:内网 IP(127.0.0.1、192.168.0.0/16 等) | 阻止直接访问内网 |
| 限制协议 | 仅允许 http/https,禁用 file/dict/gopher 等 | 避免本地文件读取 / 端口探测 |
| 限制端口 | 仅开放 80、443、8080 等常用端口 | 减少端口攻击面 |
| 统一错误信息 | 隐藏 "端口未开放""文件不存在" 等具体提示 | 防止攻击者判断状态 |
| 验证返回内容 | 校验返回数据是否符合预期(如仅允许图片格式) | 避免泄露敏感信息 |
4.2 常见绕过技巧
| 绕过方法 | 原理 | 实战示例 |
|---|---|---|
| @符号绕过 | URL 中@后才是真实访问地址 |
http://notfound.ctfhub.com@127.0.0.1/flag.php |
| 进制转换 | 点分十进制 IP 转其他进制(八 / 十六 / 十) | 127.0.0.1 → 八进制0177.0.0.1、十进制2130706433 |
| 短地址跳转 | 短链接解析后指向内网 IP | 把http://127.0.0.1/flag.php转为短链接https://shorturl.at/gszD2 |
| 特殊域名 | xip.io 等域名解析为指定 IP | 127.0.0.1.xip.io → 解析为 127.0.0.1 |
| 302 跳转 | 服务器跟随 302 重定向,指向内网 | 构造公网跳转页面,重定向到127.0.0.1 |
| DNS 重绑定 | 域名多次解析为不同 IP(公网→内网) | 生成绑定 127.0.0.1 的域名7f000001.c0a80001.rbndr.us |
| 特殊符号替换 | 用。代替.,绕过 IP 过滤 |
127。0。0。1 → 等效 127.0.0.1 |
五、靶场实战(CTFhub 经典题型)
| 题型 | 解题思路 | 核心 Payload |
|---|---|---|
| 内网访问 | 直接访问 127.0.0.1/flag.php | ?url=http://127.0.0.1/flag.php |
| 伪协议读取文件 | 使用 file:// 协议读取 /var/www/html/flag.php | ?url=file:///var/www/html/flag.php |
| 端口扫描 | Burp Intruder 遍历 8000-9000 端口 | ?url=http://127.0.0.1:8628(示例开放端口) |
| URL Bypass | @符号绕过 "必须包含指定域名" 限制 | ?url=http://notfound.ctfhub.com@127.0.0.1/flag.php |
| 数字 IP Bypass | 进制转换 /localhost绕过 IP 黑名单 | ?url=http://localhost/flag.php |
| 302 跳转 Bypass | 短链接跳转指向内网 | ?url=https://shorturl.at/gszD2 |
| DNS 重绑定 Bypass | 使用 DNS 重绑定工具生成目标域名 | ?url=http://7f000001.c0a80001.rbndr.us/flag.php |
5.1 进入ssrf练习平台(CTFHub)
进入ctfhub平台(https://www.ctfhub.com/),注册一个账户,点击顶上的技能树,点击web

点击ssrf

5.2 内网访问(CTFHub实战)
点击内网访问,点击开启题目

复制题目给出的链接,并且题目的提示是叫我们访问127.0.0.1下的flag.php

复制题目给的网址,可以看见网址后面自动显示了一个url=_ 的一个标签,很明显需要我们填网址,再加上题目的提示,所以我们去掉横线,输入
127.0.0.1/flag.php

可以看见给出了一串代码,这个就是我们需要提交的flag。全部复制下来

复制这flag代码(记住他的格式,后续的flag的格式样子都长这样)
ctfhub{4ce13e02b42995aa0fe547e3}
返回ctfhub平台的这道题,粘贴进去,点击提交flag

右上角弹窗显示成功就代表成功了

接着第二题
5.3 伪协议读取文件(CTFHub实战)
点击开启题目

可以看到有一个网址,然后题目的提示是读取web目录下的flag.php,这里就要用到读取文件的file:///协议了

题目说的是web目录下的flag.php,我查了一下,web目录指的是var/www,正常后面都会接个html,如果没有的话再考虑后面没有html目录的情况

所以这里的网址的url为
file:///var/www/html/flag.php
输入进去回车

发现出现了3个❓,查看源代码看看

结果找到了flag代码,复制下来
ctfhub{c7989a71ba81a196ec12b18e}

返回题目,粘贴,提交

成功

5.4 端口扫描(CTFHub实战)
打开burp suite抓包工具拦截模式(不会下载安装使用的参考我往期作品点击跳转👈)

打开浏览器的代理工具,以及配置的bp代理(不会的参考往期作品点击跳转👈)

打开题目复制的网址,然后url填写一个127.0.0.1,后面的端口随便填写,方便我们进行爆破

打开bp发现包已经拦截成功,右键界面,发送到爆破模块intruder

点击进入intruder,positions,点击右边clear删除所有标记

选中端口8080,点击右边的add添加

然后端口8080会变成绿色

然后点击payloads,如图进行设置参数

最后点击start attack直接进行爆破,等待一会时间

发现有一个不一样的,端口为8628,所以端口就是这个了

直接访问,发现flag代码出来了

直接复制
ctfhub{5c283ab9b860387840ad49d5}
粘贴到题目中提交

后续题目感兴趣的也可以自行尝试
六、SSRF vs CSRF 易混淆点对比
| 对比维度 | SSRF(服务器端) | CSRF(客户端) |
|---|---|---|
| 攻击发起方 | 有漏洞的 Web 服务器 | 受害者的浏览器 |
| 核心原理 | 服务器未过滤请求,充当跳板 | 利用用户 Cookie,伪造用户操作 |
| 攻击目标 | 内网服务、服务器本地资源 | 用户有权限的 Web 应用 |
| 触发条件 | 输入恶意 URL/IP | 诱导用户点击恶意链接 / 访问页面 |
七、学习总结与建议
- 挖掘核心:凡输入 URL/IP 的功能,皆可测试 SSRF(分享、翻译、图片加载等)
- 利用优先级:
伪协议读文件>内网端口扫描>内网服务攻击 - 防御核心:"白名单 + 协议限制 + 返回校验" 三重防护,黑名单易被绕过
- 实战建议:多刷 CTFhub SSRF 专题,重点练习 "绕过技巧" 和 "协议利用"
- 法律红线:测试需获得授权,禁止未授权扫描他人服务器
八、补充工具推荐
- 漏洞验证:Burp Suite(抓包 + Intruder 端口扫描)
- 短链接生成:https://shorturl.at/、https://www.urlc.cn/
- DNS 重绑定:https://lock.cmpxchg8b.com/rebinder.html
- 端口扫描脚本:Python + requests 库(批量检测内网端口存活)
最后:SSRF 的核心是 "服务器跳板",掌握协议利用和绕过技巧,就能应对大部分实战场景。建议结合靶场练习,把每个利用场景和绕过方法动手实操一遍,加深理解~