ThinkPHP 5.0 * 远程代码执行漏洞简略分析

漏洞名称

ThinkPHP 5.0.*远程代码执行漏洞
日期

2019年1月12日
影响范围

ThinkPHP 5.0.全版本
分析

跟着大佬的脚步笔者简单的分析了下。
Thinkphp处理请求的关键类为Request(thinkphp/library/think/Request.php)
其中成员函数method用来获取当前请求类型,其定义如下:
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第1张图片该函数主要在其他成员函数(例如isGet、isPost、isPut等)中被用来做请求类型判断
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第2张图片thinkphp支持配置“表单伪装变量”,默认情况下该变量值为_method
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第3张图片因此在method()中,可以通过“表单伪装变量”进行变量覆盖实现对该类任意函数的调用,并且KaTeX parse error: Expected 'EOF', got '#' at position 218: …lor_FFFFFF,t_70#̲pic_center)Requ…option数组进行遍历,当 o p t i o n 的 键 名 为 该 类 属 性 时 , 则 将 该 类 同 名 的 属 性 赋 值 为 option的键名为该类属性时,则将该类同名的属性赋值为 optionoptions中该键的对应值。

因此可以构造请求如下,来实现对Request类属性值的覆盖,例如覆盖filter属性。filter属性保存了用于全局过滤的函数。
因此在thinkphp 5.0.10 中可以通过构造如下请求实现代码执行:
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第4张图片但是笔者测试了所有版本后发现一个问题
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第5张图片那就是这个漏洞并不通杀
笔者后续对比了官方多个发布的5.0版本,大概总结出如下结论

版本名 是否可被攻击 攻击条件
5.0.0 否 无
5.0.1 否 无
5.0.2 否 无
5.0.3 否 无
5.0.4 否 无
5.0.5 否 无
5.0.6 否 无
5.0.7 否 无
5.0.8 是 无需开启debug
5.0.9 是 无需开启debug
5.0.10 是 无需开启debug
5.0.11 是 无需开启debug
5.0.12 是 无需开启debug
5.0.13 是 需开启debug
5.0.14 是 需开启debug
5.0.15 是 需开启debug
5.0.16 是 需开启debug
5.0.17 是 需开启debug
5.0.18 是 需开启debug
5.0.19 是 需开启debug
5.0.20 否 无
5.0.21 是 需开启debug
5.0.22 是 需开启debug
5.0.23 是 需开启debug

之前看很多人复现时选的版本是5.0.13~5.0.19的,这些版本默认情况下config中的app_debug配置项为false,这也是为什么很多人用payload都无法复现
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第6张图片ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第7张图片

总结

在版本低于5.0.13的版本中,破坏性还是很强的,因为无需开启debug模式即可造成代码执行
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第8张图片ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第9张图片

在版本高于5.0.20的版本中,破坏性还是一般的,需开启debug模式才可造成代码执行

ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第10张图片ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第11张图片

关于为什么5.0.7及以下版本不能执行,笔者对比了thinkphp\library\think\Route.php,发现5.0.8相对于5.0.7在获取当前请求类型的路由规则处增加了一个三目运算符导致$rules数组被置空
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第12张图片

这也解释了为什么5.0.7执行时会爆出如下错误
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第13张图片附赠2个payload
由于创宇盾的原因 全部用图片了
ThinkPHP 5.0 * 远程代码执行漏洞简略分析_第14张图片
参考资料:
本文转载自:https://bbs.ichunqiu.com/thread-49591-1-1.html?tdsourcetag=s_pctim_aiomsg

你可能感兴趣的:(版本漏洞,thinkphp,安全漏洞,渗透测试)