logo

中文|English|客服热线:4008107766

售后服务
4008107766
当前位置:首页 > 新闻中心 > 企业新闻
企业新闻

ThinkPHP再爆高危漏洞,网御星云第一时间提供解决方案

时间:2019-01-14
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,该框架国内应用非常广泛。

2019年1月11日官方修复了一处严重的漏洞,该漏洞可导致远程命令代码执行。

漏洞影响版本

5.0.x-5.0.23

漏洞分析

漏洞主要出现在ThinkPHPRequest类的method方法中(thinkphp/library/think/Request.php),Request类可以实现对HTTP请求的一些设置,其中成员方法method用来获取当前请求类型,其定义如下:


thinkphp支持配置“表单伪装变量”,默认情况下该变量值为_method,可以通过“表单伪装变量”进行变量覆盖实现对该类任意函数的调用,并且$_POST作为函数的参数传入。


Requset构造函数如下:


因此可以通过构造函数实现对Request类属性进行覆盖,如filter属性。构造如下payload实现远程代码执行:


 
远程代码最终是在filterValue中的call_user_func()执行:


在官网下载的5.0.23完整版中,在App类(thinkphp/library/think/App.php)中module方法增加了设置filter参数值的代码,用于初始化filter。因此通过上述请求设置的filter参数值会被重新覆盖为空导致无法利用。

在5.0.23 Request类中有个param成员函数用于获取当前请求的参数,也有个method函数:


当传入数值为true时候:


跟进到server方法,参数$name为REQUEST_METHOD


$data为上一步的REQUEST_METHOD:


要想触发调用param(),只要开启了debug模式即可:


故构造payload如下:


 
前面分析可知,我们需要触发Request类中的param函数来完成filter的覆盖,在App类中exec()方法中当$dispatch[‘type’]为controller 和method时有直接的调用:


而url中s的值完成设置不同的$method,最终让routeCheck返回我们需要的$dispath即可。例如构造如下payload,无需debug模式开启也可实现远程代码执行:


解决方案

1, 官方建议:

受影响的用户可将5.0.x升级到5.0.24,官方现已推出补丁,建议开发者进行修复:


产品检测与防护:

已部署网御星云IDS、IPS、WAF产品的客户请确认如下事件规则已经下发并应用,即可有效检测或阻断攻击:HTTP_ThinkPHP5.0全版本远程代码执行漏洞

(1)网御入侵检测系统报警截图:


(2)网御入侵防护系统报警截图:


(3)网御Web应用安全防护系统报警截图:

关于我们
公司简介
合作伙伴
核心技术
团队风采
推荐型号
防火墙系列产品
服务与下载
支持与服务
在线升级
联系我们
二维码