XML 外部实体 (XXE) 漏洞及其修复方法

什么是 XXE 攻击?

XXE(XML 外部实体注入)是一种常见的基于 Web 的安全漏洞,它使攻击者能够干扰 Web 应用程序中 XML 数据的处理。  

虽然 XML 是开发人员用来在 Web 浏览器和服务器之间传输数据的一种非常流行的格式,但这导致 XXE 成为一个常见的安全漏洞。

XML 需要一个解析器,这通常是漏洞发生的地方。XXE 允许根据文件路径或 URL 的内容来定义实体。当服务器读取 XML 攻击载荷时,会解析外部实体,合并到最终文档中,并将其与内部敏感数据一起返回给用户。 

XXE 攻击可能导致内部网络内的端口扫描、服务器端请求伪造 (SSRF)、数据泄露、使用组织的服务器执行拒绝服务 (DoS) 等。因此,实施XXE 预防策略很重要。

这是有关应用程序安全性的一系列广泛指南的一部分

在本文中:

XXE 攻击类型(附代码示例)

十亿笑攻击

考虑一个接受 XML 输入并输出结果的 Web 应用程序。请求如下所示:

要求POST http://example.com/xml HTTP/1.1
<mytype>
Hello and welcome to my website!
</mytype>
回复HTTP/1.0 200 OK

Hello and welcome to my website!

XML 文档可以有一个特定的类型,可以使用两种标准来定义——XSD 和 DTD。使用 DTD 定义的 XML 文档容易受到 XXE 攻击。 

请参阅以下示例,该示例使用名为 mytype 的 DTD。此 DTD 定义了一个名为 name 的 XML 实体。在 HTML 输出中调用此元素时,XML 解析器读取 DTD 并将其替换为一个值。

要求POST http://example.com/xml HTTP/1.1

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE mytype [  
<!ELEMENT mytype ANY>  
<!ENTITY name "John">
]>
<mytype>  
Hello &name; and welcome to my website!
</mytype>
回复HTTP/1.0 200 OK 

Hello John and welcome to my website!

现在让我们看看攻击者如何进行所谓的“十亿笑攻击”。如果 XML 解析器不限制它可以使用的内存量,那么这种攻击会使用递归技术来使其内存过载。 

要求POST http://example.com/xml HTTP/1.1

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE mytype [  
<!ELEMENT mytype ANY>  
<!ENTITY name "John ">  
<!ENTITY name2 "&name;&name;">  
<!ENTITY name3 "&name2;&name2;&name2;&name2;">  
<!ENTITY name4 "&name3;&name3;&name3;&name3;">]>
<foo>  
Hello &t3;
</foo>
回复Response
HTTP/1.0 200 OK 

Hello John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John John

本质上,这是一种拒绝服务 (DoS) 攻击,可以拒绝对依赖于 XML 解析器的应用程序的访问。

XXE SSRF 攻击

现在让我们看看如何使用类似的攻击来执行服务器端请求伪造(SSRF)。 

在这里,攻击者使用来自外部来源的 XML 实体。当这种情况发生时,XXE 成为服务器端请求伪造 (SSRF) 攻击。

攻击者可以使用 XML 系统标识符运行系统命令。大多数 XML 解析器默认处理外部实体,因此,服务器在恶意 XML 元素中运行系统代码。 

以下代码显示了如何使用 XXE 返回敏感文件的内容 - etc/hosts 文件。

要求POST http://example.com/xml HTTP/1.1

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE mytype [  
<!ELEMENT mytype ANY>  
<!ENTITY malicious SYSTEM  
"file:///etc/hosts">
]>
<foo> 
&xxe;
</foo>
回复HTTP/1.0 200 OK 

IPAddress     Hostname    Alias
127.0.0.1   localhost web.mydomain.com
208.164.186.1 web.mydomain.com    web 
208.164.186.2 mail.openna.com mail
(...)

这种攻击可以扩展到访问服务器上的其他文件,而不是系统文件。一些 XML 解析器可以检索目录列表并使用它们来查找机器上的其他敏感数据。

XXE SSRF 攻击的局限性

XXE 攻击仅限于获取包含纯文本或有效 XML 的文件。它们不能用于获取二进制文件,或包含类似于 XML 但实际上不是有效 XML 的代码的文件。这将返回解析器错误,攻击者将无法查看其内容。 

