PortSwigger-XXE

什么是 XML 外部实体注入?

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

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

XXE漏洞是如何产生的?

一些应用程序使用 XML 格式在浏览器和服务器之间传输数据。执行此操作的应用程序实际上总是使用标准库或平台 API 来处理服务器上的 XML 数据。XXE 漏洞的出现是因为 XML 规范包含各种潜在危险的特性,而标准解析器支持这些特性,即使它们通常不被应用程序使用。
XML 外部实体是一种自定义 XML 实体,其定义的值是从声明它们的 DTD 外部加载的。从安全角度来看,外部实体特别有趣,因为它们允许根据文件路径或 URL 的内容定义实体。

XML实体

什么是XML?

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

什么是 XML 实体?

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

什么是文档类型定义?

XML 文档类型定义 (DTD) 包含可以定义 XML 文档的结构、它可以包含的数据值的类型以及其他项目的声明。DTD 在DOCTYPEXML 文档开头的可选元素中声明。DTD 可以完全独立于文档本身(称为“内部 DTD”),也可以从其他地方加载(称为“外部 DTD”),或者可以是两者的混合。

什么是 XML 自定义实体?

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

<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>
此定义意味着 XML 文档中对实体引用的任何使用都&myentity;将替换为定义的值:“ my entity value”。

什么是 XML 外部实体?

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

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

<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com" > ]>
URL 可以使用该file://协议,因此可以从文件加载外部实体。例如:

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

利用XXE执行SSRF攻击

1进入网站在检查商店商店时,网站提交了POST请求,打开之后看到有XML
1
不妨构造XXE。

2
3
跟着他说的依次访问,直到找到ACCESSkeyid
5

Xinclude技术

XInclude 是一种支持将多个 XML 文档中的内容包含在单个 XML 文档中的技术。它是 XML 技术家族的一部分,旨在简化大型 XML 文档的创建和管理。

使用 XInclude,您可以创建一个“主”XML 文档,该文档将其他 XML 文档作为“子文档”引用。这些子文档可以按值或引用包含在内,生成的主控文档可以用作独立的 XML 文档。

XInclude 使用 XML 命名空间,其定义如下:


xmlns:xi="http://www.w3.org/2001/XInclude"

XInclude 支持两种类型的包含:按引用包含和按值包含。当您希望将外部文档作为 URI 包含时,将使用按引用包含,而当您希望包含外部文档的实际内容时,则使用按值包含。

下面是一个包含外部文档的 XInclude 语句示例,该语句使用按引用包含:


<xi:include href="external.xml" parse="xml" />

下面是一个包含外部文档的 XInclude 语句示例,该语句使用 include-by-value:


<xi:include href="external.xml" parse="text" />

XInclude 可以与任何 XML 文档一起使用,并且它受到 XML 解析器和编辑器的广泛支持。它能够简化大型 XML 文档的创建和管理,使其成为开发人员和内容创建者的宝贵工具。

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

在这种情况下,您无法执行经典的 XXE 攻击,因为您无法控制整个 XML 文档,因此无法定义或修改元素DOCTYPE。但是,您也许可以改用XIncludeXInclude是 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 的格式的示例是办公文档格式(如 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>

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信