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

查看所有标签

猜你喜欢:

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

自品牌

自品牌

陈为、孙郁婷 / 机械工业出版社 / 2015-9-7 / 39

移动互联网来势汹涌,让品牌重新回到人的时代。微信旗帜鲜明地宣示,“再小的个体也有自己的品牌”。《自品牌:个人如何玩转移动互联网时代》作者历经一年,深度访谈10位嘉宾,挖掘其品牌与商业成功密码。吴晓波、雕爷、罗永浩、鬼脚七、马佳佳……这些商业新浪潮中的探路者与领军者,要么是传统领域的老将,要么是新领域里的先锋,但都能以新媒体为载体,构建个人品牌,打造商业生态,抓住互联网的时代红利,顺风而起,顺势而为......一起来看看 《自品牌》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码