什么是XSS?
- XSS全程Cross-site scripting,跨站腳本攻擊。惡意攻擊者往Web頁面里插入html代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執行,從而達到惡意用戶的特殊目的。
XSS的危害:
- 盜取用戶或者管理員的Cookie
- XSS Worm
- 掛馬(水坑攻擊)
- 有局限性的鍵盤記錄
......等等一些其它的姿勢
XSS的分類:
- DOM-based XSS:DOM XSS與反射型XSS的差別在於DOM XSS代碼不需要服務器解析響應的直接參與,觸發XSS靠的是瀏覽器DOM解析器的解析,可以完全認為是客戶端的事情。
- 反射型XSS:反射型XSS又稱為非持久型XSS。XSS代碼出現在URL參數或者請求中,瀏覽器發出請求時,參數值作為輸入提交到服務器,服務器接受處理后參數值出現在響應的HTML中,最后瀏覽器解析執行了這段XSS代碼。
- 存儲型XSS:又稱持久型XSS,他和反射型XSS最大的不同就是,攻擊腳本將被永久地存放在目標服務器的數據庫或文件中。
- Flash XSS:利用的是網頁上flash文件缺陷來執行js腳本,一般是反射型xss。
XSS手動挖掘:
- 看URL參數輸出的位置
- 看輸入框輸出位置
輸出點位置:
1.輸出在標簽外:
- 需要可以構造標簽,如果不能構造標簽就不存在XSS漏洞
2.輸出到標簽中:
- 如果輸出在“雙引號或者‘單引號內部,需要能夠閉合引號,如果不能閉合引號,就需要看能否在當前的標簽屬性中執行js代碼,如果不能,就不存在xss漏洞。
- 如果沒有輸出在”雙引號或者’單引號內部,或者可以閉合引號,可以構造一個新的屬性,使用新的屬性的值來執行js代碼,比如事件屬性。
3.輸出到script標簽中:
- @如果輸出在“雙引號或者‘單引號內部,需要能夠閉合引號
- @如果不能閉合引號,需要看當前變量能不能innerHTML或者document.write,插入到網頁中,如果可以就可以構造XSS,如果沒有,就不存在XSS(引號內部可以使用unicode編碼,<不能編碼)
- @如果輸出“雙引號或者‘單引號內部,需要能夠閉合引號,如果可以閉合引號,就可以直接傳遞進去js代碼,使用注釋符號,注釋掉后面的js代碼就可以構造xss
XSS防御:
- 對XSS的防御需要根據實際情況對用戶的輸入進行嚴格的過濾。基於過濾的XSS防御方式通常可分為兩種:基於黑名單的過濾和基於白名單的過濾。后者的防御效果往往更好,對於用戶在白名單之外的輸入,可以直接忽略。在構造白名單的過程中需要保證在不影響用戶體驗的同時,盡可能杜絕一切不必要的輸入內容。
- 在cookie中加入httponly屬性可以在一定程度上保護用戶的cookie,減少出現XSS時損失
- (1,apache2.2.x;2.注冊網站,把攻擊者自己的加了httponly的cookie復制過去,補全信息)
- Flash XSS的修復需要對相應的flash進行修改或升級替換。