在程序开发日常中,开发人员为了复用代码,经常将一些通用函数封装到同一个文件中,然后在需要用到的地方引入此文件,这就是文件包含。在 php 中,有 include()
,include_once()
,require()
,require_once()
这些函数用于包含一个文件。
而有时候,开发人员并没有严格控制所包含的文件。比如文件名使用变量传参,但是没有限定变量的值,导致包含的文件不可控,给系统带来危害,这就是文件包含漏洞。
文件包含漏洞一般分为本地文件包含漏洞和远程文件包含漏洞。本地文件包含漏洞一般被利用于读取系统敏感文件。而远程文件包含则可以将远程木马文件包含进来,并以此获取整个服务器的权限。
由此可见,远程文件包含漏洞的危害要大一些。
以漏洞靶场 Pikachu 为例,简单讲解。
首先演示一下本地文件包含。
打开 File Inclusion 关卡,选择 File Inclusion(local),即本地文件包含。
可以看到一个下拉框,观察发现每切换一个选择,地址栏的参数也会跟着变。
选择下拉框第三项,地址栏的 filename
的值由 file1.php
变成了 file3.php
,显示的内容也发生了变化。
一共可以选择 file 1 - 5,那有没有 file6.php
呢?
直接改地址栏参数验证,可以看到不但存在 file6.php
,而且里面存放着系统的账号密码,现在被我们利用文件包含漏洞查出来了。
查看后端 php 源代码,可以看到 filename
参数没有经过任何处理,就被拿来使用了。从而导致前端可以传任意文件名,进行任意文件包含。
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";
// }
}
结合上次的文章,利用文件上传漏洞上传木马,再将其包含进来。
上次上传的木马文件的绝对路径为 http://192.168.0.120/vul/unsafeupload/uploads/2022/01/12/31516061def699c388b185147077.png
,当前路径为 http://192.168.0.120/vul/fileinclude/fi_local.php
,则可得出木马文件相对当前文件的路径为 ../../unsafeupload/uploads/2022/01/12/31516061def699c388b185147077.png
。
构造参数 filename=../../unsafeupload/uploads/2022/01/12/31516061def699c388b185147077.png
进行文件包含,结果报错了。
最后查了很久,推测可能是我在上传之前使用记事本打开了该木马,导致文件编码被改了。(当初就不该手贱还用记事本打开查看文件内容)
于是重新制作一个图片马,上传,得到地址为 http://192.168.0.120/vul/unsafeupload/uploads/2022/01/15/90350661e2a7e7cb2f5534613203.png
,构造参数 filename=../../unsafeupload/uploads/2022/01/15/90350661e2a7e7cb2f5534613203.png
。
访问,页面全是乱码,但是没有报错,推测文件包含成功。
使用蚁剑连接,成功连接。
其实在此之前我还尝试构造 filename=../../../../../../../../etc/passwd
读取 /etc/passwd
文件内容,但是没有权限,故读取失败。
那么接着验证一下远程文件包含。
选择 File Inclusion(remote)。
地址栏参数还是 filename
,直接构造 filename=http://192.168.0.120/vul/unsafeupload/uploads/2022/01/15/90350661e2a7e7cb2f5534613203.png
进行访问,将图片马包含进来。
注意,此时我们传入的文件是一个远程 URL 地址,并非本地文件,所以文件内容完全是由我们控制的。而且不需要借助文件上传漏洞,我们可以直接在自己的服务器放一个木马文件,然后将该木马文件 URL 地址传入。这里我为了省事,就直接拿原来利用文件上传漏洞所上传的图片马来用了。
一样的乱码页。
蚁剑一样连接成功。
简单说明一下,include
支持包含本地文件或者远程文件,但是之前本地包含的关卡,代码为 include "include/$filename"
,就导致传入 URL 会变成 include/http://192.168.0.120/vul/unsafeupload/uploads/2022/01/15/90350661e2a7e7cb2f5534613203.png
,这样肯定是找不到对应文件的。
而第二关代码为 include "$filename"
,故可以传入 URL。
这是个 base64 吧?
54K55Liq5Zyo55yL5ZCn77yB
原文始发于微信公众号(白帽渗透笔记):文件包含漏洞基础
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论