WordPress官网上可用作蠕虫攻击的存储型 XSS

iso60001  1948天前

22.png

从一个流行的WordPress插件中挖掘出一个关键的漏洞,并在公网上进行全球攻击,就可以使攻击者轻松地劫持数百万WordPress网站,最近的WP GDPR Compliance插件漏洞(https://wordpress.org/plugins/wp-gdpr-compliance/)就是这样一个例子。因此,一个插件,有可能成为所有使用它的网站的一个突破口。然而,在WordPress生态系统的安全风险上,流行插件的安全问题不仅会影响全球的WordPress网站,甚至还会影响WordPress官方网站。在这篇文章中,我们将公布一个WordPress.org网站上存储型XSS漏洞,在今年5月我们向WordPress安全团队报告了这一漏洞。

介绍

WordPress.org 网站保存了所有WordPress网站能使用的插件和主题库。此外,它还管理了开发人员用来编辑其主题和插件的代码的帐户。在今年5月,我们向WordPress安全团队通报了官网上的一个致命的存储XSS漏洞。该漏洞位于代码库中显示插件版本号的位置。因此,任何使用该插件的用户都可以将任意ja vasc ript代码注入到 WordPress.org 网站。这个漏洞是在开发 coderisk.com 网站时检测到的,当时我们正对代码库中的每个插件的可用版本号进行排序。由于缺乏统一的版本控制方案,这项工作比预期的还要更具挑战性。当我们面对50000多个插件时,我们发现了许多“创造性的”版本管理方案。其中一个插件使用图像而不是版本号来标明版本,而它最后一次更新是在十年前。在代码库中访问这个插件的页面时,确认图像正常显示的。当然,这立马就引起了安全研究人员的警觉。通过一个快速验证,我们发现了这个图片位置可以注入任意的ja vasc ript。在下文中,我们将详细描述该漏洞的技术细节,并说明如何利用该漏洞来劫持其他作者的插件。

技术细节

WordPress.org 网站的源代码作为WordPress生态的一部分是向外公开的。因此,我们可以研究哪部分代码容易引发漏洞。

插件是如何被存储的

众所周知,WordPress.org 网站是基于WordPress CMS构建的。插件库中所展现的插件是在特殊模板上显示同一个post类型的插件。

如果要进行更改文件、上传新版本等操作,开发人员不需和网站进行交互,而是直接使用版本控制系统 Subversion。一旦开发人员将插件放入WordPress存储库中,他就可以访问 Subversion 服务器,对在服务器上托管的插件进行更改。身份凭证与开发人员在WordPress.org网站的用户身份验证凭证相同。从插件的readme.txt和主要PHP文件中的特殊头部文件行中可以检索出插件数据,如插件名称、描述、版本等。WordPress.org上的插件库会时刻监视Subversion服务器的改动,并在需要时更新官网上保存的关于插件的数据。

注入点

我们所发现的漏洞,是由于在插件库中相应插件页面上的版本号展示之前没有对它们没有进行充分的安全过滤所致。

33.png

下面的代码负责显示插件版本号。

wordpress.org/public_html/wp-content/plugins/plugin-directory/widgets/class-me ta.php

<li><?php printf( __( 'Version: %s', 'wporg-plugins' ),
'<strong>' . get_post_me ta( $post->ID, 'version', true ) . '</strong>' ); ?></li>

如上所述,在存储库中,插件由专门的post类型表示。该插件的附加信息(如版本等)作为元数据添加到表示内容。最后一行展现了从数据库检索版本号并将其输出到页面这一操作,值得注意的是,这一过程没有进行任何验证或敏感字符转义。在这种情况下,如果版本号在存储进数据库之前没有进行过滤,则最终会形成存储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_me ta( $plugin->ID, 'version', wp_slash( $headers->Version ) );

如上面所示,函数WordPressdotorg\Plugin_Directory\CLI\Import:import_from_svn()负责将 Subversion 服务器中的插件更改与存储库中插件的数据进行同步。它使用export_and_parse_plugin()函数从插件头部分和readme.txt文件中提取信息,并保存最新信息。展示版本的字段作为元数据保存到插件展示数据中。整个过程中只有一个wp_slash()安全过滤函数,而这并不能阻止XSS。

如何利用

为了利用这个漏洞,攻击者需要往WordPress.org插件库中的放入自己的插件。考虑这是一件很容易的事,所以不算攻击限制。

攻击者可能在插件的版本字段中隐藏插入任意ja vasc ript。每次有人访问库中的插件页面时,这个在WordPress.org上的payload都会生效。那么,这些payload到底会造成什么损害呢?

当插件作者登录到 WordPress.org 时,他可以添加其他帐户作为插件提交者之一。这些帐户将被授予Subversion库中该插件的完整控制权,可以任意修改插件代码。在这种权限下的用户甚至还可以添加和删除插件开发者。例如,他可以删除插件的原作者,这一过程无任何验证或警告。而添加插件开发者的流程可以通过一些简单的ajax请求来实现。

综上所述,攻击者可以设计一个特定的payload,当插件作者访问受感染页面时,它会悄悄地添加攻击者为插件开发者之一。此时,攻击者就可以在被劫持的插件中植入隐藏后门,并同时将payload插入到它们的版本号中,从而进一步传播。上述攻击可以通过发布一个恶意链接到开发人员论坛来启动(例如,WordPress相关论坛)。

额外惊喜:管理界面插入反射型XSS

在找到第一个漏洞之后,我们决定使用RIPS静态代码分析器扫描WordPress.org的代码库。然后我们就发现了WordPress.org/plugin下有关管理页面的另一个反射型XSS漏洞。

wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/tools/class-stats-report.php



public function show_stats() {
    ⋮
    if ( isset( $_POST['date'] ) && preg_match( '/[0-9]{4}\-[0-9]{2}    \-[0-9]{2}$/', $_POST['date'] ) ) {
        $args['date'] = $_POST['date'];
    } else {
        $args['date'] = '';
    }
    ⋮
    $stats = $this->get_stats( $args );
    ⋮    
    printf(
        __( 'Displaying stats for the %1$d days preceding %2$s (and     other stats for the %3$d most recent days).', 'wporg-    plugins' ),
        $stats['num_days'],
        $stats['date'],
        $stats['recentdays']
    );

在上面所示的第3行中,$_POST['date']所接收的用户输入会经过正则表达式的验证。然后打印从用户输入中检索出的值,而这个值在第11行中没有经过转义就输出。这个正则表达式上的一个小漏洞使得我们可以顺利注入payload,而且这个payload严格符合xxxx-xx-xx的模式。

44.png

因为正则表达式中缺少起始符^,所以它匹配任何以指定格式日期结尾的字符串。因此,诸如<sc ript>alert(1)</sc ript>0000-00-00之类的payload将绕过正则表达式检查。RIPS静态代码分析器正确地将其识别为正则表达式漏洞,并能跟踪输入到接受点。

时间线

2018/05/11 在Hackerone上向WordPress安全小组报告该漏洞。

2018/05/12 安全团队对漏洞进行了验证。

2018/05/12 安全团队发布了一个修复程序 https://me ta.trac.wordpress.org/changeset/7195

总结

在这篇博客文章中,介绍了我们在WordPress.org网站上发现的两个XSS漏洞。第一个是插件库中存储型XSS,任何在插件的作者都可以利用这个漏洞。当恶意攻击者利用它,就会造成巨大的破坏。第二个是WordPress.org/plugins下管理页面中的反射型XSS,它展示了正则表达式中的小漏洞是如何造成大麻烦的。

原文链接:https://blog.ripstech.com/2018/wordpress-org-stored-xss/

最新评论

昵称
邮箱
提交评论