Thinkphp5文件包含漏洞分析

漏洞概要

漏洞影响版本: 5.0.0<=ThinkPHP5<=5.0.185.1.0<=ThinkPHP<=5.1.10

环境搭建

测试版本:5.0.18

控制器

1
2
3
4
5
6
7
8
9
10
11
12
<?php
namespace app\index\controller;

class Index
{
public function index()
{
$this->assign(request()->get());
return $this->fetch(); // 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
}
}

创建 application/index/view/index/index.html 文件,内容随意(没有这个模板文件的话,在渲染时程序会报错)

fY1InH.png

漏洞复现

包含成功

1
http://localhost/public/?cacheFile=22.jpg

fY1HAI.png

漏洞分析

1./thinkphp/library/think/Controller.php

进入assign方法

fY1O9f.png

2./thinkphp/library/think/View.php

把$name数组赋值给了$this->data

fY1oBd.png

3./thinkphp/library/think/Controller.php

进入fetch,四个参数都为空

fY14je.png

4./thinkphp/library/think/View.php

调用think\view\driver\Think的fetch方法,第二个参数$vars是$this->data

fY1THA.png

5./thinkphp/library/think/view/driver/Think.php

parseTemplateFile会获取默认模板文件的地址,也就是之前我们添加的文件,没有会报错。然后继续调用\think\template的fetch方法

fY1jgS.png

6./thinkphp/library/think/Template.php

这里拼接了$cacheFile文件名,然后继续调用think\template\deiver\File的read方法,还是把$this->data作为参数

fY1X38.png

7./thinkphp/library/think/tempplate/driver/File,php

最后调用extract进行变量覆盖,$cacheFile被覆盖为恶意文件,造成文件包含

fY1bNt.png

漏洞修复

先把 $cacheFile 变量存储在 $this->cacheFile 中,然后include $this->cacheFile ,避免变量覆盖

总结

模板文件包含漏洞从thinkphp3开始就存在,过程并不复杂,主要步骤:

  1. 我们传入的数组被赋值给$this->data
  2. $this->data作为参数一路传递到extract方法,造成$cacheFile被覆盖成恶意文件名,最后include恶意文件

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!