pikachu靶场通关教程(六)——文件包含

发布于 2024-03-20  147 次阅读


一、介绍

编程人员常常将可多次重复调用的函数写入一个文件当中,在程序中直接调用该文件即可使用内容定义的函数,免去了重复编写的繁琐过程。在某些情况下,会在前端根据用户的输入选择调用的文件,如果此时开发人员没有考虑到调用文件的安全性,或是控制调用文件的参数没有经过过滤,使得可以被恶意控制,就导致了文件包含漏洞。

二、本地文件包含

根据输入的提示,随意的选择一个内容(牢大,我想你了T_T)。

此时我们来观察一下url中携带的参数,主要是filename=file1.php。未经编码的url参数很容易读出含义,可以猜测这里调用了ifle1.php这个文件。由于是白盒测试,我们对这个本地文件进行分析,在/vul/fileinclude/fi_local.php的20-29行。

$html='';
if(isset($_GET['submit']) && $_GET['filename']!=null){
    $filename=$_GET['filename'];
    include "include/$filename";//变量传进来直接包含,没做任何的安全限制
//     //安全的写法,使用白名单,严格指定包含的文件名
//     if($filename=='file1.php' || $filename=='file2.php' || $filename=='file3.php' || $filename=='file4.php' || $filename=='file5.php'){
//         include "include/$filename";

//     }
}

这里接收filename参数的值拼接到指定的路径,靶场作者已经帮我们进行了解释,就是没有对用户传入的参数进行限制。那么我们就顺着这个思路,构造一个路径,看看能不能遍历目录,查看其它文件,这里事先放置了一个fileincludetest.txt用于测试。

通过构造路径../../../fileincludetext.php访问上级目录中的文件,就可以得知内容,完成了漏洞的利用。可以通过暴破达到遍历文件的目的。

三、远程文件包含

第一步同样还是选择。

正常的测试流程中,如果本地包含行不通的话,就可以考虑远程包含了,这里也直接分析源码。/vul/fileinclude/fi_remote.php的第68-75行。

<select name="filename">
    <option value="">--------------</option>
    <option value="include/file1.php">Kobe bryant</option>
    <option value="include/file2.php">Allen Iverson</option>
    <option value="include/file3.php">Kevin Durant</option>
    <option value="include/file4.php">Tracy McGrady</option>
    <option value="include/file5.php">Ray Allen</option>
</select>

这里需要一些前端的知识,这里的代码对应了下拉栏和下拉栏中的5个选项,选择后会将对应value值赋给filename参数作为php的文件路径,之后使用GET请求提交。

那么我们就可以尝试在filename参数后填入一个地址。

可以看到直接在页面中显示了请求的界面,也就是对方的服务器请求了我们执行的资源,在实际的攻击中,可以利用该漏洞请求攻击者部署的服务器上的恶意资源,以此触发其它漏洞。

四、修复方式

1.设置白名单

如果需要进行文件包含的文件数量是固定的,可以设置白名单,对传入的参数内容进行比较。

2.过滤危险字符

如replace_str等方法可以过滤危险的字符,如"."、"/"、"\"这三个常出现的特殊字符。

3.关闭危险配置

如php中的allow_url_include,这个选项会允许远程文件包含,直接关闭该配置可以避免因疏忽产生的安全问题。

五、后记

文件包含漏洞造成的危害主要在于敏感信息泄露和意外的资源请求。前者如字面描述的,会使得如数据库配置、身份凭证等信息泄露,攻击者可以用于进一步的攻击。后者则可以用于拒绝服务攻击、远程代码执行、代码注入等多种攻击场景。

下一章,任意文件下载,请期待^_^