Think CMF X任意内容包含漏洞分析复现

Think CMF X任意内容包含漏洞分析复现

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漏洞复现

下载了一套Thinkcmfx 2.2.3的源码,漏洞环境搭建在了服务器,安装过程就不写了,安装完成后这是默认首页面板。
Think CMF X任意内容包含漏洞分析复现_第1张图片

  1. 通过构造a参数的display方法,实现任意内容包含,读取文件内容。
    payload: /?a=display&templateFile=a.txt(读取的文件)
    为了测试,首先我们在我们的网站根目录创建一个a.txt。
    Think CMF X任意内容包含漏洞分析复现_第2张图片
    然后利用我们的payload读取一下,成功读取到我们TXT里面的文件内容。
    Think CMF X任意内容包含漏洞分析复现_第3张图片
  2. 通过构造a参数的fetch方法,可以不需要知道文件路径就可以把php代码写入文件,直接getshell。
    payload:?a=fetch&templateFile=public/index&prefix=’’&content=file_put_contents(‘666.php’,’’)
    为了方便测试,我们将php里面的内容写的是phpinfo,这里也可以写一句话。
    Think CMF X任意内容包含漏洞分析复现_第4张图片
    执行完成后,显示空白页面,说明写入成功,我们访问一下666.php,访问成功,显示出了phpinfo的界面。
    Think CMF X任意内容包含漏洞分析复现_第5张图片
    看一下我们的网站根目录,确实写入了666.php。

Think CMF X任意内容包含漏洞分析复现_第6张图片
3)payload:?a=fetch&content=
这个其实也是通过构造a参数的fetch方法,直接执行系统命令。
我们ping一下dnslog来检验一下。

在这里插入图片描述
Dnslog这边有显示,说明命令执行成功。
在这里插入图片描述

0x04漏洞分析

简单的分析一下源码,对于审计入门级别的我最节省时间的方式就是跟着网上那些抄来抄去千篇一律的文章跟着走一遍
首先分析主页代码,发现看一下程序的项目路径在application目录下
Think CMF X任意内容包含漏洞分析复现_第7张图片
进入application,找到IndexController.class.php(入口分组的控制器类)。
可以发现IndexController类中只有一个方法display方法,跟进父类HomebaseController文件。
Think CMF X任意内容包含漏洞分析复现_第8张图片
从网上看了一些资料,发现这里可以通过a参数直接调用PortalIndexController父类HomebaseController中的一些权限为public的方法,display函数和fetch函数是权限都为public,display函数的作用是加载模板和页面输出所对应的参数为:templateFile模板文件地址,charset模板字符集contentType输出类型content输出内容。
当我们把a.txt传入templateFile时,参数会经过parseTemplate函数处理,网上是说 parseTemplate函数会判断模板是否存在,当模板不存在时会在当前目录下开始查找,但是没有很看懂parseTemplate,以后待研究。
Think CMF X任意内容包含漏洞分析复现_第9张图片
fetch函数的作用是获取页面内容,调用内置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中当key和value可控时便可以形成模板注入。这里fetch函数的三个参数分别对应模板文件,输出内容,模板缓存前缀。利用时templateFile和prefix参数可以为空,在content参数传入待注入的php代码,即可达到执行php代码。
Think CMF X任意内容包含漏洞分析复现_第10张图片
Thinkcmfx批量检测工具:https://github.com/Azjj98/Azjj/tree/master/thinkcmfx

0x05漏洞修复

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

0x06总结

其实本身漏洞并不复杂,但是由于对一些php函数不是很了解,浪费了一些时间,我本身是想自己手动调试一遍,设置一些断点跟着参数传递的方式一步一步看参数的处理过程,对于漏洞产生的原因会更具有直观性。其实我感觉代码审计还是自己手动调试才比较有意思,但是由于我的phpstrom没配置好,就跟着网上一些人的思路走了。

你可能感兴趣的:(php,漏洞分析,php,安全,安全漏洞)