CTFHub SSRF通关笔记1:内网访问+伪协议读取文件 原理详解与渗透实战

发布于:2025-09-13 ⋅ 阅读:(23) ⋅ 点赞:(0)

目录

一、SSRF原理

1、本质

2、区别

二、SSRF File协议

1、File协议

2、SSRF利用File协议

(1)经典攻击载荷(Linux/Unix 系统):

(2)经典攻击载荷(Windows 系统):

(3)防范方法

三、内网访问渗透实战

三、伪协议读取文件渗透实战

方法1:右键查看网页源代码

方法2:bp抓包


本文通过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 进程环境变量。可能包含密码,密钥等被传入环境中的敏感信息。

file:///proc/net/arp 

file:///proc/net/tcp

网络信息。用于内网信息收集,探测内网活跃主机和开放端口。

(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),彻底拒绝 filedictgopherftp 等所有其他危险协议。

  • 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值,渗透同样成功。