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

ThinkPHP5核心类Request远程代码漏洞分析

时间:2019-11-01 11:28:07  来源:  作者:

 

一、漏洞介绍

2019年1月11日,Thinkphp团队发布了一个补丁更新,修复了一处由于不安全的动态函数调用导致的远程代码执行漏洞。该漏洞危害程度非常高,默认条件下即可执行远程代码。启明星辰ADLab安全研究员对ThinkPHP的多个版本进行源码分析和验证后,确认具体受影响的版本为ThinkPHP5.0-5.0.23完整版。

二、漏洞复现

本地环境采用ThinkPHP 5.0.22完整版+PHP5.5.38+Apache进行复现。安装环境后执行POC即可执行系统命令,如图:

ThinkPHP5核心类Request远程代码漏洞分析

 

三、漏洞分析

以官网下载的5.0.22完整版进行分析,首先定位到漏洞关键点:

thinkphp/library/think/Request.php:518

在method函数的第二个if分支中,引入了一个外部可控的数据$_POST[Config::get[‘var_method’]。而var_method的值为_method。

ThinkPHP5核心类Request远程代码漏洞分析

 

Request类的__construct函数如下:

由于$options参数可控,攻击者可以覆盖该类的filter属性、method属性以及get属性的值。而在Request类的param函数中:

当$this->mergeParam为空时,这里会调用$this->get(false)。跟踪$this->get函数:

该函数末尾调用了$this->input函数,并将$this->get传入,而$this->get的值是攻击者可控的。跟踪$this->input函数:

该函数调用了$this->getFileter取得过滤器。函数体如下:

$this->filter的值是攻击者通过调用构造函数覆盖控制的,将该值返回后将进入到input函数:

查看filterValue函数如下:

在call_user_func函数的调用中,$filter可控,$value可控。因此,可致代码执行。

漏洞触发流程:

从ThinkPHP5的入口点开始分析:

thinkphp/library/think/App.php:77

run函数第一行便实例化了一个Request类,并赋值给了$request。然后调用routeCheck($request,$config):

这里调用Route::check进行路由检测。函数如下:

注意红色字体部分。对应开头的第一个步骤,也就是调用method函数进行变量覆盖。这里需要覆盖的属性有$this->filter,$this->method,$this->get。因为$request->method()的返回值为$this->method,所以该值也需要被控制。这里返回值赋值给了$method,然后取出self::$rules[$method]的值给$rules。这里需要注意:THINKPHP5有自动类加载机制,会自动加载vendor目录下的一些文件。但是完整版跟核心版的vendor目录结构是不一样的。

完整版的目录结构如下:

ThinkPHP5核心类Request远程代码漏洞分析

 

而核心版的目录结构如下:

ThinkPHP5核心类Request远程代码漏洞分析

 

可以看到完整版比核心版多出了几个文件夹。特别需要注意的就是think-captcha/src这个文件夹里有一个helper.php文件:

ThinkPHP5核心类Request远程代码漏洞分析

 

这里调用thinkRoute::get函数进行路由注册的操作。而这步操作的影响就是改变了上文提到的self::$rules的值。有了这个路由,才能进行RCE,否则不成功。这也就是为什么只影响完整版,而不影响核心版的原因。此时的self::$rules的值为:

ThinkPHP5核心类Request远程代码漏洞分析

 

那么,当攻击者控制返回的$method的值为get的时候,$rules的值就是这条路由的规则。然后回到上文取到$rules之后,根据传入的URL取得$item的值,使得$rules[$item]的值为captcha路由数组,就可以进一步调用到self::parseRule函数。函数体略长,这里取关键点:

此时传递进来的$route的值为thinkcaptchaCaptchaController@index。因此进入的是标注红色的if分支中。在这个分支中,$result的’type’键对应的值为‘method’。然后将$result层层返回到run函数中,并赋值给了$dispatch。

然后将$dispatch带入到self::exec函数中:

进入到红色标注的分支,该分支调用Request类的param方法。因此,满足了利用链的第三步,造成命令执行。

启明星辰ADLab安全研究员对ThinkPHP5.0-5.0.23每个版本都进行了分析,发现ThinkPHP5.0.2-5.0.23可以使用同一个POC,而ThinkPHP5.0-5.0.1需要更改一下POC,原因在于Route.php的rule函数的一个实现小差异。

ThinkPHP5.0-5.0.1版本的thinkphp/library/think/Route.php:235,将$type转换成了大写:

ThinkPHP5核心类Request远程代码漏洞分析

 

在ThinkPHP5.0.2-5.0.23版本中,rule函数中却将$type转换成了小写:

ThinkPHP5核心类Request远程代码漏洞分析

 

四、补丁分析

在ThinkPHP5.0.24中,增加了对$this->method的判断,不允许再自由调用类函数。

ThinkPHP5核心类Request远程代码漏洞分析

 

五、结论

强烈建议用户升级到ThinkPHP5.0.24版本,并且不要开启debug模式,以免遭受攻击。

相关推荐:《PHP教程》

以上就是ThinkPHP5核心类Request远程代码漏洞分析的详细内容,更多请关注其它相关文章!



Tags:ThinkPHP5   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
ThinkPHP诞生于2006年,是一个国产开源的PHP开发框架,其借鉴了Struts框架的Action对象,同时也使用面向对象的开发结构和MVC模式。ThinkPHP可在Windows和Linux等操作系统运行,支持MySql,Sqlite和PostgreSQL等多种数据库以及P...【详细内容】
2020-09-03  Tags: ThinkPHP5  点击:(298)  评论:(0)  加入收藏
一 、前言ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的轻量级PHP开发框架,具有免费开源、快速、简单且面向对象等特点。 在ThinkPHP的5.*版本中存在安全隐患,...【详细内容】
2019-11-15  Tags: ThinkPHP5  点击:(153)  评论:(0)  加入收藏
一、漏洞介绍2019年1月11日,ThinkPHP团队发布了一个补丁更新,修复了一处由于不安全的动态函数调用导致的远程代码执行漏洞。该漏洞危害程度非常高,默认条件下即可执行远程代码...【详细内容】
2019-11-01  Tags: ThinkPHP5  点击:(100)  评论:(0)  加入收藏
thinkphp5多语言进行切换的步骤:第一步,在配置文件中开启多语言配置。 第二步,创建多语言目录。 相关推荐:《ThinkPHP教程》第三步,编写语言包。 视图代码: 控制器代码: 效果如...【详细内容】
2019-10-14  Tags: ThinkPHP5  点击:(165)  评论:(0)  加入收藏
DophinPHP(海豚PHP)是一个基于ThinkPHP5.1.34 LTS开发的一套开源PHP快速开发框架,DophinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机制,集成多种...【详细内容】
2019-10-11  Tags: ThinkPHP5  点击:(148)  评论:(0)  加入收藏
(1)、 插入数据并且返回当前插入的自增ID $db = Db::name('user'); $id = $db->insertGetId(['password'=>'123','username'=>'888&#...【详细内容】
2019-10-10  Tags: ThinkPHP5  点击:(175)  评论:(0)  加入收藏
ThinkAdmin V5 是一个基于 ThinkPHP 5.1 开发的后台管理系统。我们致力于二次开发底层框架,提供完整的组件及API,基于此框架可以快速开发应用。另外项目安装及二次开发可以参...【详细内容】
2019-10-09  Tags: ThinkPHP5  点击:(176)  评论:(0)  加入收藏
需要摒弃的3.X旧思想URL的变动首先对3.X的不严谨给开发者们带来的不正确的引导表示歉意,在5.0版本正式废除类似/id/1方式 可以通过‘get’获取到‘id’...【详细内容】
2019-07-03  Tags: ThinkPHP5  点击:(397)  评论:(0)  加入收藏
▌简易百科推荐
序言:前段时间织梦因为版权的问题在网上闹得沸沸扬扬,也提醒了众多开发者选择cms上应该谨慎使用,今天给大家展示一款自己搭建的内容管理系统,不用担心版权的问题,而且非常容易维...【详细内容】
2021-11-30  小程序软件开发    Tags:管理系统   点击:(34)  评论:(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   点击:(41)  评论:(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   点击:(65)  评论:(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环境   点击:(129)  评论:(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)  加入收藏
最新更新
栏目热门
栏目头条