CDN加速

产品动态 > 正文

【漏洞预警】ThinkPHP远程代码执行漏洞

2018-12-11


2018年12月9日,ThinkPHP发布5.*版本更新,主要涉及一个安全问题的修复。由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本,攻击者利用此漏洞可以远程执行代码并获取web服务器系统权限,危害严重。建议尽快更新到最新版本。

事件回顾

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,在国内得到广泛应用。

此次漏洞出现的原因是路由调度功能出现问题。在执行路由调度的代码中使用了$this->app->controller方法来实例化控制器,然后调用实例中的方法。

助力零售业数字化升级 网宿斩获“最佳平台解决方案服务商奖”

controller方法通过parseModuleAndClass方法解析出$module和$class,然后实例化$class。

助力零售业数字化升级 网宿斩获“最佳平台解决方案服务商奖”

而parseModuleAndClass方法中,当$name以反斜线\开始时直接将其作为类名。利用命名空间的特点,如果可以控制此处的$name(即路由中的controller部分),那么就可以实例化任何一个类。

回头检查路由解析的代码。其中route/dispatch/Url.php:: parseUrl方法调用了route/Rule.php:: parseUrlPath来解析pathinfo中的路由信息,并且仅使用/对$url进行分割,未进行任何过滤。

助力零售业数字化升级 网宿斩获“最佳平台解决方案服务商奖”

其中的路由url从Request::path()中获取:

助力零售业数字化升级 网宿斩获“最佳平台解决方案服务商奖”

由于var_pathinfo的默认配置为s,因此可利用$_GET[‘s’]来传递路由信息,也可利用pathinfo来传递,但测试时windows环境下会将$_SERVER[‘pathinfo’]中的\替换为/。结合前面分析可得初步利用代码如下:index.php?s=index/\namespace\class/method ,这将会实例化\namespace\class类并执行method方法。

执行成功的实例:

助力零售业数字化升级 网宿斩获“最佳平台解决方案服务商奖”

影响范围

ThinkPHP 5.1.x< 5.1.31
ThinkPHP 5.0.x <= 5.0.23

官方修复方案

目前,官方已发布最新更新,请受影响用户请尽快升级到V5.1.31或V5.0.23版本。

补丁地址:
Thinkphp v5.0.x: https://github.com/top-think/framework/commit/b797d72352e6b4eb0e11b6bc2a2ef25907b7756f

Thinkphp v5.1.x: https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815

网宿建议

如果暂时无法更新到最新版本,可以参考下面的版本库代码记录,自行增加相关代码。
5.0版本代码:https://github.com/top-think/framework/commit/b797d72352e6b4eb0e11b6bc2a2ef25907b7756f

5.1版本代码:https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815

网宿云WAF已于漏洞公开后的第一时间更新防护策略,为平台客户实时抵御威胁。同时,网宿云安全已开通漏洞响应快速通道,受本次漏洞影响的网站负责人可以致电网宿科技7*24小时客服热线,在安全专家的指导下快速接入网站,立即启动防护。

网宿云WAF能够防护已知的各类漏洞,同时,还可以基于对大量监控数据的实时分析,可以第一时间发现并防护新出现的漏洞,保障网站底层框架的安全。

参考链接:
https://blog.thinkphp.cn/869075
https://mp.weixin.qq.com/s/oWzDIIjJS2cwjb4rzOM4DQ
https://mp.weixin.qq.com/s/JVR5r64zwK_oBPzAXSgWAQ