ThinkPHP 5.x 远程代码getshell漏洞分析

引言

ThinkPHP 是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,因为其易用性、扩展性,已经成长为国内颇具影响力的WEB应用开发框架。

本次ThinkPHP5.x漏洞爆出时间大约是2018-9月,尚处于 0day 阶段时就已经被用于攻击多个虚拟货币类、金融类网站;直到2018-10-8号左右才被广泛传开,杀伤力太大,无条件执行代码,我的几个项目也紧急的升级,有惊无险。

ThinkPHP5.x漏洞影响版本

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

漏洞分析我是第一时间在T00ls上看的,现在已经全网到处都是了。

漏洞分析

该漏洞出现的原因在于ThinkPHP5框架底层对控制器名过滤不严,从而让攻击者可以通过url调用到ThinkPHP框架内部的敏感函数,进而导致getshell漏洞。

漏洞点在Module.php,先调用的exec函数,初始化类时调用init()$this->dispatch获取$controller和 $this->actionName的值然后进入exec函数。

先调用的exec函数,初始化类时调用init()$this->dispatch获取$controller和 $this->actionName的值然后进入exec函数。

$this->app->controller中将$this->controller进行实例化,跟进$this->app->controller

$this->parseModuleAndClass对传入的controller进行解析,返回解析出来的class以及module。可以看到如果$name\开头就将name直接作为class,再返回到controller函数中将$class实例化成object对象,返回给exec函数中的$instance

最后就是调用invokeArgs进行反射调用类中的方法了。

有了任意调用类的方法,我们就只需要找一下可以从那些类进行触发,主要看看\thinkphp\library\think\App.php中的,invokeFunction。

ThinkPHP 5.0.x漏洞invokeFunction

ThinkPHP 5.1.x漏洞invokeFunction

都是对传入的$function以及$var进行动态调用,直接传入?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1即可。

漏洞复现

payload如下:

直接访问即可任意代码执行。

漏洞防御

升级到Thinkphp最新版本,包括自动升级最新内核版本和手动升级方法,具体看官方:https://blog.thinkphp.cn/869075