1. 程式人生 > >XSS 漏洞原理及防禦方法

XSS 漏洞原理及防禦方法

正則表達 內容 規則 分享 保存 名單 nbsp 只需要 服務

XSS跨站腳本攻擊:兩種情況。一種通過外部輸入然後直接在瀏覽器端觸發,即反射型XSS;還有一種則是先把利用代碼保存在數據庫或文件中,當web程序讀取利用代碼並輸出在頁面上時觸發漏洞,即存儲型XSS。

危害:前端頁面能做的事它都能做。(不僅僅盜取cookie、修改頁面等)

1、 挖掘經驗

XSS挖掘的關鍵在於尋找有沒有被過濾的參數,且這些參數傳入到輸出函數。

常用輸出函數:print、print_r、echo、printf、sprintf、die、var_dump、var_export,所以只要尋找帶有變量的這些函數即可。

XSS漏洞挖掘受瀏覽器影響比較大,最重要的還要掌握各種瀏覽器容錯、編碼等特性和數據協議。

常出現場景:文章發表、評論、留言、註冊資料的地方、修改資料的地方等;

2、 反射型XSS

黑盒測試時:只需要將尖括號、單雙引號等提交到web服務器,檢查返回的html頁面裏面有沒有保留原來的特殊字符即可判斷;

白盒測試時:只需尋找帶有參數的輸出函數,然後根據輸出函數對輸出的內容回溯輸入參數,觀察有沒有過濾;

例如:

技術分享圖片

代碼中:oauth_signature 參數未經任何過濾,直接輸出,則可以直接用GET方式註入代碼。

3、 存儲型XSS

就是需要先把利用代碼保存在例如數據庫或文件中,當web 應用程序讀取利用代碼並輸出在頁面上時執行利用代碼,原理圖流程如下:

技術分享圖片

存儲型XSS比反射型要容易利用的多,不用考慮繞過瀏覽器的過濾,在隱蔽性上也要好得多。特別在社交網絡中的存儲型XSS蠕蟲能造成大面積的傳播,影響非常大。

挖掘存儲型XSS:尋找未過濾的輸入點和未過濾的輸出函數,這個最終的輸出點可能和輸入點完全不在一個業務流上,對於這類可以根據當前代碼功能去猜測,或追蹤哪裏有操作過這個數據,使用表名、字段名去代碼裏面搜索。

4、 漏洞防範

(1) 特殊字符HTML實體轉碼。最好的過濾方式是在輸出和二次調用的時候進行加HTML實體一類的轉碼,防止腳本註入。

(2) 標簽事件屬性黑名單。特殊字符容易被繞過,所以還得加標簽事件得黑名單或者白名單,這裏推薦使用白名單的方式,實現規則可以直接使用正則表達式來匹配,如果匹配到的事件不在白名單列表,就可以直接攔截,而不是過濾為空。

XSS 漏洞原理及防禦方法