XXE(XML 外部实体注入)是一种常见的基于 Web 的安全漏洞,它使攻击者能够干扰 Web 应用程序中 XML 数据的处理。
虽然 XML 是开发人员用来在 Web 浏览器和服务器之间传输数据的一种非常流行的格式,但这导致 XXE 成为一个常见的安全漏洞。
XML 需要一个解析器,这通常是漏洞发生的地方。XXE 允许根据文件路径或 URL 的内容来定义实体。当服务器读取 XML 攻击载荷时,会解析外部实体,合并到最终文档中,并将其与内部敏感数据一起返回给用户。
XXE 攻击可能导致内部网络内的端口扫描、服务器端请求伪造 (SSRF)、数据泄露、使用组织的服务器执行拒绝服务 (DoS) 等。因此,实施XXE 预防策略很重要。
这是有关应用程序安全性的一系列广泛指南的一部分
在本文中:
考虑一个接受 XML 输入并输出结果的 Web 应用程序。请求如下所示:
要求 | POST http://example.com/xml HTTP/1.1 |
回复 | HTTP/1.0 200 OK |
XML 文档可以有一个特定的类型,可以使用两种标准来定义——XSD 和 DTD。使用 DTD 定义的 XML 文档容易受到 XXE 攻击。
请参阅以下示例,该示例使用名为 mytype 的 DTD。此 DTD 定义了一个名为 name 的 XML 实体。在 HTML 输出中调用此元素时,XML 解析器读取 DTD 并将其替换为一个值。
要求 | POST http://example.com/xml HTTP/1.1 |
回复 | HTTP/1.0 200 OK |
现在让我们看看攻击者如何进行所谓的“十亿笑攻击”。如果 XML 解析器不限制它可以使用的内存量,那么这种攻击会使用递归技术来使其内存过载。
要求 | POST http://example.com/xml HTTP/1.1 |
回复 | Response |
本质上,这是一种拒绝服务 (DoS) 攻击,可以拒绝对依赖于 XML 解析器的应用程序的访问。
现在让我们看看如何使用类似的攻击来执行服务器端请求伪造(SSRF)。
在这里,攻击者使用来自外部来源的 XML 实体。当这种情况发生时,XXE 成为服务器端请求伪造 (SSRF) 攻击。
攻击者可以使用 XML 系统标识符运行系统命令。大多数 XML 解析器默认处理外部实体,因此,服务器在恶意 XML 元素中运行系统代码。
以下代码显示了如何使用 XXE 返回敏感文件的内容 - etc/hosts 文件。
要求 | POST http://example.com/xml HTTP/1.1 |
回复 | HTTP/1.0 200 OK |
这种攻击可以扩展到访问服务器上的其他文件,而不是系统文件。一些 XML 解析器可以检索目录列表并使用它们来查找机器上的其他敏感数据。
XXE SSRF 攻击的局限性
XXE 攻击仅限于获取包含纯文本或有效 XML 的文件。它们不能用于获取二进制文件,或包含类似于 XML 但实际上不是有效 XML 的代码的文件。这将返回解析器错误,攻击者将无法查看其内容。
相关内容:阅读我们的服务器端请求伪造指南
盲目的 XXE 漏洞意味着应用程序确实以不安全的方式处理外部 XML 实体,但不会在其响应中返回这些实体。这意味着攻击者将需要使用先进的技术来检测漏洞并加以利用。
攻击者仍然可以使用盲 XXE 窃取数据,例如通过使服务器连接到攻击者控制的 URL。
虽然是一个常见的漏洞,但通过良好的编码实践和一些特定于语言的建议,可以轻松实现防止 XXE 攻击。
由于对解析器的依赖,Java 本质上使程序员防御 XXE 的任务变得不那么明确。Java XML 解析器通常容易受到 XXE 攻击,从而导致对保护应用程序的控制较少。
值得庆幸的是,这些解析器的创建者对这个问题很明智,积极确保它们相应地更新以更安全,但您仍然依赖这些第三方。一些最常见的 Java XML 解析器包括:
当依赖第三方解析器时,您应该禁用 DOCTYPES,它会自动保护您免受 XXE 攻击。
PHP 拥有可能是最流行的后端 Web 应用程序语言的称号,因此,它是攻击者的主要目标,包括 XXE 攻击。由于攻击者经常发现新的漏洞,因此必须保持您的 PHP 版本是最新的以保护您的应用程序。
关于 XXE 预防,您可以做一些事情来确保您是受害者。自 PHP 版本 8.0.0 起,强烈建议您使用 libxml_disable_entity_loader。可以在此处找到有关在代码中完全理解和实现此功能的更多信息。
无论是新程序员还是经验丰富的老手,Python 的受欢迎程度每天都在增长。然而,随着快速增长和扩张,风险也随之而来。
保护您的 Python 应用程序的第一步是确保您使用的 XML 解析器是安全的。一些,如Etree、Minidom、Xmlrpc和 Genshi 是在构建时考虑到安全性的,可以抵抗 XXE 漏洞。然而,其他流行的模块,如 Pulldom 和 Lxlm 本身并不是安全的,建议采取预防措施。
以下是一些可以帮助您预防 XXE 的一般准则:
在我们的XXE 预防详细指南中了解更多信息
以下是 XXE 漏洞的一些真实示例: