了解XML外部实体的攻击

454 阅读6分钟

了解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,我们拦截数据并将其发送到中继器。

intercept

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

payload

如果我们成功了,我们应该能够看到该文件,如下图所示。passwords

除了检索文件之外,我们还可以使用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攻击。

让我们保持我们的网络应用安全。学习愉快!