关于thinkphp5的文件包含漏洞

简介

之前由于一直没有遇到过实际案例,所以对词比较随意

最近遇到了两种,遂记录

影响版本

  • thinkphp3
  • thinkphp 5.0.0-5.0.18
  • thinkphp 5.1.0-5.1.10

这里以5.0.18进行分析

漏洞分析

第一种写法

1
2
3
4
5
6
7
8
9
public function index()
{
$data = input();
if(isset($data['XDEBUG_SESSION_START'])){
unset($data['XDEBUG_SESSION_START']);
}
$this->assign($data);
return $this->fetch();
}

这里通过调用父类控制器的assign方法,继而调用view的assign方法

image-20210924163013301

调用完成之后会继续调用view的fetch方法,

image-20210924163013301

在框架中默认都是使用的think解析器

所以会继续调用think类的fetch方法

image-20210924154803031

然后检测到模板文件之后,调用template类的fetch方法

image-20210924154803031

继续调用file类的read方法,在这个方法中完成变量覆盖和文件包含

image-20210924154803031

漏洞复现

创建一个1.txt文件

image-20210924154803031

传入参数cacheFile

image-20210924154803031

第二种方式

分析

1
2
3
4
5
6
7
8
public function index()
{
$data = input();
if(isset($data['XDEBUG_SESSION_START'])){
unset($data['XDEBUG_SESSION_START']);
}
return $this->fetch('',$data);
}

达到的效果是一样的,在fetch方法中如果第二个参数完全可控,则也会被归并到vars变量中

image-20210924154803031

复现

image-20210924154803031

end

上面两种写法都遇到了,一记