2009年9月15日 星期二

存儲型XSS

 如果把瀏覽器看作WEB2.0後時代的操作系統,那麼客戶端腳本就相當於傳統的應用程序,而XSS的攻擊方式其實就相當於在被攻擊者的系統上執行了一個木馬程序。但這種「木馬」有個很大的缺點,就是無法像傳統木馬那樣在操作系統中安家,以後還能自動執行。

前幾個月發現了一種有趣的XSS漏洞,這種漏洞攻擊一次後XSS代碼就會被存儲下來,以後每次訪問被XSS的網站這個「木馬」都會再自動執行。我在網上沒有找到相關的資料,這裡姑且稱之為「存儲型XSS」(如果有朋友之前看到過類似的文檔,歡迎指教)。

原理其實也很簡單,流程如下:

XSS 代碼被提交給網站-->網站把XSS代碼SetCookie給瀏覽器-->瀏覽器再次請求網站時提交包含XSS代碼的 Cookie-->網站從Cookie中取出包含XSS代碼的某變量並將該變量作為頁面內容的一部分返回給客戶端-->客戶端執行XSS代碼

XSS代碼除了存儲在客戶端的Cookie中,也可能存儲在服務器端,不過這種情形應該比較少。

比較常見的例子是提供多種語言支持的網站。用戶在網站上設定要使用的語言,然後這個語言變量會被存儲在Cookie或服務器端數據庫。如在一些網頁中可以看到類似這樣的函數:

function getLocal() {
    var local;
    local = 'zh_CN';
    return local;
}

其中的local變量可能就是從客戶端提交的Cookie或服務器數據庫中取出的。客戶端請求如下URL:

http://tk.xfocus.org/setlocale.php?locale=zh_CN';return local;}alert("XSS");function dummy(){a='

「zh_CN';return local;}alert("XSS");function dummy(){a='」就會被作為語言信息存儲下來。瀏覽器再去請求網站頁面時,上面的函數就會變成這樣:

function getLocal() {
    var local;
    local = 'zh_CN';return local;}alert("XSS");function dummy(){a='';
    return local;
}

由於語言信息是需要全局使用的,所以一般網站的每個頁面都會包含上面的代碼。這樣,「木馬」就長存於「操作系統」中了。以後被攻擊者每次訪問該網站的每一個頁面,都會執行這些XSS代碼。

註: 本文轉載自網路 非原創
轉載自 YeZi 原文