XXE漏洞简介:简化了AppSec


嘿!欢迎来到AppSec Simplified的第一期。今天,我们将探索一个引人入胜的漏洞,称为XML外部实体漏洞或XXE! 什么是XXE? 要了解XXE,我们首先需要讨论XML文档中的“ DTD”。 XML文档可以包含文档类型定义或“ DTD”。DTD用于定义XML文档的结构及其包含的数据。它们在文档中使用“ DOCTYPE”标签声明,如下所示:

<?xml version=”1.0" encoding=”UTF-8"?>
<!DOCTYPE ...INSERT DTD HERE...>

在DTD中,您可以声明“ XML实体”。XML实体的工作方式与编程语言中的变量非常相似。 例如,此DTD声明一个XML实体,名称为“ greeting”,其值为“ Hello World!”。在XML文档中,您可以使用引用该实体&greeting,并且XML文档将加载“ Hello World!”。代替它。

<?xml version=”1.0" encoding=”UTF-8"?>
<!DOCTYPE example [
  <!ENTITY greeting "Hello World!" >
]>
<example>&greeting;</example>

XML外部实体

有一种特殊类型的XML实体称为“外部实体”。它们用于通过URL访问本地或远程内容。可以使用“ SYSTEM”关键字声明XML外部实体。例如,此DTD声明了一个名为“ file”的外部实体,该实体指向file:///secrets.txt本地文件系统上。XML解析器将&file使用的内容替换文档中的任何引用file:///secrets.txt

<?xml version=”1.0" encoding=”UTF-8"?>
<!DOCTYPE example [
  <!ENTITY file SYSTEM "file:///secrets.txt" >
]>
<example>&file;</example>

问题是什么?

那么此功能有什么问题呢?想象一下,如果您的应用程序解析了用户提供的XML文档并将结果显示在您的站点上。 如果用户可以在上载中声明任意XML实体,则可以在您计算机上的任何位置声明一个外部实体。例如,此XML文件包含指向file:////etc/shadow您服务器上的外部实体。

<?xml version=”1.0" encoding=”UTF-8"?>
<!DOCTYPE example [
  <!ENTITY file SYSTEM "file:////etc/shadow" >
]>
<example>&file;</example>

/ etc / shadow”文件在Unix系统上存储用户名及其加密的密码。当将已解析的XML文档显示给用户时,file:////etc/shadow还将包含的内容。 通过利用XML解析器,恶意用户现在可以读取服务器上的任意文件。他们也许能够检索用户信息,配置文件或其他敏感信息,例如AWS凭证。攻击者还可以通过递归使XML解析器取消引用实体来发起拒绝服务攻击。这被称为“十亿笑声攻击”。谈论灾难性漏洞! 防止XXE 那么如何防止XXE发生呢?防止XXE的最佳方法是限制XML解析器的功能。 由于XXE攻击需要DTD处理,因此开发人员应在其XML解析器上禁用DTD处理。如果不可能完全禁用DTD,则应禁用外部实体,参数实体和嵌入式DTD。您还可以完全禁用XML实体的扩展。 如何配置XML解析器的行为将取决于您使用的XML解析器。例如,如果您使用默认的PHP XML解析器,则需要将“ libxml_disable_entity_loader”设置为TRUE,以禁止使用外部实体。有关如何为解析器执行此操作的更多信息,请参见OWASP备忘单: https : //github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.md。 最后,您应该例行审核您的应用程序,以捕获可能已经写入您的代码中的XXE。

您如何检测XXE?

您将如何检测应用程序中的XXE?可以采用的一种方法是浏览应用程序的功能,这些功能处理XML文档并使用恶意XML输入对其进行测试。例如,您可以提交此XML文档,并查看文件是否file:///etc/hostname发送回给您。

<?xml version=”1.0" encoding=”UTF-8"?>
<!DOCTYPE example [
  <!ENTITY test SYSTEM "file:///etc/hostname" >
]>
<example>&test;</example>

但是显然,使用黑盒方法是有风险的,因为它不能保证您将在系统中找到所有XXE实例。由于XXE是具有清晰可定义签名的漏洞,因此分析源代码是一种更好的方法。 当XML解析器处理用户提供的XML文件或DTD被用户输入污染的XML文件时,它们容易受到XXE的攻击。同时,解析器需要配置为评估DTD和外部实体。我们实质上是在寻找两件事:

  • 首先,我们正在寻找可以接收用户提供的XML文件或DTD的XML解析器。
  • 然后,我们正在检查XML解析器是否评估DTD或外部实体。

您可以手动审核源代码以查找这些签名,也可以使用静态分析安全测试工具为您盯着代码。大多数静态分析工具都可以检测您的XML解析器是否正在评估DTD和外部实体。但是只有像ShiftLeft的NG-SAST这样可以处理数据流的静态分析工具才能检测到该解析器是否可以通过用户输入到达,从而自动检测这两种情况。

1_Ebc_sjOAtIS2NwhiOSdRTQ.png

最后,应用程序依赖性导致许多XXE,因此,您还应该监视和升级应用程序或基础操作系统使用的所有XML处理器和库。 稍后在AppSec Simplified中,我们将针对一个开源应用程序,并了解如何使用代码分析找到XXE漏洞。敬请关注!


原文链接:http://codingdict.com