Thinkphp5文件包含漏洞分析
漏洞概要
漏洞影响版本: 5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10。
环境搭建
测试版本:5.0.18
控制器
1 |
|
创建 application/index/view/index/index.html 文件,内容随意(没有这个模板文件的话,在渲染时程序会报错)
漏洞复现
包含成功
1 |
|
漏洞分析
1./thinkphp/library/think/Controller.php
进入assign方法
2./thinkphp/library/think/View.php
把$name数组赋值给了$this->data
3./thinkphp/library/think/Controller.php
进入fetch,四个参数都为空
4./thinkphp/library/think/View.php
调用think\view\driver\Think的fetch方法,第二个参数$vars是$this->data
5./thinkphp/library/think/view/driver/Think.php
parseTemplateFile会获取默认模板文件的地址,也就是之前我们添加的文件,没有会报错。然后继续调用\think\template的fetch方法
6./thinkphp/library/think/Template.php
这里拼接了$cacheFile文件名,然后继续调用think\template\deiver\File的read方法,还是把$this->data作为参数
7./thinkphp/library/think/tempplate/driver/File,php
最后调用extract进行变量覆盖,$cacheFile被覆盖为恶意文件,造成文件包含
漏洞修复
先把 $cacheFile 变量存储在 $this->cacheFile 中,然后include $this->cacheFile ,避免变量覆盖
总结
模板文件包含漏洞从thinkphp3开始就存在,过程并不复杂,主要步骤:
- 我们传入的数组被赋值给$this->data
- $this->data作为参数一路传递到extract方法,造成$cacheFile被覆盖成恶意文件名,最后include恶意文件
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!