ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

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

内容简介:最近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 漏洞分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

Domain-Driven Design Distilled

Domain-Driven Design Distilled

Vaughn Vernon / Addison-Wesley Professional / 2016-6-2 / USD 36.99

Domain-Driven Design (DDD) software modeling delivers powerful results in practice, not just in theory, which is why developers worldwide are rapidly moving to adopt it. Now, for the first time, there......一起来看看 《Domain-Driven Design Distilled》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码