您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 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   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关推荐
ThinkPHP诞生于2006年,是一个国产开源的PHP开发框架,其借鉴了Struts框架的Action对象,同时也使用面向对象的开发结构和MVC模式。ThinkPHP可在Windows和Linux等操作系统运行,支持MySql,Sqlite和PostgreSQL等多种数据库以及P...【详细内容】
2020-09-03  Tags: ThinkPHP5  点击:(159)  评论:(0)  加入收藏
一 、前言ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的轻量级PHP开发框架,具有免费开源、快速、简单且面向对象等特点。 在ThinkPHP的5.*版本中存在安全隐患,...【详细内容】
2019-11-15  Tags: ThinkPHP5  点击:(105)  评论:(0)  加入收藏
一、漏洞介绍2019年1月11日,ThinkPHP团队发布了一个补丁更新,修复了一处由于不安全的动态函数调用导致的远程代码执行漏洞。该漏洞危害程度非常高,默认条件下即可执行远程代码...【详细内容】
2019-11-01  Tags: ThinkPHP5  点击:(78)  评论:(0)  加入收藏
thinkphp5多语言进行切换的步骤:第一步,在配置文件中开启多语言配置。 第二步,创建多语言目录。 相关推荐:《ThinkPHP教程》第三步,编写语言包。 视图代码: 控制器代码: 效果如...【详细内容】
2019-10-14  Tags: ThinkPHP5  点击:(124)  评论:(0)  加入收藏
DophinPHP(海豚PHP)是一个基于ThinkPHP5.1.34 LTS开发的一套开源PHP快速开发框架,DophinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机制,集成多种...【详细内容】
2019-10-11  Tags: ThinkPHP5  点击:(84)  评论:(0)  加入收藏
(1)、 插入数据并且返回当前插入的自增ID $db = Db::name('user'); $id = $db->insertGetId(['password'=>'123','username'=>'888&#...【详细内容】
2019-10-10  Tags: ThinkPHP5  点击:(127)  评论:(0)  加入收藏
ThinkAdmin V5 是一个基于 ThinkPHP 5.1 开发的后台管理系统。我们致力于二次开发底层框架,提供完整的组件及API,基于此框架可以快速开发应用。另外项目安装及二次开发可以参...【详细内容】
2019-10-09  Tags: ThinkPHP5  点击:(109)  评论:(0)  加入收藏
需要摒弃的3.X旧思想URL的变动首先对3.X的不严谨给开发者们带来的不正确的引导表示歉意,在5.0版本正式废除类似/id/1方式 可以通过‘get’获取到‘id’...【详细内容】
2019-07-03  Tags: ThinkPHP5  点击:(210)  评论:(0)  加入收藏
▌简易百科推荐
一、开启IIS全部功能。二、部署PHP1.官网下载并解压PHP: https://windows.php.net/downloads/releases/2.将php.ini-development文件改为php.ini3.修改php.ini(1)去掉注释,并修...【详细内容】
2021-07-15  炘蓝火诗  今日头条  Tags:PHP环境   点击:(3)  评论:(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   点击:(23)  评论:(0)  加入收藏
环境Ubuntu-18.0.4php7.4.20序言php的安装应该是php程序开发者必备的技能,建议读者一步步跟着教程做,对每条命令自行测试; 到PHP官网下载tar.gz格式的源码包,我下载的版本是7.4....【详细内容】
2021-06-17  散淡杂记    Tags:php   点击:(47)  评论:(0)  加入收藏
对于一门古老的语言来说,支撑未来技术的东西不是与时俱进吗? 差不多一年前,我发布了一篇题为“PHP可能在未来十年消失”的文章。我发布的这篇文章的总结就像一首《圣诞颂歌》,但...【详细内容】
2021-04-12  InfoQ  今日头条  Tags:PHP   点击:(103)  评论:(0)  加入收藏
Php7.1wget http://mirrors.sohu.com/php/php-7.1.3.tar.gztar zxvf php-7.1.3.tar.gz./configure \ --prefix=/usr/local/php \ --with-apxs2=/usr/local/apache2/bin/apxs...【详细内容】
2021-03-25      Tags:安装php   点击:(125)  评论:(0)  加入收藏
目录 介绍 变量 使用见字知意的变量名 同一个实体要用相同的变量名 使用便于搜索的名称 (part 1) 使用便于搜索的名称 (part 2) 使用自解释型变量 避免深层嵌套,尽早返回 (pa...【详细内容】
2021-03-25      Tags:PHP 代码   点击:(145)  评论:(0)  加入收藏
步骤1、安装php的运行环境2、cmd 查看php -v成功 失败的操作 3从 https://getcomposer.org/download/ 中 composer.cmd的内容@powershell php "%~dp0composer.ph...【详细内容】
2021-03-11      Tags:composer   点击:(108)  评论:(0)  加入收藏
今天这篇文章的内容其实也是非常基础的内容,不过在现代化的开发中,大家都使用框架,已经很少人会去自己封装或者经常写底层的数据库操作代码了。所以这回我们就来复习一下数据库...【详细内容】
2021-03-04  硬核项目经理  今日头条  Tags:PHP   点击:(106)  评论:(0)  加入收藏
1、明确需求实战工作中经常会请求各种各样的接口,例如•微信网页授权接口 • 高德周边检索接口 •发现:下图是根据接口文档开发后的代码,发现代码可读性差(ps. 参数...【详细内容】
2020-12-30      Tags:PHP   点击:(78)  评论:(0)  加入收藏
介绍一个简洁、高性能、跨平台的 PHP7 代码加密扩展特点简单快速,经实测,几乎不影响性能兼容 OPcache、Xdebug 等其他扩展支持 Linux、macOS、Windows 等系统兼容 Apache、Ngi...【详细内容】
2020-12-15      Tags:PHP代码   点击:(32)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条