跨站指令碼攻擊(XSS) 漏洞原理及防禦方法
注:轉載請註明出自:https://blog.csdn.net/qq_36711453/article/details/83745195
XSS跨站指令碼攻擊:兩種情況。一種通過外部輸入然後直接在瀏覽器端觸發,即反射型XSS;還有一種則是先把利用程式碼儲存在資料庫或檔案中,當web程式讀取利用程式碼並輸出在頁面上時觸發漏洞,即儲存型XSS。DOM型XSS是一種特殊的反射型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) 標籤事件屬性黑名單。特殊字元容易被繞過,所以還得加標籤事件得黑名單或者白名單,這裡推薦使用白名單的方式,實現規則可以直接使用正則表示式來匹配,如果匹配到的事件不在白名單列表,就可以直接攔截,而不是過濾為空。