thinkphp 5.x~3.x 文件包含漏洞分析
Posted 0xdd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp 5.x~3.x 文件包含漏洞分析相关的知识,希望对你有一定的参考价值。
漏洞描述:
Thinkphp在加载模版解析变量时存在变量覆盖的问题,且没有对 $cacheFile 进行相应的消毒处理,导致模板文件的路径可以被覆盖,从而导致任意文件包含漏洞的发生。
主要还是变量覆盖的问题。
漏洞范围:
漏洞影响版本: 5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10
本地复现环境:
tp5.0.15 php version :7.0.12
<?php namespace app\\index\\controller; use \\think\\Controller; class Index extends Controller { public function index() { $this->assign($this->request->get()); return $this->fetch("index"); //当前的模块/view目录/当前控制器/当前操作 这里我定义了一个index模块 } }
assign方法 进行了模板变量赋值 ,把可控数据存在\\think\\View
主要问题出现在fetch 这里
细跟一下fetch
fetch 前面的方法 主要是加载模板输出
这里的 $method 的值为fetch 可以在view\\driver\\Think.php 视图引擎
这里要跟到think\\templae.php
在读取的时候采用了一个read的方法。
然后我们去跟read ,
关键的部分:
这里extract 该函数使用数组键名作为变量名, EXTR_OVERWRITE 变量存在则覆盖
原本cacheFIle的值:
E:\\phpstudy\\PHPTutorial\\WWW\\tp5.0.15\\runtime\\temp\\cb64592f1fa49f590673c9beddff4365.php
被覆盖成 echod.txt
* @param array $vars 模板输出变量
我们输入的cacheFile=echod.txt
通过extract 该函数使 数组键名作为变量名
变成$cacheFile=echod.txt
最后的inclde $cacheFile; 触发 任意文件包含漏洞。
这个洞在thinkCMF 后台的一个upload处可以复现。
如果,allow_url_include 开启,可利用此处 执行任意代码
以上是关于thinkphp 5.x~3.x 文件包含漏洞分析的主要内容,如果未能解决你的问题,请参考以下文章