ThinkPHP 5.0漏洞 ThinkPHP 5.0.*命令执行漏洞解决方法

2021年4月28日10:49:00 发表评论 38 次浏览

我发现仍然有大量厂商和用户在使用5.0.23及其以下的存在漏洞的版本,希望大家尽快修复下,毕竟安全真的是件很重要的事情,一旦遇上,必定嗝屁.

ThinkPHP 5.0 版本是一个颠覆和重构版本,也是ThinkPHP 十周年献礼版本,基于 PHP5.4 设计(完美支持 PHP7 ),采用全新的架构思想,引入了很多的 PHP 新特性,优化了核心,减少了依赖,支持Composer ,实现了真正的惰性加载,并且为 API 开发做了深入的支持,在功能、性能以及灵活性方面都较为突出 。

漏洞描述

ThinkPHP5.0在核心代码中实现了表单请求类型伪装的功能,该功能利用$_POST['_method']变量来传递真实的请求方法,当攻击者设置$_POST['_method']=__construct时,Request类的method方法便会将该类的变量进行覆盖,攻击者利用该方式将filter变量覆盖为system等函数名,当内部进行参数过滤时便会进行执行任意命令。

影响范围

ThinkPHP 5.0.0 ~ ThinkPHP 5.0.23

修复方式

  • 方式1:升级到5.0.24,并在线上关闭debug模式
  • 方式2:全部走强制路由
  • 方式3:在以下位置加入以下代码:
    /thinkphp/library/think/APP.php 第553行后加入代码

加入的代码如下,方便复制粘贴


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

具体的漏洞测试可以参考此文章:
https://www.freebuf.com/vuls/194127.html

总结

漏洞利用方式

表单请求类型伪装 + filter参数 = 覆盖变量filter;
变量覆盖filter + debug模式 + 执行filter = 命令执行。
阿修罗

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: