【33】WEB安全學習----XSS攻擊1
關於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="#" onerror=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="#" onerror=alert(/xss5/)>
十六進位制編碼
<img src="#" onerror=alert(/xss5/)>