ThinkCMF框架上的任意内容包含漏洞

少羽.
少羽.
少羽.
430
文章
88
评论
2019年10月25日18:21:08 评论 5,244 2010字阅读6分42秒
广告也精彩

又是好不不见啊!最近真的好忙,但是也不知道在忙些什么,总之感觉很累,没时间写文章,这两天刚好出来一个漏洞,就发一篇文章,水一下啦。

一、背景

ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。

ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。

每个应用都能独立的完成自己的任务,也可通过系统调用其他应用进行协同工作。在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工作的,但他们之间又可通过系统本身进行协调,大大的降低了开发成本和沟通成本。

官网:http://www.thinkcmf.com

二、影响版本

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 目录,选择一个控制类文件。ThinkCMF框架上的任意内容包含漏洞

发现他的父类为Common\Controller\HomebaseController。

在HomeBaseController中加入如下测试代码

ThinkCMF框架上的任意内容包含漏洞

ThinkPHP是一套基于MVC的应用程序框架,被分成三个核心部件:模型(M)、视图(V)、控制器(C)。

由于添加的代码在控制器中,根据ThinkPHP框架约定可以通过a参数来指定对应的函数名,但是该函数的修饰符必须为Public, 而添加的代码正好符合该条件。

可以通过如下URL进行访问,并且可以添加GET参数arg1传递给函数。

http://127.0.0.1/cmfx-master/?a=test_public&arg1=run%20success

ThinkCMF框架上的任意内容包含漏洞

HomeBaseController类中有一些访问权限为public的函数,ThinkCMF框架上的任意内容包含漏洞

重点关注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

ThinkCMF框架上的任意内容包含漏洞

要利用该方法shell,还需要配合前台的一个上传功能,通过包含自己上传的文件来shell,难免有些麻烦。

五、影响范围

往下面翻阅发现还有fetch方法,display方法相对fetch只是多了一个render的过程,而且这里不需要知道文件路径

最终完美payload (打码)

http://127.0.0.1:81/cmfx-master/?a=fetch&****=********

六、修复方法

将 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框架上的任意内容包含漏洞

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

继续阅读
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
广告也精彩
少羽.
  • 本文由 发表于 2019年10月25日18:21:08
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
渗透经验分享之文件操作漏洞拓展 渗透笔记

渗透经验分享之文件操作漏洞拓展

上文分享了注入相关的东西,注入也可以对文件进行操作,本文是对文件操作漏洞的拓展。 文件操作漏洞 文件上传 文件读取 文件写入 文件删除 文件包含 一般java的站点存在文件系列的洞比较多(除了文件包含...
渗透经验分享之SQL注入思路拓展 渗透笔记

渗透经验分享之SQL注入思路拓展

写在文前 从实习到现在,因为从事打点工作的原因,实战经验积累了很多,就想写一些自己在实战中碰到的问题,以及自己的解决方法,因为保密的原因大多数不提供复现环境和截图,权当对渗透思路的一个拓展吧。可能会多...
广告也精彩
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: