文件包含漏洞基础

admin 2022年3月25日23:54:11评论67 views字数 2364阅读7分52秒阅读模式

在程序开发日常中,开发人员为了复用代码,经常将一些通用函数封装到同一个文件中,然后在需要用到的地方引入此文件,这就是文件包含。在 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


文件包含漏洞基础


原文始发于微信公众号(白帽渗透笔记):文件包含漏洞基础

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月25日23:54:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   文件包含漏洞基础https://cn-sec.com/archives/841618.html

发表评论

匿名网友 填写信息