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