我发现仍然有大量厂商和用户在使用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 = 命令执行。