了解XML外部实体的攻击
在过去的四年里,安全研究人员报告了安全漏洞的巨大增长。每天大约有2-3万个网站被黑。网站被黑的方式有几种,XML外部实体攻击(XXE)就是其中之一。
根据2017年的OWASP十大报告,他们将XXE攻击排在第四位。今年(2021年),XXE已经被合并到安全错误配置中,被放在第五位。
OWASP Top 10是一份由开放网络应用安全项目维护的报告。它包含一个高等级的网络应用程序安全问题列表。
在这篇文章中,我们将深入研究XXE攻击。我们将重点讨论什么是XML,什么是XML外部实体,这种攻击的影响,以及如何缓解它。
免责声明:- 本文仅用于教育目的。
前提条件
使用[Burpsuite]、[OWASP zap]或任何其他工具拦截流量的基本知识。
什么是XML?
XML(可扩展标记语言)是一种标记语言,就像HTML一样,是人类和机器可以阅读的。万维网联盟(W3C)开发了XML。与HTML不同,用户可以定义他们的标签。这种语言最常见的用途是传输和存储数据。除此以外,XML还可以卸载和重新加载数据库,与样式表合并以创建所需的输出,以及其他用途。
这里有一个XML代码的例子。
<?xml version="1.0" encoding="UTF-8"?>
<Greeting>
<From>Felix</From>
<To>Section readers</To>
<message>How are you today? </message>
</Greeting>
让我们浏览一下这段代码,了解其语法。
第1行
<?xml version="1.0" encoding="UTF-8"?>
这一行声明了所使用的XML的版本,它也说明了要使用的编码。UTF-8,是CSS、JavaScript、PHP等语言的默认编码。我们通常把这一行称为prolog,在XML代码中不是强制性的。如果你决定包括序言,它应该是文件的第一行。
第2行
<Greeting>
<!--Supporting content-->
</Greeting>
<Greeting> 作为这段代码的父/根元素。每个XML文档都必须有一个根元素。XML标签是区分大小写的,每个标签必须有一个类似的结束标签。本文档中的所有其他标签将被锚定在这个标签上。
第3行
<From>Felix</From>
<To>Section readers</To>
<message>How are you today?</message>
<!--this is a comment-->
这一部分包含这个XML文档的子节点。这是我们输入我们希望在文档中的其他内容的地方。
XML,像其他语言一样,有注释。为了在XML中写注释,我们使用<!--comment--> ,类似于我们在HTML中写注释的方式。
XML实体
在其他编程语言中,当我们想临时存储数据时,我们使用变量。在XML中,我们使用实体来保存我们的数据。每当我们需要这些数据时,我们通过在实体名称后面加上& 来调用实体,这样我们就有了类似于这样的东西:&Entityname 。实体也可以访问不存储在本地的数据,在这种情况下我们称之为外部实体。
文档类型定义(DTD)
DTD包含了对XML文档的结构和合法属性及元素的定义。DTD既可以在文档中,也可以从外部来源加载。当从外部源加载时,我们使用关键字SYSTEM 。外部源可以是一个URL,也可以是一个文件。
一个既有DTD又有实体的XML文档样本将看起来像这样。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mail [ <!ENTITY sender “felix”> ]>
<Greeting>
<From>&sender;</From>
<To>Section reader</To>
<Message>Hello, How are you today?</Message>
</Greeting>
当上述代码被解析时,我们会得到这样的结果。
From: Felix
To: Section reader
Message: Hello, How are you today?
现在我们已经了解了一个基本的XML文档的样子,让我们来学习一下攻击的工作原理。
XXE攻击是如何工作的
当外部实体被一个弱的XML解析器支持和解析时,XXE攻击就产生了。攻击者在传输过程中拦截XML数据并添加恶意代码。在处理时,应用程序可能会披露私人信息。大多数情况下,这些攻击使攻击者能够查看文件系统,有时,他们可以与应用程序可以访问的任何后端服务互动。
有几种类型的XXE攻击,如。
- 带内XXE:在这种类型中,攻击者可以收到他们上传的XXE有效载荷的即时响应。
- 带外XXE(盲XXE)。攻击者没有得到他们的有效载荷的即时响应。为了得到响应,他们将输出反映到另一个文件或他们的服务器上。
Portswigger有几个实验室,可以帮助你练习。对于这篇文章,我将使用一个实验室来展示XXE攻击如何检索文件。
使用Burpsuite,我们拦截数据并将其发送到中继器。

由于当前的数据没有任何实体,我们将引入我们自己的实体并添加恶意代码。使用我们引入的实体,我们将尝试检查我们是否能检索到密码文件。

如果我们成功了,我们应该能够看到该文件,如下图所示。
除了检索文件之外,我们还可以使用XXE攻击来进行。
1.拒绝服务(DoS)
最常见的是亿笑攻击。
2.服务器端请求伪造攻击
利用外部实体,攻击者可以向URL发出HTTP请求,然后服务器就可以访问它们,包括那些本应只在组织内部使用的实体。
攻击者会将实体的内容替换成他们所针对的URL。当目标URL被解析时,上述域名的内容就会暴露出来。
下面是这种攻击的一个有效载荷样本。
<!DOCTYPE ssrf [ <!ENTITY xxe SYSTEM "http://target.exploited-website.url/"> ]>
XXE的影响
- 未经授权访问系统文件,即密码文件,被暴露的系统。
- 拒绝服务,可能造成经济损失,特别是在高流量的商业网站。
- 远程代码执行。
测试XXE攻击
我们可以使用Burpsuite[网络漏洞扫描器]等工具对XXE进行可靠测试。我们还可以使用[OWASP Zap]来进行类似的测试。
如何防止XXE攻击
- 如果使用XML,在你的网站上禁用外部实体。
- 对开发人员进行安全编码实践的培训。
- 使用自动测试安全工具来搜索XXE漏洞。
- 对服务器端输入进行白名单,以防止文件、头文件或节点内的敌对数据。
- 利用网络应用程序防火墙。
- 加密数据并验证所有内部连接,以防止SSRF攻击。
总结
XXE攻击是对网络应用的巨大威胁。如果不被发现或预防,它们会导致巨大的经济和数据损失。XXE攻击的主要原因是我们的XML文档中存在的外部实体。
我们已经看了什么?
- 什么是XML?
- XXE攻击是如何发生的。
- XXE攻击的影响。
- 如何防止XXE攻击。
让我们保持我们的网络应用安全。学习愉快!