ThinkPHP5变量覆盖导致的文件包含

简介

ThinkPHP在加载模版解析变量时存在变量覆盖的问题,且没有对$cacheFile进行相应的消毒处理,导致模板文件的路径可以被覆盖,从而导致任意文件包含漏洞的发生。

影响版本

  • 5.0.0<=ThinkPHP5<=5.0.18
  • 5.1.0<=ThinkPHP5<=5.1.10

缺陷代码

1
2
3
4
5
public function index()
{
$this->assign(request()->get());
return $this->fetch();
}

实际上这种写法基本上遇不到,都是第一个参数是固定值,第二个参数为数据库取出的变量值

漏洞分析

传入的参数进入assign方法中

1618284940637

然后存入了$this->data

1618284966237

进入了Viewfetch方法,调用模板引擎的fetch

1618285044850

继续跟进fetch方法

1618285098148

当缓存文件无效时时,会重新对模板进行编译,然后进入read方法

1618285168234

在read方法中进行变量覆盖,并将传入的文件进行包含,触发rce

1618285300526

漏洞复现

随便创建一个新文件

1
<?php phpinfo();?>

注意参数为cacheFile

1618285463584

end

仅作为漏洞整理