当前位置:   article > 正文

thinkphp5漏洞分析之文件包含

thinkphp5漏洞分析之文件包含

目录

一、环境

二、开始研究

三、漏洞分析

四、漏洞修复

五、攻击总结


一、环境

thinkphp官网下载

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

二、开始研究

创建一个图片马,并将图片马 1.jpg 放至 public 目录下(模拟上传图片操作)。接着访问 http://localhost:8000/index/index/index?cacheFile=test.php 链接,即可触发 文件包含漏洞

 复制一下文件

我们直接下断点分析

追到数组

判断name是不是一个数组

走入fatch方法

之后生成临时文件,利用vars生成临时变量,之后包含我们的test.jpg包含住,而原因就是extract这个函数

include把见到任何一个文件会将其当做php文件执行

三、漏洞分析

首先在官方发布的 5.0.19 版本更新说明中,发现其中提到该版本包含了一个安全更新。

我们可以查阅其 commit 记录,发现其改进了模板引擎,其中存在危险函数 extract ,有可能引发变量覆盖漏洞。接下来,我们直接跟进代码一探究竟。

首先,用户可控数据未经过滤,直接通过 Controller 类的 assign 方法进行模板变量赋值,并将可控数据存在 think\View 类的 data 属性中。

接着,程序开始调用 fetch 方法加载模板输出。这里如果我们没有指定模板名称,其会使用默认的文件作为模板,模板路径类似 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html ,如果默认路径模板不存在,程序就会报错。

我们跟进到 Template 类的 fetch 方法,可以发现可控变量 $vars 赋值给 $this->data 并最终传入 File 类的 read 方法。而 read 方法中在使用了 extract 函数后,直接包含了 $cacheFile 变量。这里就是漏洞发生的关键原因(可以通过 extract 函数,直接覆盖 $cacheFile 变量,因为 extract 函数中的参数 $vars 可以由用户控制)。

四、漏洞修复

官方的修复方法是:先将 $cacheFile 变量存储在 $this->cacheFile 中,在使用 extract 函数后,最终 include 的变量是 $this->cacheFile ,这样也就避免了 include 被覆盖后的变量值。

五、攻击总结

最后,再通过一张攻击流程图来回顾整个攻击过程。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/1010989
推荐阅读
相关标签
  

闽ICP备14008679号