簡介
跨站腳本(cross-site scripting,XSS)是一種安全攻擊,其中,攻擊者在看上去來源可靠的連結中惡意嵌入解碼。當有人點擊連結,嵌入程式作為客戶網路要求的一部分提交並且會在用戶電腦上執行,一般來說會被攻擊者盜取信息。
動態回復包括用戶輸入數據在內的錯誤信息這種網路形式使得攻擊者可能改變控制結構和/或頁面的行為。攻擊者用多種方式進行攻擊,如通過在論壇信息或垃圾郵件信息連結中嵌入密碼。攻擊者可能用電郵詐欺假裝可信來源。
像其它網路攻擊一樣,如SQL injection,很多對跨站腳本(cross-site scripting, XSS)的指責都指向引起可能性的不安全套用。動態產生頁面的網路伺服器套用如果不能確認用戶輸入並確保產生的頁面都正確編碼了,他們會易受跨站腳本攻擊。能造成跨站腳本的攻擊有時候指得是跨站腳本漏洞。
為了不受跨站腳本(cross-site scripting, XSS)的攻擊,專家建議,網路套用應該包括適當的安全機制,且伺服器應該理所當然地確證輸入。
背景和現狀
當
網景(Netscape)最初推出
JavaScript語言時,他們也察覺到準許網頁伺服器傳送可執行的代碼給一個
瀏覽器的安全風險(即使僅是在一個瀏覽器的
沙盒里)。它所造成的一個關鍵的問題在於用戶同時打開多個瀏覽器
視窗時,在某些例子裡,
網頁里的片斷代碼被允許從另一個網頁或
對象取出數據,而因為惡意的
網站可以用這個方法來嘗試竊取機密信息,所以在某些情形,這應是完全被禁止的。為了解決這個問題,瀏覽器採用了同源決策——僅允許來自相同域名系統和使用相同協定的對象與網頁之間的任何互動。這樣一來,惡意的網站便無法藉由JavaScript在另一個瀏覽器竊取機密數據。此後,為了保護用戶免受惡意的危害,其他的瀏覽器與服務端指令語言採用了類似的
訪問控制決策。
XSS漏洞可以追溯到1990年代。大量的網站曾遭受
XSS漏洞攻擊或被發現此類漏洞,如
Twitter,
Facebook,
MySpace,
Orkut,
新浪微博和
百度貼吧。研究表明,最近幾年
XSS已經超過
緩衝區溢出成為最流行的攻擊方式,有68%的網站可能遭受此類攻擊。根據開放網頁套用安全計畫(Open Web Application Security Project)公布的2010年統計數據,在Web安全威脅前10位中,XSS排名第2,僅次於
代碼注入(Injection)。
檢測方法
通常有一些方式可以測試網站是否有正確處理特殊字元:
><script>alert(document.cookie)</script>='><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')"><img src="http://xxx.com/yyy.png" onerror="alert('XSS')"><div style="height:expression(alert('XSS'),1)"></div>(這個僅限IE有效)
攻擊手段和目的
攻擊者使被攻擊者在瀏覽器中執行腳本後,如果需要收集來自被攻擊者的數據(如cookie或其他敏感信息),可以自行架設一個網站,讓被攻擊者通過JavaScript等方式把收集好的數據作為參數提交,隨後以
資料庫等形式記錄在攻擊者自己的伺服器上。
常用的XSS攻擊手段和目的有:
漏洞的防禦和利用
過濾特殊字元
避免XSS的方法之一主要是將用戶所提供的內容進行過濾,許多語言都有提供對
HTML的過濾:
PHP的htmlentities()或是htmlspecialchars()。
ASP.NET的Server.HtmlEncode()或功能更強的Microsoft Anti-Cross Site Scripting Library
Java的xssprotect (Open Source Library)。
使用HTTP頭指定類型
很多時候可以使用HTTP頭指定內容的類型,使得輸出的內容避免被作為HTML解析。如在
PHP語言中使用以下代碼:
<?php header('Content-Type: text/javascript; charset=utf-8');?>
即可強行指定輸出內容為文本/JavaScript腳本(順便指定了內容編碼),而非可以引發攻擊的HTML。
用戶方面