在本节中,将解释什么是XML外部实体注入,解释如何发现和利用各种XXE注入,并总结如何防止XXE注入攻击。
什么是XML?
XML代表“可扩展标记语言”,XML是一种设计用于存储和传输数据的语言。与HTML一样,XML使用标签和数据的树状结构。与HTML不同的是,XML不使用预先定义的标签,因此可以为标签指定描述数据的名称。
在Web早期历史上,XML作为一种数据传输格式很流行("AJAX"中的"X"代表"XML"),但它的受欢迎程度现在已经下降,大部分也转用JSON格式。
什么是XML实体?
XML实体是一种在XML文档中表示数据项的方式,而不是使用数据本身。
XML语言的规范中心内置了各种实体,例如,实体"<"和">"表示字符<and>,这些是用于表示XML标记的元字符,因此当它们出现在数据中时,通常必须使用它们的实体来表示。
什么是文档类型定义?
XML文档类型定义(DTD)包含可以定义XML文档的结构,它可以包含数据值的类型以及其他项的声明。DTD在XML文档开头的可选DOCTYPE元素中声明,也可以完全独立于文档本身(称为“内部DTD”),也可以从其他地方加载(称为“外部DTD”),也可以是两者的混合。
什么是XML自定义实体?
XML允许在DTD中定义自定义实体,比如:
这个定义意味着实体引用&myentity的任何用法,XML文档中的值将被替换为定义的值:"my entity value",其实相当于就是自定义个常量。
什么是XML外部实体?
XML外部实体是一种自定义实体,其定义位于声明它们的DTD之外。
外部实体的声明使用SYSTEM关键字,并且必须指定应该从中加载实体值的URL,比如:
URL也可以使用file://协议,因此可以从文件加载外部实体,比如:
XML外部实体提供了XML外部实体攻击发生的主要方式。
什么是XML外部实体注入?
XML外部实体注入(也称为XXE)是一种Web安全漏洞,允许攻击者干扰应用程序对XML数据的处理。它通常允许攻击者查看应用程序服务器系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
在某些情况下,攻击者可以通过利用XXE漏洞执行服务器端请求伪造(SSRF)攻击来提升XXE攻击,以破坏底层服务器或其他后端基础设施。
XXE漏洞是如何产生的?
一些应用程序使用XML格式在浏览器和服务器之间传输数据,执行此操作的应用程序几乎总是使用标准库或平台API来处理服务器上的XML数据。
XXE漏洞的出现是因为XML规范包含各种潜在的危险特性,标准解析器支持这些特性,即使它们通常不被应用程序使用。
XML外部实体是一种自定义XML实体,其定义的值是从声明它们的DTD外部加载的,从安全角度来看,外部实体特别有趣,因为它们允许根据文件路径或URL内容定义实体。
XXE攻击有哪些类型?
XXE有多种攻击类型:
●利用XXE检索文件,其中定了包含文件内容的外部实体,并在应用程序的响应中返回。
●利用XXE执行SSRF攻击,其中外部实体是基于后端系统的URL定义的。
●利用盲目的XXE带外泄露数据,其中敏感数据从应用程序服务器传输到攻击者控制的系统。
●利用盲XXE通过错误消息检索数据,攻击者可以触发包含敏感数据的解析错误消息。
如何查找和测试XXE漏洞?
使用自动化工具漏扫程序可以快速可靠地发现绝大多数XXE漏洞。
手动测试XXE漏洞通常包括:
●通过基于众所周知的操作系统文件定义外部实体并在应用程序响应中返回的数据中使用该实体来测试文件检索。
●通过基于自己控制的系统URL定义外部实体并监视与该系统的交互来测试盲XXE漏洞。
●通过使用XInclude攻击尝试检索众所周知的操作系统文件,测试服务器端XML文档中用户提供的非XML数据是否存在漏洞。
如何防止XXE漏洞?
几乎所有的XXE漏洞的出现都是因为应用程序的XML解析库支持应用程序不需要或不打算使用的潜在危险XML功能,防止XXE攻击最简单和最有效的方法是禁用这些功能。
通常,禁用外部实体的解析并禁用对XInclude的支持就足够了,这通常可以通过配置选项或以编程方式覆盖默认行为来完成。有关如何禁用不必要功能的详细信息,可以参阅XML解析库或API的文档。
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):XML外部实体(XXE)注入-概念梳理
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论