当前位置: 首页 > news >正文

ThinkCMF框架任意内容包含漏洞的讲解

本文来自无问社区,更多网安资料可前往查看icon-default.png?t=O83Ahttp://www.wwlib.cn

背景描述

ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。

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

在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工作的,但他们之间又可通过系统本身进行协调,大大的降低了开发成本和沟通成本。

0x01 影响版本

ThinkCMF X1.6.0

ThinkCMF X2.1.0

ThinkCMF X2.2.0

ThinkCMF X2.2.1

ThinkCMF X2.2.2

ThinkCMF X2.2.3

漏洞危害

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

漏洞分析

安装过程就简单忽略吧,贴个安装完成能正常访问的主页。

         

图片

首先打开主入口index.php文件,查看到程序的项目路径,如下显示项目路径在application目录之中。

图片

而后打开 Portal 下的 Controller 目录 ,选择IndexController.class.php控制类文件。

图片

可以看到这里IndexController类中只有一个方法display方法,那么看一下父类HomebaseController文件,根据ThinkPHP框架规则,可以通过g\m\a参数指定分组\模块\方法,这里可以通过a参数直接调用Portal\IndexController父类(HomebaseController)中的一些权限为public的方法。

这边有问题的是display函数和fetch函数:

display函数的作用是加载模板和页面输出 返回输出内容,所对应的参数为:

$templateFile 模板文件名,$charset 模板输出字符集,$contentType 输出类型,$content 模板输出内容。

图片

图片

而后的templateFile参数会经过parseTemplate函数处理确定模版路径,判断模板是否存在,若当模板不存在时会在当前目录下开始查找,然后调用THinkphp Controller 函数的display方法,可以配合一处上传形成文件包含。

fetch函数的作用是获取输出页面内容,调用内置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中当key和value可控时便可以形成模板注入。

图片

这里fetch函数的三个参数分别对应$templateFile 指定要调用的模板文件,$content 模板输出内容,$prefix 模板缓存前缀*。利用时templateFile和prefix参数可以为空,我们可以在在content参数传入待注入的php代码即可。

漏洞利用

 我们将上述的漏洞分析完成之后,我们就来看看这漏洞如何进行利用吧。

方法一:构造a参数的display方法,实现任意内容包含漏洞  

payload:

/index.php?a=display&templateFile=README.md

图片

方法二:构造a参数的fetch方法,可以不需要知道文件路径就可以把php代码写入文件。 

payload:

/index.php?a=fetch&content=

写入xy.php一句话shell文件之后,发现页面显示空白。

图片

我们发现本地电脑成功写入xy.php,之后我们利用中国蚁剑链接访问即可。

图片

漏洞修复
 

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

图片

图片

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ⭐Unity 安卓环境中正确地读取和处理 XML 文件
  • OpengGL教程(三)---使用VAO和VBO方式绘制三角形
  • python学习第九节:爬虫实战-抓取地址库
  • BMC+ssh和共享平台的Ironic服务,实现裸金属服务器的远程管理与调用
  • Java8 流的简单介绍
  • 如何防止ZIP压缩文件被随意打开?
  • 洞悉地下寒潮,守护温暖家园:智能CG-68冻土传感器监测系统
  • Windows 环境下 vscode 配置 C/C++ 环境
  • Vue3+setup实现父子组件单表增删改查写法模板
  • 掌握MATLAB中的数据类型转换技巧
  • java之认识异常
  • matlab绘制不同区域不同色彩的图,并显示数据(代码)
  • 【C++ 高频面试题】new、delete 与 malloc、free的区别
  • 64位系统中不支持In.vi与Out.vi的原因
  • 深入理解指针(二)
  • $translatePartialLoader加载失败及解决方式
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • CSS实用技巧干货
  • httpie使用详解
  • Spark RDD学习: aggregate函数
  • 利用DataURL技术在网页上显示图片
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 容器服务kubernetes弹性伸缩高级用法
  • 微服务框架lagom
  • 物联网链路协议
  • scrapy中间件源码分析及常用中间件大全
  • ​水经微图Web1.5.0版即将上线
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #pragma once与条件编译
  • #数据结构 笔记三
  • (js)循环条件满足时终止循环
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)linux下的时间函数使用
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .Net Core 微服务之Consul(二)-集群搭建
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net framework4与其client profile版本的区别
  • .NET MVC 验证码
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net6 Api Swagger配置
  • .NET的微型Web框架 Nancy
  • .net访问oracle数据库性能问题
  • [AI Google] 使用 Gemini 取得更多成就:试用 1.5 Pro 和更多智能功能
  • [Android]常见的数据传递方式
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C#学习笔记]Newtonsoft.Json
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [C++][opencv]基于opencv实现photoshop算法图像剪切
  • [CAN] 创建解析CAN报文DBC文件教程
  • [Design Pattern] 工厂方法模式