0x00. 漏洞简介
近日,thinkphp官方发布了5.x版本一处安全更新,修复了路由中controller部分过滤不严从而导致getshell的安全漏洞。漏洞影响范围:<5.1.31 或5.0.x- 5.0.23。
0x01. 漏洞分析
本文以5.1.29版本进行漏洞跟进。关键代码thinkphplibrarythinkroutedispatchModule.php:84
此处实现了父类Dispatch的exec()抽象方法,对传入的控制器进行实例化,返回一个实例,并通过反射的方式调用其操作方法。
跟踪$this->controller变量,thinkphplibrarythinkroutedispatchModule.php:70
可以看到$controller变量的值在$result[1]不为空的条件下来自于$result数组。
并且此处对从路由中取出的控制器参数除了做小写转化没做任何过滤操作。继续跟进$result数组:
thinkphplibrarythinkroutedispatchModule.php:31
$result来自父类Dispatch的$this->dispatch属性,当$result为字符串的时候,利用‘/’切割为数组。跟踪$this->dispatch属性,来到thinkphplibrarythinkApp.php:604
其中的$path参数来自于URL中的pathinfo,thinkphplibrarythinkRequest.php:678
而默认config['var_pathinfo']为s,所以根据thinkphp的路由规则,应该这样构造url:
跟进$this->route->check()方法,tp5.1.29thinkphplibrarythinkRoute.php:877
此处非强制路由和域名路由,所以走默认路由解析,继续跟进UrlDispatch类,也就是url类:
thinkphplibrarythinkroutedispatchUrl.php:18
此处调用parseurl()函数对传入的$url进行解析,进一步跟进parseurl():
thinkphplibrarythinkroutedispatchUrl.php:37
parseurl()调用了parseUrlPath()进行url的解析,整个解析过程同样只是简单的利用‘/’进行分割,没有做任何过滤:
thinkphplibrarythinkroutedispatchUrl.php:947
最终将分割好的$path封装成路由返回:
接着将其作为属性传入Module类中并新建对象和初始化后,最后回到App类中继续执行:
接下来的调用栈如下:
也就回到开头的关键代码处。
至此,整个流程分析完成,可以得出:moudle类中result属性来自于url中pathinfo,pathinfo用户可控,并且代码对其没有任何过滤操作,也就是说待实例化的$this->controller以及其调用$this->actionName用户完全可控。那么通过引入‘’,利用命名空间的特性,就可以实例化thinkphp中的任意一个类,并调用其任意方法,所以找到存在利用点的类及其方法就可以完成漏洞利用。
0x03.漏洞利用。
目前存在多个可以利用的类及其方法:
thinkrequest->input()
thinkrequest->cache()
thinkapp->invokefunction()
thinkcontainer->invokefunction()
这里用其中一个完成RCE的利用:
Xss的利用:
0x04.修复建议
官方已提供相应补丁,及时升级到官方最新版本即可。
0x05.参考链接
https://blog.thinkphp.cn/869075
原文始发于微信公众号(哆啦安全):Thinkphp 5.x getshell漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论