1. 漏洞描述
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。遵循Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于ThinkPHP开发的应用开源或商业产品发布/销售。
ThinkPHP5.0版本是一个颠覆和重构版本,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由、日志、异常、模型、数据库、模板引擎和验证等模块都已经重构,不适合原有3.2项目的升级
2018 年 12 月 9 日 ThinkPHP官方博客发布ThinkPHP5.*版本安全更新称,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本,推荐尽快更新到最新版本。
2. 影响范围
其中受影响版本为:
5.0版本的受影响范围为:小于V5.0.23版本
5.1版本的受影响范围为 :小于V5.1.31版本
3. 利用前置条件
没有开启强制路由
4. 修复建议
4.1. 升级版本至最新版本:
当前ThinkPHP官方已经发布补丁,升级至最新版本修复该漏洞问题。
ThinkPHP5.0.X版本,升级至最新的5.0.23版本,完整版本下载地址:
https://github.com/top-think/framework/tree/v5.0.23或
http://www.thinkphp.cn/donate/download/id/1278.html
ThinkPHP5.1.X版本,升级至最新的5.1.31版本,完整版本下载地址:
https://github.com/top-think/framework/tree/v5.1.31
4.2. 临时缓解措施:
开启强制路由,打开以下参数配置:
(默认的配置文件,在application/config.php中)
'url_route_on' => true,
'url_route_must' => true,
5. 测试POC
可以通过以下POC,进行漏洞的有效性测试,以测试是否确实存在远程代码执行漏洞:
http://127.0.0.1:8888/index.php?s=index/\think\Request/input&data[]=id&name=0&filter=phpinfo
(注意:若此poc未能触发phpinfo函数执行的,并不代表漏洞不存在,受配置和版本影响,可能存在一定差异,强烈建议升级至最新版本)