程序员开发实例大全宝库

网站首页 > 编程文章 正文

ThinkPHP5.*远程代码执行高危漏洞手工与升级修复解决方法

zazugpt 2024-10-10 14:39:02 编程文章 19 ℃ 0 评论

漏洞描述

由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell。

漏洞评级

严重

影响版本

ThinkPHP 5.0系列 < 5.0.23ThinkPHP 5.1系列 < 5.1.31

安全版本

ThinkPHP 5.0系列 5.0.23ThinkPHP 5.1系列 5.1.31

ThinkPHP5.*版本发布安全更新

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

漏洞注入方式(是否有漏洞测试)

1.写入文件

/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=***.php&vars[1][]=***

2.查看版本信息

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

解决办法


手动修正

5.1版本

thinkphp/library/think/route/dispatch/Url.php 类的parseUrl方法,解析控制器后加上 添加

 if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
     throw new HttpException(404, 'controller not exists:' . $controller);
 }

5.0版本

thinkphp/library/think/App.php 类的module方法的获取控制器的代码后面加上

if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
    throw new HttpException(404, 'controller not exists:' . $controller);
}

由于我之前项目使用5.0所以只有5.0的修改截图

修改前:



修改后:



框架升级方法

进入到代码根目录 执行

composer update

注意:不推荐用这种方法直接升级,容易引起不兼容情况,如果必须特别想这样子升级修复的话 ,建议提前备份好代码。


目前thinkphp的 5.0(5.0.23) 以及 5.1(5.1.31) 的最新版本,已经修复此漏洞(很多人项目已经发布并未进行修改,强烈建议尽快修复此漏洞),建议大家项目都用目前最新版本。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表