内容简介:最近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
漏洞触发流程
首先进入入口点 App.php
中的 run
方法,实例化了一个 $request
对象传给了 routeCheck
方法。
Route::check
$method
由 $request->method()
获得, $rules
会根据 $method
的不同而获得不同的路由规则
跟进 $request->method()
,漏洞点在这里,通过外部传入 Config::get('var_method')
可以造成该类的任意方法调用。
在tp的默认中配置中设置了表单请求类型伪装变量如下,POST一个 _method
参数即可进入判断。
而 Request
类的构造方法中, $options
可控,因此我们可以覆盖该类的任意属性。其中 $this->filter
保存着全局过滤规则。
我们请求的路由是 ?s=captcha
,它对应的注册规则为 \think\Route::get
。
因此我们需要让 $this->method
返回值为get,所以payload中有个 method=get
,然后才会取出 self::$rules[$method]
的值给$rules。
路由检测后接着会执行 self::exec
,并进入 method
分支
跟进 Request::instance()->param()
, $this->param
通过 array_merge
将当前请求参数和URL地址中的参数合并。
跟进 $this->input
,该方法用于对请求中的数据即接收到的参数进行过滤,而过滤器通过 $this->getFilter
获得。
$this->filter
为 system
,回到input,因为data为数组,因此可以进入if条件调用 array_walk_recursive($data, [$this, 'filterValue'], $filter)
,对 $data
中的每一个值调用 filterValue
函数。
即间接调用 call_user_func
,且两个参数可控,造成RCE。
poc2
回到param方法,跟进method方法,此时参数为True。
因此会进入$this->server
这里也有一个 input
,
input
中的
data
对应于
server
的
$this->server
,
name
的值为
REQUEST_METHOD
。因此传入
server[REQUEST_METHOD]=whoami
,因为此时
data
不是数组,所以会直接进入
filterValue
结合之前的 __construct
覆盖 $filter
属性,同样可以造成RCE。
补丁分析
对表单请求类型伪装变量添加了白名单,防止任意属性覆盖。
后记
这个洞的攻击链很强,Orz!!。
Referer
以上所述就是小编给大家介绍的《ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析
- 【漏洞分析】CouchDB漏洞(CVE–2017–12635, CVE–2017–12636)分析
- 【漏洞分析】lighttpd域处理拒绝服务漏洞环境从复现到分析
- 漏洞分析:对CVE-2018-8587(Microsoft Outlook)漏洞的深入分析
- 路由器漏洞挖掘之 DIR-815 栈溢出漏洞分析
- Weblogic IIOP反序列化漏洞(CVE-2020-2551) 漏洞分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。