ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

栏目: PHP · 发布时间: 5年前

内容简介:最近TP被爆出三个RCE,最近想跟着大佬们写的文章,把这几个洞分析一下,这里是exp:

最近TP被爆出三个RCE,最近想跟着大佬们写的文章,把这几个洞分析一下,这里是 5.0.0~5.0.23 的RCE。官方补丁地址: https://github.com/top-think/framework/commit/4a4b5e64fa4c46f851b4004005bff5f3196de003

exp:

http://127.0.0.1/index.php?s=captcha

post_poc1:_method=__construct&filter[]=system&method=get&get[]=whoami
post_poc2:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami

未开启Debug

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

漏洞触发流程

首先进入入口点 App.php 中的 run 方法,实例化了一个 $request 对象传给了 routeCheck 方法。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析 跟进 Route::check
ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

$method$request->method() 获得, $rules 会根据 $method 的不同而获得不同的路由规则

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

跟进 $request->method() ,漏洞点在这里,通过外部传入 Config::get('var_method') 可以造成该类的任意方法调用。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

在tp的默认中配置中设置了表单请求类型伪装变量如下,POST一个 _method 参数即可进入判断。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

Request 类的构造方法中, $options 可控,因此我们可以覆盖该类的任意属性。其中 $this->filter 保存着全局过滤规则。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

我们请求的路由是 ?s=captcha ,它对应的注册规则为 \think\Route::get

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

因此我们需要让 $this->method 返回值为get,所以payload中有个 method=get ,然后才会取出 self::$rules[$method] 的值给$rules。

路由检测后接着会执行 self::exec ,并进入 method 分支

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

跟进 Request::instance()->param()$this->param 通过 array_merge 将当前请求参数和URL地址中的参数合并。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

跟进 $this->input ,该方法用于对请求中的数据即接收到的参数进行过滤,而过滤器通过 $this->getFilter 获得。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析 ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

$this->filtersystem ,回到input,因为data为数组,因此可以进入if条件调用 array_walk_recursive($data, [$this, 'filterValue'], $filter) ,对 $data 中的每一个值调用 filterValue 函数。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

即间接调用 call_user_func ,且两个参数可控,造成RCE。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

poc2

回到param方法,跟进method方法,此时参数为True。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析 因此会进入 $this->server
ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

这里也有一个 input

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析 且此时 input 中的 data 对应于 server$this->servername 的值为 REQUEST_METHOD 。因此传入 server[REQUEST_METHOD]=whoami ,因为此时 data 不是数组,所以会直接进入 filterValue
ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

结合之前的 __construct 覆盖 $filter 属性,同样可以造成RCE。

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

补丁分析

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析 对表单请求类型伪装变量添加了白名单,防止任意属性覆盖。

后记

这个洞的攻击链很强,Orz!!。

Referer


以上所述就是小编给大家介绍的《ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

动手玩转Scratch2.0编程

动手玩转Scratch2.0编程

马吉德·马吉 (Majed Marji) / 电子工业出版社 / 2015-10-1 / CNY 69.00

Scratch 是可视化的编程语言,其丰富的学习环境适合所有年龄阶段的人。利用它可以制作交互式程序、富媒体项目,包括动画故事、读书报告、科学实验、游戏和模拟程序等。《动手玩转Scratch2.0编程—STEAM创新教育指南》的目标是将Scratch 作为工具,教会读者最基本的编程概念,同时揭示Scratch 在教学上的强大能力。 《动手玩转Scratch2.0编程—STEAM创新教育指南》共......一起来看看 《动手玩转Scratch2.0编程》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具