XXE:XML外部实体

图片
在本文中,我们将解释外部XML实体的注入是什么,描述一些常见的示例,解释如何查找和使用不同类型的XXE注入,并概括介绍如何在其帮助下防止攻击。

什么是外部XML实体的注入?


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

在某些情况下,攻击者可能通过利用XXE漏洞来执行服务器端请求伪造攻击(SSRF),从而利用XXE攻击来破坏核心服务器或其他内部基础结构。

XXE漏洞如何产生?


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

XML外部实体是一种自定义XML实体,其特定值是从写入它们的DTD文件中加载的。 从安全角度来看,外部实体特别有趣,因为外部实体使您可以基于文件路径或URL的内容定义实体。

存在哪些类型的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,     XXE    /etc/passwd,    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漏洞的情况下,提交的XML中通常会有大量的数据值,其中任何一个都可以在应用程序响应中使用。 通常,对于XXE漏洞的系统测试,有必要使用特定实体单独检查XML中的每个数据节点,并查看响应的状态。

除了提取敏感数据之外,使用XXE攻击的另一种方法是使用它们来伪造服务器端请求(SSRF)。

这是一个潜在的严重漏洞;在其帮助下,服务器应用程序可以用于对服务器可以访问的任何URL执行HTTP请求。

要使用XXE漏洞执行SSRF攻击,必须使用要访问的URL定义外部XML实体,并使用具有数据值的特定实体。 如果可以将特定的实体与应用程序响应中返回的数据的值一起使用,则可以从应用程序响应中的URL查看响应,从而与服务器系统进行双向交互。 否则,您只能执行盲目SSRF攻击(这也可能会导致严重后果)。

在以下使用XXE的示例中,外部实体强制服务器对系统基础结构内的内部系统执行内部HTTP请求:

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

使用XXE进行SSRF攻击:


许多类型的XXE漏洞是盲目的。 这意味着应用程序不会在其响应中返回任何特定外部实体的值,因此无法在服务器端直接搜索文件。

XXE盲目漏洞仍然可以检测和利用,但是需要更高级的方法。 有时,您可以使用外部方法来搜索漏洞,并使用它们来窃取数据。 有时还会导致XML解析错误,从而导致错误消息中泄露敏感数据。

盲目漏洞XXE的搜索和使用:


在许多情况下,使用XXE注入进行攻击的能力很明显,因为应用程序的常规HTTP流量包括包含XML数据的请求。 在其他情况下,攻击能力不太明显。 但是,如果您查找正确的位置,您将发现在不包含XML的查询中遭受XXE攻击的机会。

XInclude攻击


某些应用程序接收客户端发送的数据,将其在服务器端插入XML文档中,然后进行解析。 例如,将客户端数据放入SOAP后端请求中,然后由SOAP后端服务对其进行处理。

在这种情况下,您将无法运行经典的XXE攻击,因为您无法控制整个XML文档,因此无法确定或修改DOCTYPE元素。 但是,您可以改用XInclude。 XInclude是XML规范的一部分,该规范允许您从嵌套文档创建XML文档。 您可以对XML文档中的任何数据值施加XInclude攻击,因此可以在仅管理放置在服务器端XML文档中的一个数据项的情况下执行攻击。

要执行XInclude攻击,必须引用XInclude名称空间并指定要包含的文件的路径。 例如:

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

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

例如,应用程序可以允许用户在下载后上传图像并在服务器上处理或验证它们。 即使应用程序希望接收PNG或JPEG格式,使用的图像处理库也可能支持SVG图像。 由于SVG格式使用XML,因此攻击者可以发送恶意SVG图像,从而能够攻击XXE漏洞。

通过上传图像文件来使用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漏洞


使用Burp Suite Web漏洞扫描程序可以快速可靠地找到绝大多数XXE漏洞。

  • 手动测试XXE漏洞通常包括:
  • 通过基于已知的操作系统文件定义外部实体并在应用程序响应中返回的数据中使用此对象来测试文件提取。
  • 通过根据要管理的系统的URL定义外部实体并监视与该系统的交互,来测试XXE盲目漏洞。 Burp Collaborator客户非常适合此目的。
  • 使用XInclude攻击来尝试获取XML文件中的非XML用户数据的漏洞,以尝试获取已知的操作系统文件。

如何预防XXE漏洞


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

通常,禁用外部实体的解析并禁用XInclude支持就足够了。 通常可以使用配置选项或以编程方式覆盖默认行为来完成此操作。 有关禁用不必要功能的更多信息,请参见XML或API解析库文档。



您可以使用专门的实验室作为测试利用这些漏洞的技能的训练场。



DEDIC.SH上提供了带有2019 Intel可扩展处理器的专用服务器的最新双处理器配置:
  • 2个Xeon Silver 4214-总共24个内核
  • 2x Xeon Gold 5218-总共32核
  • 2个Xeon Gold 6240-配置36核。

具有两个至强银4214的服务器的成本- 从15210卢布/月
我们也准备为您收集任何配置 - 写信给我们

如果不需要大功率的专用服务器-您需要150卢布/月的VDS

Source: https://habr.com/ru/post/zh-CN454614/


All Articles