REST APIs与微服务:关键差异
React XML外部实体指南:示例及预防
本文旨在作为 React 技术栈的 XML 外部实体漏洞指南和示例,以及它可能对您的安全造成的潜在影响。我们将讨论以下主题:
- 什么是 XML 外部实体
- 如何在你的平台上发现它们
- 你可以使用什么缓解技术来对付它们
- 您可以利用哪些工具来提高安全性
需要强调的是,我们将在 React 开发堆栈的背景下探索 XML 外部实体攻击。因此,要充分利用本文,您需要具备 JavaScript 和 React 平台的经验。
什么是 XML 外部实体?
让我们首先解释一下什么是 XML 外部实体。
XML,即可扩展标记语言,是一种用于存储、传输和重建任意数据的标记语言和文件格式。此外,这种语言还用于编程领域,定义以人机可读格式对文档进行编码的规则。
好吧,但是文件结构如何会对您的应用程序构成威胁呢?
默认情况下,XML 处理工具允许在 XML 文件解析期间检索和处理外部实体(URI)的规范。在文件解析过程中,XML 处理代码可以检索这些外部实体而无需验证。攻击者可以通过请求并将内容嵌入 XML 文档中指定的外部实体来绕过您的安全措施。这本质上是一个开放的后门。攻击者可以利用此属性作为检索任何资源的途径。
简而言之,XML 外部实体攻击(或 XXE 注入)是一种利用 XML 解析漏洞的攻击。它针对使用面向用户的 XML 解析功能的系统,并允许攻击者访问服务器上的文件和资源。XXE 注入攻击可能包括使用系统标识符中的文件:方案或相对路径泄露包含敏感数据(例如密码或私人用户数据)的本地文件。
本质上,如果持续的时间足够长,此漏洞可能会使您的服务器变得不安全。
寻找 XML 外部实体
以下示例是包含 item XML 元素的基本 XML 文档。
<item id="1">
<title>Toilet Paper</title>
</item>
很好,但是外部实体在哪里?
您可以使用 DOCTYPE 标头内的系统标识符来表示外部实体。
<!ENTITY xxe SYSTEM "https://www.google.com" >]>
此标头的目的是向 XML 数据结构添加更多属性。为了进一步说明这一点,下面的代码包含一个外部 XML 实体,该实体会尝试破坏潜在的永久文件。
<!ENTITY xxe SYSTEM "file:///gkr/rand" >]>
<item id="1">
<title>&xxe;</title>
</item>
此攻击将导致拒绝服务 (DoS) 攻击并使您的服务器瘫痪。哎呀!
正如我们在其他文章中提到的,这些实体可以访问本地或远程内容,因此您需要保护服务器上的敏感文件。
如果不这样做,您可能会给攻击者提供控制您网站的方法。游戏结束。这绝不是对 XML 外部实体或 XXE 攻击的详尽解释。探索此漏洞的所有复杂性超出了本文的范围。
缓解 React XML 外部实体的简单方法
好了,现在进入实际部分:如何解决这个烂摊子?
值得庆幸的是,大部分工作已经为您完成了。
为了快速复习,并简洁起见,我将简要参考之前关于推荐方法的文章。
一般来说,只要您不是故意尝试为漏洞打开窗口,并且考虑到您需要加载用户提供的 XML 文件的功能,那么您就不必太担心这个问题。
让我们举例说明。
正如我们之前提到的,如果应用程序有一个解析 XML 文件的端点,攻击者就可以向服务器发送特制的有效负载并获取敏感文件。攻击者可以获取的文件在很大程度上取决于您如何设置系统以及如何实施用户权限。
因此,为了防止这种情况发生,首先,不要使用支持实体替换的库。
幸运的是,JavaScript 没有存在此类问题的流行 XML 解析库。
一般来说,只要您保持库更新,您就完成了大部分工作。您的应用程序可能正在实现 react-xml-parser,它已经带有针对此漏洞的保护措施。此外,对于大多数库,外部实体默认处于禁用状态。
React 上受保护实现的一个简单示例如下:
var XMLParser = require('react-xml-parser');
var xml = new XMLParser().parseFromString(xml_text);
console.log(xml);
此外,如果您的平台确实需要使用外部实体,则可以将已知的外部实体列入安全名单,以最大限度地减少漏洞的可能性。
其他策略
以下是可以采取的一些其他策略来减轻 XXE 注入攻击:
- 使用更简单的数据格式(如 JSON)并避免敏感数据序列化。
- 修补或升级应用程序中的所有 XML 处理代码和库。
- 验证 XML 文件上传是否使用 XSD 验证来验证传入的 XML。
- 将 SOAP 更新至 SOAP 1.2 或更高版本。
- 使用 SAST 工具帮助检测源代码中的 XXE。
最后,根据经验法则,除非应用程序需要,否则不要实现 XML 处理。有很多方法可以提供类似的功能,而不会让您的应用程序面临威胁。
最实用的缓解漏洞的方法是首先不要对它们开放。
文章来源:React XML External Entities Guide: Examples and Prevention