导语:WordPress CMS平台上发现一个简单但很严重的应用级DoS漏洞,攻击者利用该漏洞可以用很小的带宽来达到网络级DDoS攻击的效果,达到拿下WordPress站点的目的。

简介

WordPress CMS平台上发现一个简单但很严重的应用级DoS漏洞,攻击者利用该漏洞可以用很小的带宽来达到网络级DDoS攻击的效果,达到拿下WordPress站点的目的。

漏洞编号CVE-2018-6389,影响过去9年发布的所有WordPress版本,包括最新的WordPress稳定版Version 4.9.2。但厂商拒绝修复该漏洞。

以色列的安全研究人员Barak Tawily发现该漏洞位于load-scripts.php文件处,load-scripts.php是WordPress CMS的内置脚本,用来处理用户定义的请求。

对于那些不了解的开发者,load-scripts.php文件是admin用户来改善网站性能和加快加载速度的,使用的方法是把多个JS文件融入到一个单独请求中。

为了让load-scripts.php在admin登录前就工作在管理登录页面(wp-login.php),WordPress作者并没有保持任何的认证,这就导致了该页面可以被任何人访问。

Wordpress DoS攻击

依靠已安装的插件和模块,load-scripts.php文件可以通过传递name到load参数来选择性的调用必须的JS文件,这些name是以“,”隔开的,就像下面的链接:

https://your-wordpress-site.com/wp-admin/load-scripts.php?c=1&load=editor,common,user-profile,media-widgets,media-gallery

当网站加载时,load-scripts.php会根据URL中的每个name去寻找对应的JS文件,并把其中的内容添加到一个单独的文件,然后发送回用户的web浏览器。

WordPress DoS攻击原理

研究人员说,攻击者可以通过把所有的参数传递给上面的URL来让load-scripts.php来调用所有可能的JS文件,通过消耗更多的CPU和服务器内存来让目标网站运行变慢。

用户可以用预先定义好的列表($wp_scripts)来发送请求,而这是load[]参数的一部分。如果请求的值存在,服务器会用从用户那里获取的补充值相关的预定义的路径来执行I/O读操作。

虽然访客不能用一个简单的请求来拿下整个网站,但是研究人员用一个Python POC脚本(doser.py)来向相同的URL发起大量的并发请求,这会大量消耗目标服务器的CPU资源并让服务器宕机。

Hacker News验证了DOS漏洞利用的真实性,成功地拿下了中等VPS服务器上运行的demo WordPress站点。这再次证明了load-scripts.php不需要任何的认证,匿名用户也可以进行上述操作。当服务器的请求达到500左右的时候,服务器就不再响应了,返回502/503/504错误。但是来自一个机器的40Mbps的连接是不足以让运行在处理能力和内存比较高配的服务器上的demo WordPress站点宕机的。

有更大带宽和僵尸主机的攻击者可以利用该漏洞来攻击更大、更主流的WordPress站点。

补丁?

截止目前,还没有补丁发布。该漏洞大概影响29%的web站点,将上百万的网站至于黑客的面前,同时会让合法的用户得不到正常的服务。对于那些不能提供预防应用层攻击的DDOS保护的网站,研究人员做了一个WordPress站点的副本,可以预防此类漏洞。

研究人员建议用户不要安装此类修改过的CMS,即使这种CMS的来源是可信的。研究人员也发布了bash脚本来修复该漏洞。

if [[ -f wp-login.php &&-f wp-admin/load-scripts.php &&-f wp-admin/includes/noop.php ]]
then
sed -i "1 s/^.*$/<?php\ndefine('CONCATENATE_SCRIPTS', false);/" wp-login.php
sed -i -e "s/^require( ABSPATH . WPINC . '\/script-loader.php' );$/require( ABSPATH . 'wp-admin\/admin.php' );/g" wp-admin/load-scripts.php
sed -i -e "s/^require( ABSPATH . WPINC . '\/script-loader.php' );$/require( ABSPATH . 'wp-admin\/admin.php' );/g" wp-admin/load-styles.php
echo"""<?php
/**
* Noop functions for load-scripts.php and load-styles.php.
*
* @package WordPress
* @subpackage Administration
* @since 4.4.0
*/
function get_file( \$path ) {
       if ( function_exists('realpath') ) {
               \$path = realpath( \$path );
       }
       if ( ! \$path || ! @is_file( \$path ) ) {
               return '';
       }
       return @file_get_contents( \$path );    
}"""> wp-admin/includes/noop.php
echo'Successfuly patched.'
else
echo'Please run this file from WordPress root directory.'
fi

附POC视频

源链接

Hacking more

...