HacKerQWQ的博客空间

TP5文件包含漏洞分析(5.0.0-5.0.18,5.1.0-5.1.10)

Word count: 466Reading time: 1 min
2021/09/26 Share

漏洞介绍

在fetch渲染模板的方法中,调用了File类的read方法中使用了extract方法造成了变量覆盖,覆盖掉了模板文件,造成文件包含漏洞

漏洞演示

现将图片马上传public目录(实际情况是文件上传上传图片马)

传入?cacheFile=hello.jpg进行文件包含

image-20210926230435288

漏洞分析

application/index/controller/Index.php中添加如下代码触发漏洞

1
2
3
4
5
6
7
8
9
10
11
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
$this->assign(request()->get());
return $this->fetch(); // 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
}
}

传入?cacheFile=hello.jpg之后,通过request()->get()获取GET变量,形式是cacheFile=>hello.jpg,然后跟进assign方法

image-20210926231122057

进入了thinkphp/library/think/Controller.phpassign方法

image-20210926231209792

再进入thinkphp/library/think/Controller.php的assign方法,通过array_mergecacheFile变量整合到$this->data中,现在继续跟进到fetch方法

image-20210926231431199

调用了thinkphp/library/think/Controller.php类的fetch方法,接着调用thinkphp/library/think/View.php类的fetch方法

image-20210926231626993

关键在于,将$this->data中的值通过array_merge整合到$vars中,然后调用了$this->engine也就是think\view\drive\Think调用fetch方法

image-20210926232048935

通过parseTemplate获取默认的渲染文件application/index/view/index/index.html,否则抛出异常。接着调用$this->template也就是think\Templatefetch方法

image-20210926232538955

image-20210926232644774

进行了一些赋值和获取Template文件的操作之后就调用了think\template\driver\File类的read方法(这里的$cacheFile不是我们传入的cacheFile,是ThinkPHP的缓存文件)

image-20210926232939974

这里首先判断$vars$vars是否是数组且不为空,然后直接对变量进行extract操作之后就include$cacheFile文件,因此造成了文件包含

漏洞修复

image-20210926233458643

官方将$cacheFile直接赋值到$this->cacheFile中防止被变量覆盖,然后include $this->cacheFile避免bug出现

CATALOG
  1. 1. 漏洞介绍
  2. 2. 漏洞演示
  3. 3. 漏洞分析
  4. 4. 漏洞修复