导语: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视频