關於XSS跨站腳本攻擊有太多文章和教材提供了,本章就簡單介紹XSS攻擊原理,重點介紹XSS代碼構造和繞過。
一、XSS攻擊原理
XSS攻擊:即跨站腳本攻擊,是指攻擊者在網頁中嵌入客戶端JavaScript腳本,當用戶使用瀏覽器瀏覽嵌入惡意代碼的網頁時,惡意代碼將會在用戶的瀏覽器上執行。
JavaScript可以用來獲取用戶cookie、改變網頁內容、URL跳轉等等,那麼存在XSS漏洞的網站就可以盜取用戶cookie、黑掉頁面、導航到惡意網址等。
XSS攻擊分爲三類:反射型、存儲型、DOM型。
反射型XSS
反射性XSS也叫非持久型XSS,是最容易出現的一種XSS漏洞,當用戶訪問一個帶有XSS代碼的URL請求時,服務器端接收數據後處理,然後把帶有XSS代碼的數據發送到瀏覽器,瀏覽器解析這段帶有XSS代碼的數據後,最終造成XSS漏洞。這個過程就像一次反射,故稱爲反射型XSS。
存儲型XSS
存儲型XSS又被稱爲持久型XSS,存儲型XSS是最危險的一種跨站腳本。
允許用戶存儲數據的Web應用程序都可能出現存儲型XSS漏洞,當攻擊提交一段XSS代碼後,被服務器端接受並存儲,當攻擊者再次訪問頁面時,這段XSS代碼就會被讀取出來並響應給瀏覽器,造成XSS跨站攻擊。
DOM型XSS
學過JavaScript都知道DOM(文檔對象模型),使用DOM可以允許程序動態的訪問和跟新文檔的內容和結構。
而基於DOM型的XSS是不需要與服務器端交互的,它只發生在客戶端處理數據階段。
二、XSS攻擊利用
JavaScript語言非常強大,可以做很多事情,可利用JavaScript做如:經緯度定位、獲取HTML源碼、H5截屏、端口掃描、CSRF攻擊、鍵盤記錄、頁面僞造、點擊劫持、釣魚等等。
具體功能可參考BEFF和一些XSS利用平臺。
三、XSS攻擊修復
1、HttpOnly
HttpOnly最早由微軟提出,如今已成爲一個標準,瀏覽器將禁止頁面的JavaScript訪問帶有HttpOnly屬性的Cookie。
所以,HttpOnly是解決XSS攻擊後的Cookie劫持攻擊,而不是解決XSS攻擊。
2、輸入檢查
對用戶提交的數據進行檢查,如長度、類型等檢查,或採用XSS Filter過濾器進行XSS檢查。
3、輸出編碼
可採用HTML實體編碼HtmlEncode。對&、<、>、"、'、/等進行轉義編碼。
四、XSS構造研究
1、插入<>標記
如果能插入<>標記,那麼就能操作一個html標籤,然後通過<script>標籤就能插入任意的腳本代碼。
<script>alert(/xss/)</script>
2、利用HTML標籤屬性值執行XSS
如果不能構造自己的HTML標籤,但是還是可以通過其他形式來執行XSS,如HTML標籤的屬性值。
很多HTML標籤中的屬性都支持JavaScript:[code]僞協議的形式,如:
<img src="javascript:alert('xss');">
<table background="javascript:alert('xss');">
但目前支持這種僞協議的瀏覽器爲老版本,如IE6。
並不是所有的標記屬性都能產生XSS,通常只有引用文件的屬性才能觸發XSS。
如:href=、lowsrc=、bgsound=、background=、value=、action=、dynsrc=等等。
經測試,火狐、谷歌瀏覽器均不支持此僞協議:
只有IE6支持此僞協議:
3、利用事件觸發
因爲標籤屬性值只有特定瀏覽器才能觸發,如IE6,那麼有沒有其他辦法呢?事件就是其中一種方法。
事件就是瀏覽器自身執行的某種動作,如click、mouseover、load等,而響應事件的函數叫做事件處理函數(事件偵聽器)。如:
<img src="#" οnerrοr=alert(/xss/)>
onerror是IMG標記的一個事件,只要頁面中發生錯誤,該事件立即被激活。
4、利用CSS進行跨站攻擊
使用CSS樣式表執行JavaScript具有隱蔽性、靈活多變等特點,但是CSS樣式表有一個很大的缺點:各瀏覽器不能通用,甚至於同一瀏覽器不同版本之間都不能通用。
<div style="background-image:url(javascript:alert(/xss1/))">
<style>
body {background-image:url("javascript:alert(/xss2/)");}
</style>
<style>
@import 'javascript:alert("xss3")';
</style>
經測試,此代碼也只能在IE6中被觸發:
可見,以上能通殺的就只有利用事件進行觸發的方法。
5、XSS繞過
大小寫繞過:jaVaSCript
單雙引號互用:<img src='xxx'>、<img src="xxx">
不用引號:<img src=javascript:alert(xss);>
繞過空格:<img/src="javascript:alert('xss');">
編碼繞過:HTML屬性值支持ASCII碼。
通用:
十進制編碼
<img src="#" οnerrοr=alert(/xss5/)>
十六進制編碼
<img src="#" οnerrοr=alert(/xss5/)>