Web 应用程序安全性最近引起了很多关注。黑客的素质和技能随着时间的推移而提高。因此,对于应用程序的防御者来说,加强其保护并提高其可见性非常重要。这样做的一部分是为了了解常见的漏洞。每年OWASP都会列出十大 Web 应用程序安全风险。其中最大的风险之一是 XML 外部实体漏洞,即 XXE。因此,在这篇博客中,我将解释什么是 XXE,以及如何保护您的应用程序免受这种风险的影响。但在了解漏洞之前,让我们先了解一下基础知识。
了解 XML 外部实体
什么是 XML?
当您有一个 Web 应用程序时,就会进行数据交换。可用于这种数据交换的语言之一是可扩展标记语言 (XML)。XML 侧重于存储和组织数据,而不是侧重于如何在应用程序上显示数据。
XML 中的数据存储在标签中,通常采用父子结构。看下面的例子:
<message>
<to>Bob</to>
<from>Alive</from>
<text>Hi Bob</text>
</message>
这里,message
标签是父标签,它包含了数据。该message
标记具有to
、和作为其子标记,其中存储了实际值。这就是典型的 XML 标记的外观。 from
text
当您交换固定数据时,这可以正常工作。但是考虑一下您想要交换动态数据的情况。例如,假设您的应用程序必须从他们的系统中获取用户的操作系统详细信息。您必须从用户的远程系统获取此信息。在这种情况下,您可以使用 XML 外部实体。
什么是 XML 外部实体?
XML 有一个称为文档类型定义 (DTD)的功能,其中包含有关 XML 文档结构的信息。这些 DTD 文档中的元素称为实体。实体在DOCTYPE
标头中定义,它们主要用于从远程外部系统获取数据。它们类似于宏定义。
可以在内部定义实体,其中在相同代码中分配值。典型的 XML 实体结构如下所示:
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY bar "World">
]>
<foo>Hello &bar;</foo>
的输出<foo>Hello &bar;</foo>
将是Hello World
因为实体 bar
被定义为字符串“World”
。
在另一种情况下,实体可用于从外部来源获取信息。这是由SYSTEM
关键字完成的。假设您user.txt
在存储用户名的系统中某处命名了一个文件(例如:Bob)。
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY name SYSTEM "file:///home/Desktop/user.txt">
]>
<foo>Hello &name;</foo>
此代码将从user.txt
文件中获取数据并使用该值。所以输出将是Hello Bob
. 尽管此功能在很多情况下都派上用场,但如果不安全处理,它也会引入漏洞。
什么是 XXE 漏洞?
XXE 漏洞存在于使用 XML 进行数据交换的 Web 应用程序中。我们已经看到了一些 XML 结构和数据存储方式的示例。假设 Web 应用程序正在使用 XML 数据;如果是,攻击者可以干扰请求并操纵它。攻击者可以在 XML 中注入恶意代码,类似于SQL 注入或命令注入,以获得想要的结果。
让我们通过一个例子来了解它是如何工作的。假设有一个为您提供电影详细信息的 Web 应用程序。
传输此数据的 XML 代码可能如下所示:
<movie>
<title>Iron Man</title>
<star>Robert Downey Jr.</star>
<release>2008</release>
</movie>
考虑到 XML 用于数据传输而不是显示它,我可以从 XML 代码中获取这些数据并以自定义方式显示它。例如,网页的输出可能如下:
小罗伯特唐尼主演 的钢铁侠于 2008年上映。
这是 Web 应用程序按预期工作的理想情况。但是攻击者有可能拦截并修改请求。
XXE注射
让我们考虑一个电影应用程序的相同示例。攻击者可以捕获发送到服务器的数据并在其中注入恶意代码。并且使用 XML 外部实体,他们还可以获得敏感信息。
假设一名黑客在信息收集阶段了解到 Web 服务器正在 Linux 操作系统上运行。通过使用监控工具,他们了解到 Web 应用程序使用 XML 来交换数据。
我们知道 Linux 将用户密码哈希存储在/etc/shadow
文件中。因此,黑客可以使用 XML 外部实体功能修改请求并获取该文件的详细信息。恶意请求看起来像这样:
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY inject SYSTEM "file:///etc/shadow" >]>
<movie>
<title>Iron Man</title>
<star>Robert Downey Jr.</star>
<release>&inject;</release>
</movie>
当这个请求被发送到服务器时,它会像往常一样获取电影和明星的详细信息。但它会获取文件的内容,而不是发布年份/etc/shadow
。
输出看起来像这样:
Iron Man starring Robert Downey Jr. was released in
root:$6$i9PZlNKY1JSE8dkG$1eCFIsAtnxzHfhZ/tw3FUBr/2NMZOlM.8HmSA4KYy9SfBBBTEUj2JS79tvudskedc7bUp9EMktTGXsblpALbl.:18225:0:99999:7:::
daemon:*:18225:0:99999:7:::
bin:*:18225:0:99999:7:::
sys:*:18225:0:99999:7:::
sync:*:18225:0:99999:7:::
games:*:18225:0:99999:7:::
man:*:18225:0:99999:7:::
lp:*:18225:0:99999:7:::
mail:*:18225:0:99999:7:::
news:*:18225:0:99999:7:::
uucp:*:18225:0:99999:7:::
proxy:*:18225:0:99999:7:::
www-data:*:18225:0:99999:7:::
backup:*:18225:0:99999:7:::.
现在这是一个非常微妙的信息。如果黑客得到它,他们可以破解密码并接管帐户。
XXE 漏洞的影响
XXE 漏洞非常危险,因为它们使黑客可以访问后端系统。黑客可以通过利用此漏洞做什么取决于用例和配置。让我们看几个场景。
越权存取
黑客可以使用 XXE 注入来访问可能包含敏感信息的系统文件,例如密码、应用程序详细信息、安全配置等。一旦黑客访问服务器,他们还可以更改配置。例如,他们可以禁用服务器上的防火墙,这将有助于他们发起其他攻击。
恶意文件上传
如果服务器允许文件上传功能,黑客可以在服务器上上传恶意文件。然后,此文件可用作后门或键盘记录器,允许黑客对 Web 应用程序造成更多破坏。
拒绝服务 (DoS) 攻击
黑客可以通过扩展 XML 外部实体功能向服务器请求大带宽,从而引发 DoS 攻击。
!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
...
...
...
<!ENTITY lol1000 "&lol999;&lol999;&lol999;&lol999;&lol999;&lol999;&lol999;&lol999;&lol999;&lol999;">
]>
<lolz>&lol1000;</lolz>
这样的请求会占用解析器的大量带宽来扩展 &lol1000
,因为扩展一直从lol999
到lol1
。这种 DoS 攻击也称为亿笑攻击。
现在您已经了解了典型 XXE 漏洞的所有方面,让我们看看如何防止它们。
防止 XXE 漏洞
作为负责 Web 应用程序安全的人,您必须采取措施防止漏洞。创建一个万无一失的防御是针对每个用例的。但这里有一些一般的方法:
- XXE 注入的主要入口点是 DTD。防止 XXE 漏洞的最简单方法是禁用应用程序的 DTD。
- 禁用 DTD 可能并不适用于所有场景。如果这是您的情况并且您不想这样做,则可以使用输入验证来防止恶意注入。
- 您可以配置不需要的 XML 及其解析器的默认功能,例如
XInclude
. - 禁用外部实体的解析。
您可以在此处找到详尽的预防方法列表。
把它包起来
如果您有一个使用 XML 的 Web 应用程序,那么保护它对您来说很重要。考虑到 XXE 漏洞可能对您的服务器造成的损害,您不能冒险。上面的预防备忘单肯定会帮助您设置基本的围栏。