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

查看所有标签

猜你喜欢:

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

Imperfect C++中文版

Imperfect C++中文版

威尔逊 / 荣耀、刘未鹏 / 人民邮电出版社 / 2006-1 / 75.0

汇集实用的C++编程解决方案,C++虽然是一门非凡的语言,但并不完美。Matthew Wilson使用C++十年有余,其间发现C++存在一些固有的限制,需要一些颇具技术性的工作进行弥补。本书不仅指出了C++的缺失,更为你编写健壮、灵活、高效、可维护的代码提供了实用的技术和工具。Wilson向你展示了如何克服C++的复杂性,穿越C++庞大的范式阵列。夺回对代码的控制权,从而获得更理想的结果。一起来看看 《Imperfect C++中文版》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具