摘要:本文旨在系统性地解析SSRF(服务器端请求伪造)漏洞。内容涵盖其核心原理、常见成因、挖掘方法、具体利用手段、经典防御策略及其绕过技巧,并结合实战靶场(如CTFHub、Pikachu)案例进行说明。
目录
[一、 SSRF原理概述](#一、 SSRF原理概述)
[二、 SSRF漏洞挖掘](#二、 SSRF漏洞挖掘)
[三、 SSRF具体利用手法](#三、 SSRF具体利用手法)
[四、 SSRF防御与绕过](#四、 SSRF防御与绕过)
[五、 实战练习与总结](#五、 实战练习与总结)
一、 SSRF原理概述
1.1 什么是SSRF?
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造恶意请求,并由服务器端 代为发起此请求的安全漏洞。攻击者能够利用存在缺陷的Web应用作为代理,去攻击服务器所在内网或本地的其他服务。
简单比喻 :A(用户)让B(存在漏洞的服务器)去访问C(目标,通常是内网或本地的资源)。如果B在"不知情"(即未对A的请求目标做严格校验)的情况下执行了请求,就形成了SSRF。
1.2 漏洞成因
核心原因在于:服务器提供了从其他服务器获取数据的功能,但未对用户提供的目标地址(URL)进行充分的过滤与限制。
常见的危险函数包括:
-
file_get_contents():可读取本地/远程文件,支持多种协议。 -
fsockopen():打开网络Socket连接。 -
curl_exec():执行cURL会话,支持多种网络协议。
例如,一段不安全的PHP代码:
if(isset($_GET['url'])){
$url = $_GET['url']; // 未对用户输入的`url`参数做任何过滤
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch); // 服务器直接请求用户输入的URL
curl_close($ch);
echo $result;
}
1.3 主要危害
-
内网探测与端口扫描:探测内网存活主机及开放的服务端口。
-
读取本地敏感文件 :利用
file://等协议读取服务器本地的系统或应用文件(如/etc/passwd, Web源码)。 -
攻击内网应用:利用漏洞作为跳板,攻击内网中不可直接访问的Web应用或服务(如Redis, JBoss等)。
-
利用内外网Web漏洞:结合其他Web漏洞(如SQL注入、RCE)进行组合攻击。
二、 SSRF漏洞挖掘
挖掘SSRF的关键在于寻找服务器会代表用户发起网络请求的功能点。
2.1 从Web功能上寻找
-
社交分享功能:通过用户提供的URL获取网页标题、缩略图。
-
在线翻译:翻译指定URL的网页内容。
-
图片/文件加载与下载:编辑器远程加载图片、通过URL下载资源、远程设置头像。
-
转码服务:为适应移动端,对提供URL的网页进行转码(如百度、腾讯的转码服务)。
-
未公开的API接口:任何需要传入URL参数以获取远程资源的接口。
-
网站评分/测速:一些在线服务会访问目标网站进行评估。
2.2 从URL参数关键字中寻找
在功能测试或代码审计中,可关注以下常见参数名:
share, wap, url, link, src, source, target, display, sourceURL, imageURL, domain 等。利用Google语法(inurl:)结合这些关键字,可能发现存在漏洞的站点。
核心思路 :一切需要用户输入URL或IP地址的地方,都可能存在SSRF风险。
三、 SSRF具体利用手法
3.1 利用协议
SSRF利用常涉及以下协议:
-
http(s)://:探测内网、攻击Web应用。 -
file://:读取服务器本地文件。 -
dict://:获取服务Banner信息,探测端口。 -
gopher://:功能强大的协议,可用于构造GET/POST请求攻击多种内网服务(如Redis、MySQL)。 -
PHP伪协议(如
php://filter):读取服务器文件源码。
3.2 利用场景
-
访问内网资源 :
?url=http://192.168.1.1/admin或?url=http://127.0.0.1/flag.php。 -
读取本地文件 :
?url=file:///etc/passwd或?url=file:///C:/Windows/win.ini。 -
端口扫描:
-
使用
dict协议:?url=dict://127.0.0.1:22(通过返回的Banner或错误信息判断)。 -
使用
http协议:?url=http://127.0.0.1:8080(通过HTTP状态码差异判断,如200、503、超时等)。常用工具(如Burp Suite Intruder)进行批量探测。
-
-
攻击内网应用 :结合
gopher等协议攻击内网的Redis、FastCGI等服务。
3.3 漏洞验证
-
排除法一(外网请求) :输入外部地址(如
http://www.baidu.com),观察返回内容是否为百度页面。如果是,则可能存在问题。 -
排除法二(流量分析) :使用抓包工具(如Burp Suite)。如果请求图片等资源的流量是由客户端浏览器 直接发出,则非SSRF;如果该请求是由服务器端发起再返回给客户端,则可能存在SSRF。
四、 SSRF防御与绕过
4.1 防御思路
-
过滤与校验 :对用户输入的URL进行严格过滤,禁止内网IP、私有地址段(如
127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16)。 -
限制协议 :仅允许
http和https协议,禁用file、gopher、dict、ftp等危险协议。 -
限制端口:只允许访问Web常用端口(如80, 443, 8080, 8090)。
-
统一错误信息:避免通过差异化的错误信息暴露端口或服务状态。
-
验证响应内容:服务器获取远程内容后,应校验其格式是否合法(如图片头、文件类型)。
-
禁止跳转:处理302/307等跳转,防止利用重定向绕过黑名单。
4.2 常见绕过技巧
当防御措施不完善时,攻击者可尝试以下绕过方法:
-
利用
@符号 :http://example.com@127.0.0.1,实际请求的是127.0.0.1。 -
使用非常见IP格式:
-
八进制:
0177.0.0.1->127.0.0.1 -
十六进制:
0x7f.0.0.1->127.0.0.1 -
十进制:
2130706433->127.0.0.1 -
省略点:
127.0.0.1->127.1
-
-
利用域名解析特性:
-
特殊域名:
127.0.0.1.xip.io解析为127.0.0.1。 -
DNS重绑定攻击:利用域名TTL过期后重新解析到内网IP的特性。
-
-
利用URL编码/封闭式字母数字 :对IP或点号进行编码或使用特殊字符(如
127。0。0。1,127。0。0。1)。 -
利用短网址服务:将内网地址生成短链,以绕过对明文内网IP的检测。
-
使用非HTTP协议 :如果未完全禁用,可尝试
dict://、sftp://、ldap://、tftp://等协议。
五、 实战练习与总结
5.1 推荐靶场
Pikachu靶场:提供基础的SSRF利用场景(外网访问、文件读取、端口探测)。
CTFHub技能树-SSRF板块:提供体系化的挑战,涵盖基础利用及各种Bypass技巧(如数字IP绕过、302跳转绕过、DNS重绑定等),是深入学习的最佳路径。
5.2 核心总结
漏洞入口广泛:任何允许用户提交URL/IP地址的功能点都应被纳入测试范围。
利用链丰富 :SSRF不仅是信息泄露漏洞,更是进入内网的"桥梁"。结合file协议可读文件,结合gopher等协议可攻击内网服务,危害极大。
防御需多层:单一的黑名单过滤极易被绕过。应采取"白名单+协议/端口限制+禁止跳转"的综合防护策略,并对服务器出站流量进行监控。
持续学习:SSRF的绕过技巧与防御手段在不断演变,需关注最新的绕过技术(如利用云服务元数据、新型协议等)。
学习SSRF的过程,是理解Web应用作为"网络代理"这一角色所面临风险的过程。唯有深刻理解其原理,才能有效地挖掘与防御。