最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

WEB漏洞挖掘:XML外部实体注入

XAMPP新闻 admin 373浏览 0评论

在本节中,我们将解释什么是XML外部实体注入,描述一些常见的示例,解释如何发现和利用各种XXE注入,并总结如何防止XXE注入攻击。

1. 什么是XML外部实体注入?

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

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

zzzzzt000020

2. XXE漏洞是如何产生的?

有些应用程序使用XML格式在浏览器和服务器之间传输数据。这样做的应用程序实际上总是使用标准库或平台API来处理服务器上的XML数据。出现XXE漏洞是因为XML规范包含各种潜在危险的特性,而标准解析器支持这些特性,即使应用程序通常不使用这些特性。

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

3. XXE攻击有哪些类型?

有各种类型的XXE攻击:

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

4. 利用XXE检索文件

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

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

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

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

应用程序对XXE攻击没有执行特别的防御,因此你可以通过提交以下XXE有效负载来利用XXE漏洞检索/etc/passwd文件:

<?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中的每个数据节点,方法是使用已定义的实体并查看它是否出现在响应中。

5. 利用XXE进行SSRF攻击

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

要利用XXE漏洞执行SSRF攻击,需要使用想要攻击的URL来定义一个外部XML实体,并在数据值中使用定义的实体。如果你可以在应用程序响应中返回的数据值中使用定义的实体,那么你将能够从应用程序响应中的URL中查看响应,从而获得与后端系统的双向交互。如果没有,那么你将只能执行blind SSRF攻击(这仍然会产生严重的后果)。

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

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

6. Blind XXE漏洞

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

仍然可以检测和利用blind XXE漏洞,但需要更先进的技术。有时你可以使用带外技术来发现漏洞并利用它们来窃取数据。有时还会触发XML解析错误,导致在错误消息中泄露敏感数据。

7. 寻找XXE注入的隐藏攻击面

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

7.1 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>

7.2 通过文件上传执行XXE攻击

有些应用程序允许用户上传文件,然后在服务器端处理这些文件。一些常见的文件格式使用XML或包含XML子组件。基于xml的格式的例子有DOCX这样的办公文档格式和SVG这样的图像格式。

例如,应用程序可能允许用户上传图片,并在上传后在服务器上处理或验证这些图片。即使应用程序希望接收PNG或JPEG这样的格式,所使用的图像处理库也可能支持SVG图像。由于SVG格式使用XML,攻击者可以提交恶意SVG图片,从而达到针对XXE漏洞的隐藏攻击面。

7.3 通过修改内容类型执行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攻击面。

8. 如何发现和测试XXE漏洞

对XXE漏洞的手动测试通常包括:

  • 定义一个众所周知的操作系统文件为外部实体,并在应用程序响应返回的数据中使用该实体,来测试文件检索。
  • 通过基于你所控制的系统的URL定义一个外部实体,并监视与该系统的交互,来测试blind XXE漏洞。可以使用Burp Collaborator client。
  • 通过使用XInclude攻击尝试检索一个众所周知的操作系统文件,测试服务器端XML文档中是否包含用户提供的非XML数据。

9. 如何防止XXE漏洞

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

通常,只要禁用外部实体的解析和禁用对XInclude的支持就足够了。这通常可以通过配置选项或通过编程覆盖默认行为来实现。有关如何禁用不必要的功能的详细信息,请参阅XML解析库或API文档。

来源:WEB漏洞挖掘

转载请注明:XAMPP中文组官网 » WEB漏洞挖掘:XML外部实体注入

您必须 登录 才能发表评论!