ThinkPHP5控制器名漏洞导致远程代码执行WebShell的分析和修复

我们常用的国产PHP框架,由于未对控制器名没有进行有效的安全过滤和检查,导致在admin,index等内部模块在系统默认没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell。从而导致恶意注入代码并利用这些类和方法调用PHP命名空间中的任意类方法,从而导致被入侵。这漏洞设计到Thinkphp 5.1.0 - 5.1.31,Thinkphp 5.0.5 - 5.0.23等版本。所以目前服务器上还在使用这些版本的ThinkPHP框架的程序建议修复改漏洞,或通过NGINX的安全策略过滤。


漏洞原理分析
首先这个漏洞是ThinkPHP5系列中控制器这块的漏洞,因为没有对控制器$controller进行严格过滤,从而获取控制器的名然后利用里面的各模块来执行任意Webshell代码。问题代码如下图。
001
从上图中的代码中可看到$this->$controller虽然使用了HTML的标签过滤函数这个操作,但是ThinkPHP并没有进行强制到这里从让路由文件来执行危险代码。
这样在对方网页上构造一个如下的特殊URL地址http://www.nrjs.cn/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=100就可以查看对方服务器上的大量信息。这些信息是通过远程执行phpinfo得到的。当然也可以执行其他的恶意代码http://www.nrjs.cn/index.php?s=index/\think\app/invokefunction&function=get等等。上面的网址只是范例,但相关漏洞已经修复了。


第一种漏洞修复方法
就是及时升级你的ThinkPHP版本,ThinkPHP 5.0系列 5.0.23,和ThinkPHP 5.1系列 5.1.31是没有这个漏洞的最新版本。


第二种漏洞修复方法
首先登陆你服务器,然后用vim打开library/think/route/dispatch/Url.php文件(这个是5.1版)大概找到文件63行的样子,添加一个if判断,并且使用preg_match('/^[A-Za-z](\w|\.)*$/', $controller)对控制器的字符进行严格的过滤后再进行下一步动作。而另一个5.0版本则打开/library/think/App.php中间的module方法,大概在376行的样子,也进行preg_match匹配判断。



扩展阅读;ThinkPHP是使用量和市场占率比较大的简单的轻量级国产PHP开发框架,所以该漏洞导致的影响范围也大。在2018年12月08日就有人检测到ThinkPHP官方也随机发布安全更新,可见这个漏洞还是比较大而且比较重视的,在及时公开这一个高危安全漏洞,攻击者构造特定的恶意请求,可以直接获取服务器权限。如果有任何问题或需要协助欢迎随时登录我们专业的Q群沟通。

本文由作者自行上传并发布,牛人技术博客仅提供信息发布平台。文章仅代表作者个人观点,不代表本博客立场。如需转载,必须声明出处。

网友评论 comments

发表评论

电子邮件地址不会被公开。必填项已用 *标注

暂无评论

牛人技术博客 | AboutUS | 湘ICP备13000282号-8 |
Copyright © 2009 - 2018 NRJS Corporation, All Rights Reserved
添加图标到手机桌面
扫二维码
扫二维码
返回顶部