欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

WordPress.org可进行蠕虫攻击的存储型XSS漏洞披露

来源:本站整理 作者:佚名 时间:2018-12-29 TAG: 我要投稿

WP GDPR Compliance是WordPress中一个非常流行的插件,被发现存在权限提升漏洞,通过对该漏洞的利用,攻击者可以轻易的劫持成千上万的网站。虽然一个插件的漏洞仅代表了使用它的网站上的安全缺陷,然而,就WordPress生态系统的风险性而言,有一些内容比WP GDPR Compliance之类的流行插件更值得我们探讨,那就是WordPress.org的安全性。在这篇博文中,我们调查了WordPress.org网站上存储的一个关键的XSS漏洞,在今年5月我们曾向WordPress安全团队报告过这一漏洞。
介绍
WordPress.org网站上包含了所有WordPress网站使用过的插件和主题库,除此之外,它还管理了开发人员用来编辑主题和插件代码的帐户。今年5月,我们就告知过WordPress安全团队其网站上的一个关键的存储型XSS漏洞。该漏洞显示在存储库的插件版本号中。因此,只要是拥有该插件的用户都可以将任意JavaScript代码注入WordPress.org网站中。
这个漏洞是我们在开发coderisk.com网站期间检测到的,为了开发该网站,我们不得不对库中每个插件的可用版本进行排序。而由于缺乏统一的版本控制方案,这个过程比我们预期的更具挑战性。超过5万个插件向我们展示了许多“创造性的”版本控制方案,其中之一就是在插件中使用图像而不是版本号。该插件上一次更新是在10年前,当访问存储库中的插件页面时,会确认图像实际上是显示的。当然,这也给安全研究人员敲响了警钟。通过一个插件的快速验证,我们确认了在那个位置注入任意JavaScript的行为是能够实现的。在下文中,我们将概述导致该漏洞的技术细节,并解释该漏洞是如何劫持其他作者的插件的。
技术细节
WordPress.org网站的源代码可以作为WordPress元环境的一部分公开使用。因此,我们可以研究代码的哪一部分致使了漏洞的产生。
插件是如何存储的
WordPress.org网站是使用WordPress CMS构建的。插件库中显示的插件仅仅是使用特殊模板显示的专用文章类型(post-type)的文章。
更改文件、上传新版本等操作,开发人员可以不与网站交互,而是使用版本控制系统Subversion。一旦开发人员将插件插入WordPress存储库,他就能访问Subversion服务器,接着便能在Subversion服务器上对托管的插件进行更改。身份验证凭证与开发人员的WordPress.org用户帐户的凭证相同。插件名、描述、版本等数据都是从插件的readme.txt和主PHP文件中的特殊标头中检索的。WordPress.org上的插件存储库会监视Subversion服务器的变化,并在需要时更新它已保存的有关插件的数据。
注入点
此漏洞的产生,是由于插件版本号在存储库中相应的插件页上显示之前没有得到充分清理。

下面的列表显示了负责显示版本号的代码。
wordpress.org/public_html/wp-content/plugins/plugin-directory/widgets/class-meta.php
' . get_post_meta( $post->ID, 'version', true ) . '' ); ?>
如上所述,在存储库中,插件由专用的post-type表示。关于插件的其他信息(例如版本),将作为元数据添加到代表文章中。最后一行显示了从数据库检索版本号并将其打印到输出的过程中不需要进行任何验证或转义。此时,如果版本号在存储到数据库之前未被清理,则会给出存储的XSS
插件的版本号是从主PHP文件的特殊头文件中检索出来的。
wordpress.org/public_html/wp-content/plugins/plugin-directory/cli/class-import.php
 
namespace WordPressdotorg\Plugin_Directory\CLI;
    ⋮
class Import {
    ⋮
    public function import_from_svn( $plugin_slug ) {
        ⋮
        $data = $this->export_and_parse_plugin( $plugin_slug );
        ⋮
        $headers = $data['plugin_headers'];
        ⋮
        update_post_meta( $plugin->ID, 'version', wp_slash( $headers->Version ) );
从上面的代码中可以看出,WordPressdotorg \ Plugin_Directory \ CLI \ Import:import_from_svn()方法负责将Subversion服务器中的更改与存储在插件存储库中的数据同步。它使用export_and_parse_plugin()方法从插件头部分和readme.txt文件中提取信息,并保存必要的更改。表示版本的字段将作为元值保存到表示插件的post中。只有wp_slash()函数(不阻止XSS)才会应用于检索和保存之间的版本。
如何利用
要利用该漏洞,攻击者需要在WordPress.org插件库中拥有一个插件。考虑到贡献插件的容易性,这并不难实现。
攻击者可以在插件的version字段中隐藏任意的JavaScript的payload。每当有人访问存储库中的插件页面时,此payload就会在WordPress.org的上下文中执行。那么,payload可能会造成什么损害呢?
当插件作者在WordPress.org中登录时,他可以将其他帐户作为提交者添加到他的插件中。这些帐户将被授予对插件的Subversion存储库的完全写入权限,因此可以修改插件的代码。通过这种方式授予对插件的访问权限的帐户,也可以添加和删除提交者。例如,他们可以删除主提交者,即插件的作者,而无需任何验证或警告。添加提交者的过程可以通过一些简单的JavaScript ajax请求触发。攻击者可以设计一个XSS

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载