php代码审计之ThinkPHP5的文件包含漏洞详解
|
漏洞影响范围
- 加载模版解析变量时存在变量覆盖问题,导致文件包含漏洞的产生 漏洞影响版本:<strong>5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10</strong>
复制代码 我复现用的是5.1.15
(PS:这里附上thinkphp5.1 手册本站下载地址:https://www.jb51.net/books/729512.html)
环境配置要将将 application/index/controller/Index.php 文件代码设置如下:- <?php
- namespace app\index\controller;
- use think\Controller;
- class Index extends Controller
- {
-
- public function index()
- {
-
- $this->assign(request()->get());
- return $this->fetch(); // 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html
- }
- }
复制代码 创建 application/index/view/index/index.html 文件,内容随意(没有这个模板文件的话,在渲染时程序会报错)
漏洞分析
先跟进assign方法
再跟进
array_merge() 函数用于把一个或多个数组合并为一个数组。
只是赋值操作,跟进下面的fetch
继续跟进
用于引用当前对象。用于引用当前类。换句话说,用于非静态成员,用于静态成员。
范围解析运算符(也称为 Paamayim Nekudotayim)或更简单的术语是双冒号,是一个允许访问类的 静态、 常量和重写属性或方法的标记。
fetch 前面的方法 主要是加载模板输出。这里的method值可以追溯到view\driver\Think.php 视图引擎
跟入84行fetch进入think\templae.php
第200行在读取的时候采用了一个read的方法。继续跟进read,进入template\driver\File.php
危险危险危险!!这里调用了一个extract函数,可控变量 $vars 赋值给 $this->data 并最终传入 File 类的 read 方法。而 read 方法中在使用了 extract 函数后,直接包含了 $cacheFile 变量。这里就是漏洞发生的关键原因(可以通过 extract 函数,直接覆盖 $cacheFile 变量,因为 extract 函数中的参数 $vars 可以由用户控制)。
这里extract 该函数使用数组键名作为变量名, EXTR_OVERWRITE 变量存在则覆盖函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
POC
- http://localhost:8000/index/index/index?cacheFile=shell.jpg
复制代码 图片马 shell.jpg 放至 public 目录下(模拟上传图片操作)。
来源:https://www.jb51.net/program/288762tl5.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|
|
|
发表于 2023-7-15 08:26:43
举报
回复
分享
|
|
|
|