ThinkPHP5远程命令执行漏洞POC

暗月博客 2019年11月21日23:10:37评论386 views字数 881阅读2分56秒阅读模式
摘要

近日thinkphp团队发布了版本更新https ://blog.thinkphp.cn/869075,其中修复了一处getshell 漏洞 。

前言

近日thinkphp团队发布了版本更新https://blog.thinkphp.cn/869075,其中修复了一处getshell漏洞

影响范围:5.x < 5.1.31, <= 5.0.23

危害:远程代码执行

漏洞分析

分析补丁:

802f284bec821a608e7543d91126abc5901b2815。

路由信息中controller的部分进行了过滤,可知问题出现在路由调度时。

ThinkPHP5远程命令执行漏洞POC

以5.1.23版本进行分析,执行路由调度的代码如下:

ThinkPHP5远程命令执行漏洞POC

其中使用了$this->app->controller方法来实例化控制器,然后调用实例中的方法。跟进controller方法:

ThinkPHP5远程命令执行漏洞POC

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

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

接着,我们再往回看路由解析的代码。其中route/dispatch/Url.php:: parseUrl方法调用了route/Rule.php:: parseUrlPath来解析pathinfo中的路由信息

ThinkPHP5远程命令执行漏洞POC

代码比较简单,就是使用/对$url进行分割,未进行任何过滤。

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

ThinkPHP5远程命令执行漏洞POC

由于var_pathinfo的默认配置为s,我们可利用$_GET['s']来传递路由信息,也可利用pathinfo来传递,但测试时windows环境下会将$_SERVER['pathinfo']中的/替换为/。

结合前面分析可得初步利用代码如下:index.php?s=index//namespace/class/method ,这将会实例化/namespace/class类并执行method方法。

然而利用过程中会存在一些限制,部分类在实例化时由于缺少参数而报错。

经过一番寻找,在/think/Request类中找到可以利用的方法input。以下为执行phpinfo

ThinkPHP5远程命令执行漏洞POC

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
暗月博客
  • 本文由 发表于 2019年11月21日23:10:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ThinkPHP5远程命令执行漏洞POChttp://cn-sec.com/archives/73771.html

发表评论

匿名网友 填写信息