XML外部实体注入

933 1
HK.JH 2022-2-13 23:06:17 来自手机 | 显示全部楼层 |阅读模式
1. 什么是XML外部实体注入?
XML外部实体注入(也称为XXE)是一个web安全漏洞,它允许攻击者干扰应用程序对XML数据的处理。它通常允许攻击者查看应用服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。

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

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的支持就足够了。这通常可以通过配置选项或通过编程覆盖默认行为来实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行