一个简单但严重的应用层 DoS 漏洞出现在 WordPress CMS 平台上,可导致任何人拿下多数 WordPress 站点,即使单凭单台机器也能办到,而无需像发动 DDoS 攻击那样攻击大量带宽。
由于 WordPress 所在公司拒绝修复该问题,因此漏洞 (CVE-2018-6389) 仍未修复,影响9年来发布的几乎所有 WordPress 版本,包括最新发布的 WordPress 稳定版本 4.9.2。
以色列安全研究员 Barak Tawily 发现了这个漏洞,他指出漏洞在于WordPress CMS 内置脚本 “load-scripts.php” 处理用户定义的请求的方式。”load-scripts.php”文件按设计是让管理员用户帮助站点(在服务器端)通过将多个 JavaScript 文件结合到一个单点请求的方式改进性能并提高页面加载速度。
然而,该脚本要在登录前在管理员登录页面 (wp-login.php) 运行,WordPress 作者并未设置任何认证措施,导致任何人均可访问该功能。
根据作者所安装的插件和模块,该脚本会选择性地调用所用 JavaScript 文件,方法是将JavaScript 文件的名称通过 “load” 参数,并用逗号隔开,如下 URL 所示:
当加载网站时,”load-scripts.php” 试图找到 URL 中给出的每个 JavaScript 文件名称,将内容后缀到一个单一文件中并将其发送回用户的网络浏览器中。
WordPress DoS 攻击如何运作
研究人员表示,任何人只要强制 load-scripts.php 将文件名称通过以上提及的 URL 中,将所有可能的 JavaScript 文件(即181个脚本)调用到一个文件中就能让目标网站的速度因消耗大量 CPU 和服务器内存而稍稍变慢。
尽管单一请求不足以拿下整个站点,但 Tawily 通过一个 PoC python 脚本 doser.py 向同一个 URL 提出大量共存请求,试图消耗尽可能多的服务器 CPU 资源并将网站拿下。
The Hacker News 已验证了 DoS 利用的真实性,它成功了拿下了运行在中等规模的 VPS 服务器上的示例WordPress 站点。Tawily 表示,提出500个请求后,服务器无法继续提供相应或者返回502/503/504状态码错误。
然而,从单个机器上且以 40 Mbps 连接的速度发动攻击不足以拿下另外一个运行在具有大量计算能力和内存的专门服务器上的演示站点。但这并不意味着该缺陷无法被用于攻击运行在重量级服务器上的 WordPress 站点,因为应用层的攻击通过更少的包和带宽就能实现同一个目的。
因此带宽足够多或者拥有足够僵尸的攻击者能够利用该缺陷攻击大型的流行站点。
缓解措施
除了发布全部信息后,Tawily 还提供了针对 WordPress 的 DoS 攻击视频。
由于知道 DoS 漏洞并未包含在 WordPress 的漏洞奖励计划之中,Tawily 通过 HackerOne 平台负责任地将该漏洞报告给 WordPress 团队。然而,WordPress 公司拒绝承认该问题的存在,表示这种问题“真的应该在服务器端或网络层面得到缓解而不是在应用层面”,并指出这超出了 WordPress 的控制范围。
该漏洞似乎很严重,因为 WordPress 驱动着29%的网络,它可导致数以百万计的网站易受攻击,而合法用户无法使用。
对于无违法承担抵御应用层面攻击服务的站点,Tawily 提供了一个 WordPress 的复刻版本,提供了缓解措施。
不过,作者本人不建议用户安装修改版本的 CMS 平台,即使它源于原始作者之外的受信任来源。此外,Tawily 还发布了一个简单的 bash 脚本来解决这个问题。