相关内容:阅读我们的服务器端请求伪造指南

盲目的 XXE 漏洞

盲目的 XXE 漏洞意味着应用程序确实以不安全的方式处理外部 XML 实体,但不会在其响应中返回这些实体。这意味着攻击者将需要使用先进的技术来检测漏洞并加以利用。 

攻击者仍然可以使用盲 XXE 窃取数据,例如通过使服务器连接到攻击者控制的 URL。 

如何防止 XXE 漏洞

虽然是一个常见的漏洞,但通过良好的编码实践和一些特定于语言的建议,可以轻松实现防止 XXE 攻击。

Java中的XXE漏洞

由于对解析器的依赖,Java 本质上使程序员防御 XXE 的任务变得不那么明确。Java XML 解析器通常容易受到 XXE 攻击,从而导致对保护应用程序的控制较少。

值得庆幸的是,这些解析器的创建者对这个问题很明智,积极确保它们相应地更新以更安全,但您仍然依赖这些第三方。一些最常见的 Java XML 解析器包括: 

  • DOM 解析器
  • SAX 解析器
  • JDOM 解析器
  • DOM4J 解析器
  • StAX 解析器

当依赖第三方解析器时,您应该禁用 DOCTYPES,它会自动保护您免受 XXE 攻击。 

PHP 中的 XXE 漏洞

PHP 拥有可能是最流行的后端 Web 应用程序语言的称号,因此,它是攻击者的主要目标,包括 XXE 攻击。由于攻击者经常发现新的漏洞,因此必须保持您的 PHP 版本是最新的以保护您的应用程序。 

关于 XXE 预防,您可以做一些事情来确保您是受害者。自 PHP 版本 8.0.0 起,强烈建议您使用 libxml_disable_entity_loader。可以在此处找到有关在代码中完全理解和实现此功能的更多信息。 

Python中的XXE漏洞

无论是新程序员还是经验丰富的老手,Python 的受欢迎程度每天都在增长。然而,随着快速增长和扩张,风险也随之而来。

保护您的 Python 应用程序的第一步是确保您使用的 XML 解析器是安全的。一些,如EtreeMinidomXmlrpc和 Genshi 是在构建时考虑到安全性的,可以抵抗 XXE 漏洞。然而,其他流行的模块,如 Pulldom 和 Lxlm 本身并不是安全的,建议采取预防措施。

其他预防技巧

以下是一些可以帮助您预防 XXE 的一般准则:

  • 手动禁用 DTD - 在应用程序中配置 XML 解析器以禁用自定义文档类型定义 (DTD)。大多数应用程序不使用 DTD,因此这不会损害任何功能,但可以防止 XXE 攻击。
  • 检测您的应用程序服务器——在代码的特定部分插入检查点以监控运行时执行,并检测和阻止与 XML 处理相关的类。这可以处理您在应用程序代码中遗漏的 XML 解析器,并且可以防止导致远程代码执行的最严重的 XXE 漏洞利用。
  • 使用安全工具——Web 应用程序防火墙 (WAF) 具有可以阻止明显 XXE 输入的内置规则。动态应用程序安全测试 (DAST) 工具可以在开发过程的早期扫描 XXE 漏洞并建议如何修复它们。
  • 针对 XXE 强化配置——常规的应用程序强化最佳实践也将对 XXE 有效。限制权限、验证所有输入以确保它们不会到达 XML 解析逻辑、处理错误、使用身份验证和加密、限制出站流量以及限制 DNS 通信。

在我们的XXE 预防详细指南中了解更多信息

XXE 漏洞的真实例子

以下是 XXE 漏洞的一些真实示例:

  • Android 开发工具——一些最流行的 Android 开发工具包括 Android Studio、Eclipse 和 APKTool。它们都以允许攻击者通过外部实体获取访问权限的方式解析 XML,从而在这些应用程序中创建了巨大的漏洞利用。显然,这在后来的版本中得到了修补,但它很好地提醒人们,在开发安全性方面永远不能自满,即使依赖行业领先的第三方工具也是如此。
  • WordPress – XXE 漏洞也发生在 WordPress 中。考虑到大约 40% 的网站使用该 CMS 提供商,这一点尤其令人担忧。 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值