各位在做軟件漏掃,尤其是Web應(yīng)用系統(tǒng)漏掃時,,可能會遇到系統(tǒng)存在跨站點腳本攻擊(XSS)漏洞的警告,,那今天就聊一下它。 概述 跨站點腳本攻擊(Cross Site Scripting簡稱XSS)是一種常見的攻擊行為,,它是指惡意攻擊者在應(yīng)用系統(tǒng)的Web頁面里插入惡意代碼,,當用戶瀏覽該頁面時,嵌入其中Web里面的惡意代碼會被執(zhí)行,,從而達到攻擊的目的,。從原理上講,跨站點腳本攻擊與前面講的SQL注入攻擊一樣,,都是利用系統(tǒng)對用戶輸入檢查不嚴格的漏洞,,將用戶數(shù)據(jù)變成了可執(zhí)行的代碼。一個完整的XSS過程是這樣的: 1. 攻擊者想辦法在應(yīng)用系統(tǒng)頁面中嵌入了惡意腳本代碼,; 2. 攻擊者想辦法讓目標用戶打開頁面鏈接或瀏覽頁面,; 3. 應(yīng)用系統(tǒng)將含有惡意腳本的頁面返回給用戶瀏覽器,; 4. 瀏覽器解析運行惡意腳本。 舉個例子: 我們打開一個網(wǎng)址,,用Burp Suite這個工具對數(shù)據(jù)包進行攔截修改,,在user參數(shù)插入69388%22%3balert(1)%2f%2f755,上述操作相當于實現(xiàn)了XSS攻擊的前兩步,,如下圖,。 點擊Forward按鈕 由此可見,,注入的腳本“alert(1)”被瀏覽器執(zhí)行,攻擊行為得手,。在XSS攻擊過程中,,注入的腳本代碼被叫做載荷(payload)。 類型 上述使用BurpSuite工具的過程是為了驗證目標Web頁面是否存在XSS漏洞,,真正發(fā)起XSS攻擊時當然不可能用到它,。大體來說,XSS的攻擊行為分以下三種: l 存儲型XSS:這種攻擊是一種持久性的攻擊,。XSS腳本作為頁面數(shù)據(jù)的一部分存儲在服務(wù)器或數(shù)據(jù)庫中,,用戶訪問該頁面的時候就會觸發(fā)代碼執(zhí)行。比如在論壇,、博客和留言板系統(tǒng)中,,攻擊者在發(fā)文的過程中將惡意腳本注入到所發(fā)文章內(nèi)容中,隨著文章被服務(wù)器存儲下來,,惡意腳本也被存放在服務(wù)器或數(shù)據(jù)庫中,,當其他用戶瀏覽了被注入惡意腳本的文章時,惡意腳本會在他們的瀏覽器中得到執(zhí)行,。這種XSS比較危險,,容易造成蠕蟲,Cookie盜取等,。 l 反射型XSS:這種攻擊是非持久化攻擊,。攻擊者構(gòu)造一個鏈接,鏈接指向的內(nèi)容包含了XSS腳本,。攻擊者通過欺騙等手段(如發(fā)送偽造的郵件)誘使用戶點擊鏈接觸發(fā)XSS代碼,。反射型XSS大多數(shù)是用來盜取用戶的Cookie信息。上面的例子就屬于反射型XSS. l DOM型XSS:這種攻擊也屬于反射型XSS,。它利用了Web頁面的文檔對象模型(Document ObjectModel,DOM)的特性來執(zhí)行腳本,。因此DOM型XSS不經(jīng)過服務(wù)器端,只發(fā)生在客戶端,。 防范 知道了跨站點腳本攻擊的原理,,也就知道了如何去防范了,。整體思路是對用戶的輸入(和URL參數(shù))進行過濾,對輸出進行HTML編碼,。也就是對用戶提交的所有內(nèi)容進行過濾,,對url中的參數(shù)進行過濾,過濾掉會導(dǎo)致腳本執(zhí)行的相關(guān)內(nèi)容,;然后對動態(tài)輸出到頁面的內(nèi)容進行HTML編碼,,使腳本無法在瀏覽器中執(zhí)行,。比如,,針對前文的例子,,可以這樣的輸入過濾處理: 在前端頁面引入RegularValidator控件和一個隱藏文本框,,并使用正則表達式"^([^\<\>\"\'\%\;\)\(\&]*)$"判斷用戶輸入是否含有非法字符,。 <asp:RegularValidatorID="revun" runat="server" ControlToValidate="txtInput" ErrorMessage="非法輸入"Font-Overline="True" Validation="^([^\<\>\"\'\%\;\)\(\&]*)$"></asp:RegularValidator> <asp:TextBox ID="txtInput"runat="server"CausesValidation="True"></asp:TextBox> 相應(yīng)在后端代碼將用戶輸入內(nèi)容賦值給隱藏文本框,并驗證文本框內(nèi)容是否含有非法字符: txtInput.Text =Me.Request.Form("username") + Me.Request.Form("password") +Me.Request.Form("sig") + Me.Request.Form("txt") +Me.Request.Form("logintype") revun.Validate() If Not revun.IsValid Then Me.Response.Write("<script>alert('用戶輸入可能存在惡意代碼,!');</script>") Exit Sub End If 要注意的是,,上面的過濾方法采用了黑名單過濾,即符合條件的就被過濾,。黑名單過濾雖然可以攔截大部分的XSS攻擊,,但是還是存在被繞過的風(fēng)險。而白名單過濾則相反,,符合條件的才不被過濾,,白名單雖然可以基本杜絕XSS攻擊,,但是真實環(huán)境中一般是不能進行如此嚴格過濾的,。 至于HTML編碼,,就是指對這些特殊字符進行編碼,以便瀏覽器直接原樣展示而不是處理它們,,比如下面的函數(shù): htmlEncodeByRegExp:function (str){ var s = ""; if(str.length == 0) return ""; s = str.replace(/&/g,"&"); s = s.replace(/</g,"<"); s = s.replace(/>/g,">"); s = s.replace(/ /g," "); s = s.replace(/\'/g,"'"); s = s.replace(/\"/g,"""); return s; } 由于Web頁面和腳本語言的復(fù)雜性,,實際中XSS攻擊的方法多種多樣,。本文只是從最基本的角度介紹了跨站點腳本攻擊的原理和防范思路,,在具體應(yīng)用中,,還需要大家根據(jù)實際情況應(yīng)對和解決,。 |
|
來自: 吳雨虹2kzpi83a > 《密碼學(xué)》