许多不同的客户端技术(如Web,移动和云)现在都使用XML向业务应用程序发送消息。为了使应用程序能够使用这些自定义XML消息,应用程序必须解析XML文档并检查格式是否正确。 本文介绍了XML外部实体(XXE)注入攻击及其基础知识,以便更好地了解如何攻击以及如何处理它。 由于我们将讨论XXE注入,首先我们应该了解外部实体的含义及其实现的内容。 外部实体是XML处理器必须解析的数据。它对于在多个文档之间创建共享公共引用很有用。对外部实体所做的任何更改都会在包含对其的引用的文档中自动更新。也就是说,XML使用外部实体自动将信息或“内容”提取到XML文档的主体中。 为此,我们需要在XML文档中声明一个外部实体。我们可以在内部确定其值(内部子集): 或者来自外部来源:(外部子集):
注意SYSTEM标识符?此标识符表示实体将从外部源获取内容,在本例中为“site.com”下的页面。 为了声明这些实体,我们需要在文档类型定义(DTD)中执行此操作。 DTD是一组标记声明,用于定义XML的文档类型。它定义了XML文档的法律结构以及包含合法元素和属性列表的文档结构。 DTD可以在XML文档中声明,也可以作为外部引用声明声明 - 使用SYSTEM标识符指向可解析位置中的另一组声明。 让我们看一下DTD的示例,DTD是DTD中具有SYSTEM标识符的实体:
最后,最重要的 - 参数实体! 此类型的实体使用“%”字符(或十六进制编码中的%)声明,并且仅用于在解析和验证后替换DTD中的文本或其他内容:
XXE攻击概述及其技术 XML外部实体(XXE)攻击是许多基于注入的攻击之一,当攻击者将XML消息中的外部实体发送到应用程序并使用XML解析器对其进行解析时,就会发生这种攻击。 此漏洞具有许多不同的类型和行为,因为它可能发生在不同类型的技术中 - 因为XML解析器的类型不同。在这种情况下,令人欣慰的是每个解析器具有不同的功能和“特征”。 在我们开始之前,让我们了解一下我们可能面临的最常见的XXE漏洞类型 - 了解这些漏洞将有助于我们调试攻击并创建最终正确的POC: 基础的XXE注入 - 将外部实体注入本地DTD。 基于盲注的XXE注入 - XML解析器在响应中不显示任何错误。 基于错误的XXE注入 - 解析成功后,XML解析器始终显示SAME响应。 (即“您的消息已收到”),因此我们可能希望解析器将文件内容“打印”到错误响应中。 根据前面的概述,我们可以使用SYSTEM标识符引用外部实体的数据。所以现在我们可以介绍第一种XXE注入技术,它将外部实体注入到一个XML文档中,该文档包含引用本地文件路径的SYSTEM标识符(例如/etc/passwd):
现在让我们进行更复杂,更严重的攻击: 应用程序服务器是否不作为通用功能的一部分进行响应? (还记得刚才提到的基于错误的XXX吗?) 如果我们想要从具有XML特殊字符的外部源读取数据,该怎么办?如果在解析过程中解析失败了? 此时我们可以加载一个引用我们的远程服务器的辅助外部DTD,并尝试从其URL获取内容 - 这可以是一组字符,或者下面的示例转储文件,最重要的是它甚至没有通过XML模式验证过程。因为它是在解析器甚至获取远程内容之前发送的! 例如,远程DTD文件包含具有SYSTEM标识符和“文件”处理程序的参数实体。请注意,参数实体“file”也连接到实体“send”中的URL:
解析DTD后,我们得到以下实体:
最终,服务器将尝试将参数“c”指定的内容发送到文件内容,发送到我们定义的URL - 我们记录内容并通过转储文件的内容来执行此操作: 步骤A:
步骤B: - 远程DTD正在解析。我们正在窃取文件的内容.. 步骤C:
我们成功获取了文件内容! 用这种技术记住的几件事情: 文件内容中的字符“#”将导致URL被截断。 如果我们使用“或”来定义参数实体,则内容可能会被破坏。 这取决于我们使用哪一个(因此请确保在发生错误时使用两种测试方案)。 【原文链接:https://appsec-labs.com/portal/xxe-attacking-guide/ 本文由 安全脉搏编辑w2n1ck 翻译,转载请注明“转自安全脉搏”,并附上链接。】 基于错误的XXE注入 有时,当解析过程成功时,当我们从服务器获得通用响应时,我们可能希望服务器返回详细错误 - 因此我们可以使用与远程DTD相同的技术,但是有故意的错误,例如:
解析器将尝试解析DTD并访问发送实体中给出的路径,但由于它无法到达“my-evil-domain。$$$$ ”,我们将收到以下错误:
然后我们可以根��信息调试我们自己的有效载荷! #安全脉络 https://www.com/archives/58915.html 请注意,服务器响应的任何错误都表明哪一行导致了解析错误和语法错误,有时我们可能会使用此信息来调试我们自己的有效负载,使用“”。例如: &LT ;! DOCTYPE作者[ \ n &LT ;! ENTITY %% intentate_error_here“test”>]> \ n 包含有效负载的两个额外“ons”将在第一行“\”之后的第二行中出现错误,其余的XML内容将显示在第3行。 简而言之,XXE是一种非常强大的攻击,它允许我们操纵错误的XML解析器并利用它们。请注意,有更多技术和攻击漏洞可以通过XXE注入完成。如前所述,每个解析器都有不同的功能,因此我们可以提出不同的漏洞:
该表由研究员Timothy Morgan提供 - 这些协议可用于上传文件(jar: //.),允许在旧版Java(gopher: //.)中通过TCP连接任意数据,阅读PHP用于查看PHP处理方法的源代码。 尝试自己下载我们的演示实验室,你可以在这里下载!该演示包括一个带有XML有效负载的.NET xml解析器和所需的远程DTD文件。 有关如何防止XXE攻击的更多信息 - 请单击此处 安全脉冲历史XXE文章: 1.在JSON节点上播放Content-Type XXE攻击 2.未知攻击和防御—— XXE漏洞攻击和防御 3.当Opennms XXE漏洞遇到默认密码时(CVE-2015-0975) 4.Oracle Database XXE Injection Vulnerability(CVE-2014-6577)分析 [原文链接:https://appsec-labs.com/portal/xxe-attacking-guide/ 本文由安全脉冲编辑器w2n1ck翻译,请注明“从安全脉冲转移”并附上链接。 】