CTFshow SSRF实战进阶:从基础绕过到Gopher协议内网渗透
最近在整理CTF题目笔记时,发现SSRF这个漏洞类型在CTFshow系列中占据了相当重要的位置。从基础的本地文件读取到复杂的Gopher协议攻击内网服务,SSRF的利用场景远比想象中丰富。这篇文章我想结合自己的实战经验,系统梳理一下SSRF漏洞的利用技巧,特别是那些在CTF比赛中经常遇到的绕过手法和高级攻击方式。
如果你刚开始接触SSRF,可能会觉得它只是“让服务器帮你发请求”这么简单。但真正深入后会发现,这个漏洞的威力很大程度上取决于你对各种协议特性、网络架构和过滤机制的理解。我最初做CTFshow的SSRF题目时,也是从最简单的file://协议读文件开始,一步步遇到各种限制,然后被迫去学习各种绕过技巧,这个过程虽然痛苦,但收获确实很大。
1. SSRF基础与常见危险函数
SSRF(Server-Side Request Forgery)的核心在于“服务器端请求伪造”。简单来说,就是攻击者能够控制服务器向特定目标发起请求。这种漏洞之所以危险,是因为服务器通常位于内网或拥有更高的权限,能够访问到外部攻击者无法直接接触的资源。
1.1 PHP中常见的SSRF触发点
在PHP环境中,有几个函数特别容易引发SSRF问题:
curl_exec()函数族:这是最经典的SSRF触发点。curl_init()初始化cURL会话,curl_setopt()设置选项,curl_exec()执行请求。很多开发者在使用cURL时,没有对用户传入的URL进行严格过滤,导致攻击者可以控制请求目标。
<?php
// 典型的漏洞代码示例
$url = $_GET['url'];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
?>
file_get_contents()函数:这个函数不仅用于读取本地文件,也可以读取远程URL内容。当开发者使用file_get_contents($_GET['url'])这样的代码时,就为SSRF打开了大门。
fsockopen()函数:这个函数用于打开网络套接字连接,虽然使用起来比cURL复杂,但同样可以用于发起任意网络请求。
注意:在实际代码审计中,不仅要关注这些函数本身,还要注意它们的配置选项。比如
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true)会跟随重定向,这可能被用于绕过某些过滤。
1.2 协议支持与利用场景
不同的函数和配置支持的协议有所不同,这直接影响了SSRF的利用面:
| 协议 | 典型用途 | 常见限制 |
|---|---|---|
file:// |
读取本地文件 | 通常被禁用或限制 |
http:// |
访问Web资源 | 最常用,限制也最多 |
https:// |
加密Web访问 | 同http |
gopher:// |
通用协议,可构造任意TCP数据 | 很多环境默认不支持 |
dict:// |
字典协议,可用于端口探测 | 使用较少 |
ftp:// |
文件传输协议 | 可用于文件上传 |
在实际的CTF题目中,出题人往往会逐步增加限制,迫使选手思考如何绕过。比如从最简单的无过滤,到限制协议类型,再到过滤特定关键词,最后到复杂的IP检测机制。
2. 基础绕过技巧与实战应用
CTFshow的SSRF题目


1万+

被折叠的 条评论
为什么被折叠?



