原出处:https://www.freebuf.com/vuls/217586.htmlphp
ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。html
ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者能够根据自身的需求以应用的形式进行扩展。git
每一个应用都能独立的完成本身的任务,也可经过系统调用其余应用进行协同工做。在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工做的,但他们之间又可经过系统自己进行协调,大大的下降了开发成本和沟通成本。shell
官网:http://www.thinkcmf.comapp
ThinkCMF X1.6.0 ThinkCMF X2.1.0 ThinkCMF X2.2.0 ThinkCMF X2.2.1 ThinkCMF X2.2.2 ThinkCMF X2.2.3
本次复现的版本为:ThinkCMF X2.2.3 下载地址:https://gitee.com/thinkcmf/ThinkCMFX框架
根据index.php中的配置,他的项目路径为application,打开 Portal 下的 Controller 目录,选择一个控制类文件。函数
发现他的父类为Common\Controller\HomebaseController。测试
在HomeBaseController中加入以下测试代码 fetch
ThinkPHP是一套基于MVC的应用程序框架,被分红三个核心部件:模型(M)、视图(V)、控制器(C)。this
因为添加的代码在控制器中,根据ThinkPHP框架约定能够经过a参数来指定对应的函数名,可是该函数的修饰符必须为Public, 而添加的代码正好符合该条件。
能够经过以下URL进行访问,而且能够添加GET参数arg1传递给函数。
http://127.0.0.1/cmfx-master/?a=test_public&arg1=run%20success
HomeBaseController类中有一些访问权限为public的函数,
重点关注display函数.看描述就是能够自定义加载模版,经过$this->parseTemplate 函数根据约定肯定模版路径,若是不符合原先的约定将会从当前目录开始匹配。
而后调用THinkphp Controller 函数的display方法
public function display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') { parent::display($this->parseTemplate($templateFile), $charset, $contentType,$content,$prefix); }
再往下就是调用Think View的fetch方法,这里的TMPL_ENGINE_TYPE 为Think, 最终模版内容解析在ParseTemplateBehavior中完成
以下调用便可加载任意文件
http://127.0.0.1/CMS/ThinkCMFX/?a=display&templateFile=README.md
要利用该方法shell,还须要配合前台的一个上传功能,经过包含本身上传的文件来shell:
http://127.0.0.1/CMS/ThinkCMFX/?a=display&templateFile=shell.php
在HomebaseController.class.php 和 AdminbaseController.class.php中,往下面翻阅发现还有fetch方法,display方法相对fetch只是多了一个render的过程,并且这里不须要知道文件路径
将 HomebaseController.class.php 和 AdminbaseController.class.php 类中 display 和 fetch 函数的修饰符改成 protected
可经过新建以下控制类
namespace Portal\Controller; use Think\Controller; class DoorController extends Controller { public function index($content) { parent::display('', '', '',$content, ''); } }
因为是测试,content未作任何处理,直接传输php代码便可执行。