ThinkCMF框架上的任意内容包含漏洞
一、背景
ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。
ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。
每个应用都能独立的完成自己的任务,也可通过系统调用其他应用进行协同工作。在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工作的,但他们之间又可通过系统本身进行协调,大大的降低了开发成本和沟通成本。
二、影响版本
ThinkCMF X1.6.0
ThinkCMF X2.1.0
ThinkCMF X2.2.0
ThinkCMF X2.2.1
ThinkCMF X2.2.2
三、漏洞危害
远程攻击者在无需任何权限情况下,通过构造特定的请求包即可在远程服务器上执行任意代码。
四、漏洞挖掘
根据index.php中的配置,他的项目路径为application,打开 Portal 下的 Controller 目录,选择一个控制类文件。

发现他的父类为Common\Controller\HomebaseController。
在HomeBaseController中加入如下测试代码

ThinkPHP是一套基于MVC的应用程序框架,被分成三个核心部件:模型(M)、视图(V)、控制器(C)。
由于添加的代码在控制器中,根据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方法
/**
* 加载模板和页面输出 可以返回输出内容
* @access public
* @param string $templateFile 模板文件名
* @param string $charset 模板输出字符集
* @param string $contentType 输出类型
* @param string $content 模板输出内容
* @return mixed
*/
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:81/cmfx-master/?a=display&templateFile=README.md

要利用该方法shell,还需要配合前台的一个上传功能,通过包含自己上传的文件来shell,难免有些麻烦。
五、影响范围
往下面翻阅发现还有fetch方法,display方法相对fetch只是多了一个render的过程,而且这里不需要知道文件路径
最终完美payload (打码)
http://127.0.0.1:81/cmfx-master/?a=fetch&****=********
通过在斗象智能安全资产情报搜索关键字,使用ThinkCMF的站点
https://arl.riskivy.com/products/lighthouse?query=headers:%22X-Powered-By:%20ThinkCMF%22

六、修复方法
将 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代码即可执行。

ThinkCMF框架上的任意内容包含漏洞的更多相关文章
- ThinkCMF 框架上的任意内容包含漏洞
0x01 背景 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建. ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者 ...
- ThinkCMF X1.6.0-X2.2.3框架任意内容包含漏洞分析复现
ThinkCMF X1.6.0-X2.2.3框架任意内容包含漏洞分析复现 一.ThinkCMF简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理系统框架,底层采用ThinkPHP3. ...
- [转]ThinkCMF框架任意内容包含漏洞分析复现
0x00 简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以 ...
- ThinkCMF框架任意内容包含漏洞分析复现(写入shell+文件包哈)
ThinkCMF框架任意内容包含漏洞分析复现 0x00 简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用 ...
- ThinkCMF框架任意内容包含漏洞复现
1. 漏洞概述 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建. 利用此漏洞无需任何权限情况下,构造恶意的url,可以向服务器写入任意内容的 ...
- ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)
1.漏洞概述 攻击者可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到远程代码执行的目的 2.影响版本 ThinkCMF X1.6.0 ThinkCMF X2.1.0 ThinkCMF X ...
- [CMS]ThinkCMF框架存在任意内容包含漏洞
原出处:https://www.freebuf.com/vuls/217586.html 0x00 简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3 ...
- ThinkCMF框架任意内容包含
更多内容,欢迎关注微信公众号:信Yang安全,期待与您相遇. ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用 ...
- phpmyadmin任意文件包含漏洞分析(含演示)
0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...
随机推荐
- 不高兴的津津(0)<P2004_1>
不高兴的津津(unhappy.pas/c/cpp) [问题描述] 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵. ...
- BUUCTF知识记录
[强网杯 2019]随便注 先尝试普通的注入 发现注入成功了,接下来走流程的时候碰到了问题 发现过滤了select和where这个两个最重要的查询语句,不过其他的过滤很奇怪,为什么要过滤update, ...
- 让 el-dialog 居中,并且内容多的时候内部可以滚动
.el-dialog { position: absolute; top: 50%; left: 50%; margin: 0 !important; transform: translate(-50 ...
- 导出EXCEL设置单元格格式
怎么设置导出的EXCEL文件的列格式 如何设置导出的EXCEL文件的列格式在office的EXCEL中我们可以在一个EXCEL文件中,选中一列再点击鼠标右键,选择设置单元格格式,可以将这一列设为文本格 ...
- day5-2正则表达式
正则表达式: 正则表达式对象的创建 1,构造函数 var pattern =new RegExp("正则表达式","修饰符") var pattern =new ...
- 洛谷P1198 [JSOI2008]最大数(线段树)
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:LLL不超过当前数列的长度.(L> ...
- 四阶幻方-蓝桥杯-DFS
答案:416 用next_permutation()全部排列的话会超时 所以用dfs搜索,只搜索前三行就好,前三行确定之后,第四行也就确定 #include<iostream> #incl ...
- Session共享解决方案
使用nginx做的负载均衡添加一个ip_hash配置 一.开两个Tomcat写测试程序 @WebServlet("/nginxSessionServlet") public cla ...
- Python实现简单中文词频统计示例
简单统计一个小说中哪些个汉字出现的频率最高: import codecs import matplotlib.pyplot as plt from pylab import mpl mpl.rcPar ...
- C 语言入门第十二章---C语言文件操作
C语言具有操作文件的能力,比如打开文件.读取和追加数据.插入和删除数据.关闭文件.删除文件等. 在操作系统中,为了同意对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件.对这些文件的操作,等 ...