发帖
Binghe
penguin_wwy
野驴
ohlinge
zusheng
sucppVK
MAX丶
icq8756c1a2
immenma
icq6a70641f
添潮
wangxiulin
签到天数: 5 天
连续签到: 1 天
[LV.2]偶尔看看
版主
78
269
1861
先吐槽下创宇盾 吞了我2次帖子
ThinkPHP 5.0.*远程代码执行漏洞
ThinkPHP 5.0.*
2019年1月12日
ThinkPHP 5.0.全版本
跟着大佬的脚步笔者简单的分析了下。 Thinkphp处理请求的关键类为Request(thinkphp/library/think/Request.php) 其中成员函数method用来获取当前请求类型,其定义如下: 该函数主要在其他成员函数(例如isGet、isPost、isPut等)中被用来做请求类型判断 thinkphp支持配置“表单伪装变量”,默认情况下该变量值为_method 因此在method()中,可以通过“表单伪装变量”进行变量覆盖实现对该类任意函数的调用,并且$_POST作为函数的参数传入 Request类的构造函数定义如下 构造函数中,主要对$option数组进行遍历,当$option的键名为该类属性时,则将该类同名的属性赋值为$options中该键的对应值。
Request(thinkphp/library/think/Request.php)
_method
$_POST
因此可以构造请求如下,来实现对Request类属性值的覆盖,例如覆盖filter属性。filter属性保存了用于全局过滤的函数。 因此在thinkphp 5.0.10 中可以通过构造如下请求实现代码执行: 但是笔者测试了所有版本后发现一个问题 那就是这个漏洞并不通杀 笔者后续对比了官方多个发布的5.0版本,大概总结出如下结论
之前看很多人复现时选的版本是5.0.13~5.0.19的,这些版本默认情况下config中的app_debug配置项为false,这也是为什么很多人用payload都无法复现
在版本低于5.0.13的版本中,破坏性还是很强的,因为无需开启debug模式即可造成代码执行 在版本高于5.0.20的版本中,破坏性还是一般的,需开启debug模式才可造成代码执行 关于为什么5.0.7及以下版本不能执行,笔者对比了thinkphp\library\think\Route.php,发现5.0.8相对于5.0.7在获取当前请求类型的路由规则处增加了一个三目运算符导致$rules数组被置空 这也解释了为什么5.0.7执行时会爆出如下错误 附赠2个payload 由于创宇盾的原因 全部用图片了
thinkphp\library\think\Route.php
$rules
认证勋章
春秋巡逻
只有在社区发布原创文章才能获得哦
游侠勋章
i春秋荣誉技术顾问