目录
本文通过CTFHub的SSRF两个关卡(内网访问+伪协议读取文件)的渗透实战介绍了SSRF(服务器端请求伪造)的原理及利用方法,重点分析了File协议在SSRF攻击中的应用。文章首先阐述了SSRF的本质是滥用服务器请求代理能力,与CSRF的区别在于攻击发起者和目标不同。随后详细讲解了File协议的作用和利用方式,包括Linux/Unix和Windows系统下的经典攻击载荷,如读取/etc/passwd、配置文件等敏感信息。最后通过两个实战案例演示了如何利用SSRF访问内网资源和读取服务器文件,并提供了查看flag的两种方法:查看网页源代码或使用抓包工具。文章还给出了防范SSRF攻击的建议,如协议白名单制度、URL过滤等。
一、SSRF原理
1、本质
SSRF(Server-Side Request Forgery,服务器端请求伪造)是源于应用程序未对用户提供的目标地址做严格校验。SSRF 的本质是滥用服务器的 “请求代理能力”,打破 “客户端→服务器” 的常规交互逻辑,形成 “攻击者→服务器→目标资源” 的攻击链路。因请求由服务器发起,攻击者可借助服务器的内网访问权限、特殊端口权限等突破网络限制,访问或攻击自身无法直接触及的资源,比如探测内网主机与端口、读取服务器本地文件、攻击内网敏感服务(如file://
读取本地文件、dict://
探测端口、gopher://
发送原始数据包),甚至绕过 CDN 与 WAF。
2、区别
由于英文缩写的相似性,新手容易将 SSRF 与 “客户端请求伪造”(如 CSRF)混淆,两者核心区别如下表所示。
对比维度 | SSRF(服务器端请求伪造) | CSRF(跨站请求伪造) |
---|---|---|
请求发起者 | 服务器(由攻击者诱导) | 受害者的浏览器(被动触发) |
攻击目标 | 服务器可访问的资源(内网、第三方服务) | 受害者有权限的 Web 应用(如个人中心) |
核心依赖 | 服务器的请求能力与网络权限 | 受害者的登录状态(Cookie/Session) |
危害范围 | 可突破网络隔离,攻击内网 / 本地服务 | 仅能执行受害者权限内的操作(如改密码) |
二、SSRF File协议
1、File协议
File协议是一种本地文件访问协议,属于应用层协议,核心功能是让客户端(如浏览器、请求库)直接读取本地文件系统中的文件,无需通过 HTTP、FTP 等网络协议转发,仅适用于访问 “协议发起者所在设备的本地文件”(或可挂载到本地的文件系统)。其标准 URL 格式如下所示。
file://[主机名]/文件路径
file://
:协议标识,表明使用本地文件访问规则;[主机名]
:可选字段,默认省略时表示 “本地主机”(即发起请求的设备),若填写其他主机名(如file://192.168.1.100/
),需目标主机支持文件共享(如 SMB 协议)才能访问;文件路径
:本地文件的绝对路径,需使用正斜杠(/
)分隔目录,例如/etc/passwd
(Linux 系统)、C:/Windows/System32/drivers/etc/hosts
(Windows 系统)。
2、SSRF利用File协议
在 SSRF(服务器端请求伪造)攻击中,file
协议是常用的利用手段之一。file
协议是本地文件访问协议,允许直接读取服务器上的文件内容。当服务器存在 SSRF 安全风险且未限制file
协议时,攻击者可构造类似file:///etc/passwd
的恶意 URL,诱导服务器读取本地敏感文件。利用file
协议的典型 Payload 格式如下所示。
file:///绝对路径/文件名
其中三个斜杠表示本地文件系统。常见利用场景包括读取系统配置文件(如/etc/hosts
)、Web 应用配置(如数据库连接信息)、用户密码文件等。
(1)经典攻击载荷(Linux/Unix 系统):
文件路径 | 文件内容与攻击价值 |
---|---|
file:///etc/passwd |
用户账户信息。虽然密码已分离存储,但可枚举所有用户名。 |
file:///etc/shadow |
用户密码哈希。如果服务器进程以 root 权限运行,能读取此文件,则可尝试离线破解用户密码。 |
file:///proc/self/cwd/application.properties |
读取进程当前工作目录下的配置文件。/proc/self/cwd 是一个指向当前进程工作目录的符号链接,用于定位Web应用的配置文件。 |
file:///home/[用户名]/.ssh/id_rsa |
用户的 SSH 私钥。获取后可直接通过 SSH 免密登录服务器。 |
file:///home/[用户名]/.bash_history |
用户的历史命令。可能包含敏感操作、密码、访问密钥等信息。 |
file:///var/www/html/config.php |
Web 应用配置文件。可能包含数据库密码、密钥等敏感信息。 |
file:///proc/self/environ |
进程环境变量。可能包含密码,密钥等被传入环境中的敏感信息。 |
|
网络信息。用于内网信息收集,探测内网活跃主机和开放端口。 |
(2)经典攻击载荷(Windows 系统):
文件路径 | 文件内容与攻击价值 |
---|---|
file:///C:/Windows/System32/drivers/etc/hosts |
主机文件。查看内部域名映射。 |
file:///C:/boot.ini |
系统启动配置文件(旧系统)。 |
file:///C:/Windows/win.ini |
系统配置文件。 |
file:///C:/Windows/Repair/SAM |
SAM 文件备份。包含用户的密码哈希,可用于破解。 |
file:///C:/xampp/apache/conf/httpd.conf |
Apache 配置文件。包含路径、端口等敏感信息。 |
(3)防范方法
file
协议是 SSRF 攻击中最直接、最致命的武器之一。它直接将风险从网络层次提升到了操作系统的文件系统,因此必须在代码层面进行最严格的输入过滤和协议限制。防御 file
协议的策略如下所示。
协议白名单制度:这是最有效的方法。严格限制应用程序只能向后台请求指定的协议(只允许
http
和https
),彻底拒绝file
、dict
、gopher
、ftp
等所有其他危险协议。URL 解析与过滤:在对用户输入的 URL 进行请求前,必须对其进行严格的解析和验证。检查并拒绝任何使用
file
协议(或其他黑名单协议)的请求。运行权限最小化:运行业务的应用程序或服务绝不应以 root 或 SYSTEM 等高权限运行。应以低权限用户身份运行,从而即使存在 SSRF,也无法读取
/etc/shadow
等关键文件。网络隔离:虽然对
file
协议无效,但仍是纵深防御的一部分。
三、内网访问渗透实战
打开关卡如下所示,提示信息为“尝试访问位于127.0.0.1的flag.php吧”,提示本关卡可以利用访问127.0.0.1网站根目录下的flag.php进行渗透测试。点击打开题目,此时系统自动创建Docker环境,下图蓝色部分的URL地址就是靶场环境。
根据提示,在当前页面的 URL 后面添加要访问的内网地址和文件路径。由于题目提示要访问本地127.0.0.1
上的flag.php
文件,故而直接构造?url=http://127.0.0.1/flag.php,即可拿到flag。
127.0.0.1
:这是环回地址(Loopback Address),指代服务器本机。任何对127.0.0.1
的请求都是让服务器自己访问自己。/flag.php
:这是攻击者推测或已知的、存在于服务器本机Web根目录下的一个文件,根据本关卡题目的提示获知网站根目录下存在这样一个flag文件。
在浏览器中访问构造好的 URL,/?url=127.0.0.1/flag.php
的原理就是操纵服务器向自身发起内部请求,从而绕过网络访问限制,读取到原本只有本地才能访问的敏感资源。运行结果如下所示,在页面上直接显示flag,渗透成功。
三、伪协议读取文件渗透实战
打开关卡如下所示,提示信息为“尝试去读取一下Web目录下的flag.php吧”,提示本关卡可以利用访问127.0.0.1网站根目录下的flag.php进行渗透测试。根据本关卡的题目“伪协议读取文件”,通常是利用file
协议来读取服务器本地文件。点击打开题目,此时系统自动创建Docker环境,下图蓝色部分的URL地址就是靶场环境。
根据提示目标文件flag.php
位于服务器Web目录下,在linux系统中也就是/var/www/html/
目录下。当前页面的 URL 参数为url
,那么构造的 Payload 应为/?url=file:///var/www/html/flag.php。这里使用file:///
协议来指定访问本地文件,/var/www/html/flag.php
是文件在服务器上的绝对路径。
http://challenge-a41fe429f79768a1.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php
使用抓包工具,如 Burp Suite,开启抓包功能,然后将构造好的 URL 输入到浏览器地址栏中访问请求,具体效果如下所示,当前页面并没有直接显示flag,而是出现了三个问号。
方法1:右键查看网页源代码
此时需要查看页面的源代码,右键查看源代码,在源代码中搜索flag
相关的内容,如下所示显示了flag的值,渗透成功。
方法2:bp抓包
在burpsuite中找到此报文,如下所示响应报文中包含flag值,渗透同样成功。