APP下载

一个合格程序猿应该知道的基础知识(二)—XXE注入攻击

消息来源:baojiabao.com 作者: 发布时间:2024-04-29

报价宝综合消息一个合格程序猿应该知道的基础知识(二)—XXE注入攻击

(图片源于网络,侵删)

ps:在提醒大家一下,明天就是七夕了,没买礼物的可要好好看看文末阿姨给你们的撩妹神器,你绝对值得拥有~

今天给大家介绍一下XML的xxe注入攻击,想知道XML注入的可以翻看上周介绍的基础知识篇。

1

xxe攻击概述

XML外部实体(XXE)攻击是许多基于注入的攻击方式之一,当攻击者将声明XML消息中的外部实体发送到应用程序并使用XML解析器解析时,就会发生这种攻击。

这个漏洞有许多不同的类型和行为,因为它可能会发生在不同类型的技术中,因为不同类型的XML解析器的原因。在这种情况下,令人高兴的是,每个解析器具有不同的功能和“特征”。

在我们开始之前,让我们先认识下可能面临的最常见的XXE漏洞类型—了解这些漏洞类型将有助于我们调试攻击并创建最终正确的POC:

基础的XXE注入— 外部实体注入本地DTD

基于盲注的XXE注入—XML解析器在响应中不显示任何错误

基于错误的XXE注入—成功解析之后,XML解析器始终显示SAME响应。(即“您的消息已被接收”),因此,我们可能希望解析器将文件的内容“打印”到错误响应中。

2


xxe攻击介绍

接下来我们将为大家按顺序介绍这三种类型:

基础的XXE注入

按照上一个概述,我们可以通过使用SYSTEM标识符来引用外部实体的数据。所以现在我们可以引入XXE注入的第一种技术,它将外部实体注入到包含引用本地文件路径(如/ etc / passwd)的SYSTEM标识符的XML文档中:

现在让我们做一个更复杂和更严重的攻击:

如果作为通用功能的一部分,应用程序服务器没有作出回应呢?(记得刚刚提到的基于错误的XXE吗?)如果我们想从其中具有XML特殊字元的外部源读取数据呢?如果在解析过程中解析失败呢?

这时我们可以载入引用我们的远程服务器并尝试从其URL获取内容的辅助外部DTD—这可以是一组字元,或下面的示例转储文件,最重要的是它甚至没有经过XML模式验证过程,因为它在解析器甚至获取远程内容之前发送!

例如,远程DTD文件—包含带有SYSTEM标识符和“file”处理程序的参数实体。请注意,参数实体“file”也连接到实体“send”内的URL:

解析DTD后,我们得到以下实体:

最终,服务器会尝试以文件内容发送参数“c”所指定的内容,到达我们定义的URL—我们记录该内容,并通过这样做来转储文件的内容:

第一步:如下图

第二步: 远程DTD正在解析。我们正在窃取文件的内容...

第三步:我们成功得到文件内容!

用这种技术记住的几件事情:文件内容中的字元“#”将导致URL截断。如果我们使用“or”定义参数实体,内容可能会中断。这取决于我们使用的是哪种(所以请确保在出现错误的情况下同时使用这两种测试场景)。

基于盲注的XXE注入

XML实体分为:参数实体和通用实体两种。参数实体用在DTD定义中。一般的xml文档中都使用通用实体。这里只介绍通用实体。


a、Blind XXE用途

对于传统的XXE来说,要求有一点,就是攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件。

例如:提交请求:

&file;

服务器在这个节点中返回etc/passwd的文件内容:

root:1:3.......

如果服务器没有回显,只能使用Blind XXE漏洞来构建一条带外信道提取数据。

b、参数实体和内部参数实体

Blink XXE主要使用了DTD约束中的参数实体和内部实体。参数实体是一种只能在DTD中定义和使用的实体,一般引用时使用%作为前缀。而内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。

如:

%param1;

[This is my site] &internal;

但是在我研究过程中,发现内部实体的这支持与否也是取决于解释器的。

IE/Firefox:

Chrome:

这也是比较蛋疼的特性,因为php,java,C#等语言的内置XML解析器都是有一定差别的,也就给漏洞利用带来不便。

c、bllind xxe

如果目标服务器没有回显,就只能用 Blind XXE 了。原理就是带着获取的文件源码以 get 参数或其他形式去访问我们的服务器,然后在日志里就可以找到我们要获取的内容了。

Blink XXE主要使用了DTD约束中的参数实体和内部实体。参数实体是一种只能在DTD中定义和使用的实体,一般引用时使用%作为前缀。而内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。

%remote;

%all;

&send;

xxx.xml

">

这里解释下,%remote; 会把外部文件引入到这个 XML 中,%all; 替换为后面的嵌套实体,这时再在 root 节点中引入 send 实体,便可实现数据转发。如果在 xxx.xml 中 send 实体是参数实体的话,也可以采用下面的形式。

%remote;

%all;

%send;

xxx.xml

">


d、测试

【1.php】

file_put_contents("1.txt", $_GET["file"]) ;

【test.php】

$xml=

%remote;

%all;

%send;

EOF;

$data = simplexml_load_string($xml) ;

echo "

" ;

print_r($data) ;

【evil.xml】

">

访问http://localhost/test.php, 这就是模拟攻击者构造XXE请求,然后存在漏洞的服务器会读出file的内容(c:/1.txt),通过带外通道发送给攻击者服务器上的1.php,1.php做的事情就是把读取的数据保存到本地的1.txt中,完成Blind XXE攻击。

攻击之后1.txt中的数据:


攻击者服务器日志:

e、总结

遇到XML相关的交互过程,以如下步骤判断是否存在漏洞:

(1)检测XML是否会被解析:

&shit;

如果$shit;变成了”this is shit”,那就继续第二步。

(2)检测服务器是否支持外部实体:

%shit;

通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求evil.xml的HTTP request。

(3)如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。

(4)如果不能回显,毫无疑问,使用Blind XXE攻击方法。

基于错误的XXE注入

有时候,当解析过程成功时,当我们从服务器得到通用的响应时,我们可能希望服务器返回详细错误—因此,我们可以使用与远程DTD相同的技术,但会发生故意的错误如:

解析器将尝试解析DTD并访问发送实体中给出的路径,但是由于不能到达“my-evil-domain。$$$$ ”,我们将导致以下错误:

然后我们就可以根据信息调试我们自己的payload!# 安全脉搏 https://www.secpulse.com/archives/58915.html

请注意,由服务器响应的任何错误显示哪一行导致解析错误,同时出现语法错误,有时我们可能会使用此信息来调试我们自己的payload,使用“ n”。

例如:

]> n

包含payload的两个额外的“ n”会在第一行“ n”之后的第2行中出现错误,而其余的XML内容将会显示在第3行。

总之,XXE是一个非常强大的攻击,它允许我们操纵错误的XML解析器并利用它们。请注意,有更多的技术和攻击利用方式可以通过XXE注入完成。如前所述,每个解析器都有不同的能力,因此我们可以提出不同的漏洞。

3


xxe外部引入方式

当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网埠、攻击内网网站等危害。引入外部实体方式有多种,比如:


(1)恶意引入外部实体方式一

XML内容:


(2)恶意引入外部实体方式二

其中attack.dtd的内容为:

XML内容:

DTD文件(evil.dtd)内容:


(3)恶意引入外部实体方式三

XML内容:

DTD文件(evil.dtd)内容:

另外,不同程序支持的协议不一样,

上图是默认支持协议,还可以支持其他,如PHP支持的扩展协议有





2018-08-16 23:31:00

相关文章