簡介
跨站腳本(英語:Cross-site scripting,通常簡稱為:XSS)是一種網站應用程式的安全漏洞攻擊,是
代碼注入的一種。它允許惡意用戶將代碼注入到網頁上,其他用戶在觀看網頁時就會受到影響。這類攻擊通常包含了
HTML以及用戶端
腳本語言。
背景和現狀
當
網景(Netscape)最初推出
JavaScript語言時,他們也察覺到準許網頁伺服器傳送可執行的代碼給一個
瀏覽器的安全風險(即使僅是在一個瀏覽器的
沙盒里)。它所造成的一個關鍵的問題在於用戶同時打開多個瀏覽器
視窗時,在某些例子裡,
網頁里的片斷代碼被允許從另一個網頁或
對象取出數據,而因為惡意的
網站可以用這個方法來嘗試竊取機密信息,所以在某些情形,這應是完全被禁止的。為了解決這個問題,瀏覽器採用了同源決策——僅允許來自相同域名系統和使用相同協定的對象與網頁之間的任何互動。這樣一來,惡意的網站便無法藉由JavaScript在另一個瀏覽器竊取機密數據。此後,為了保護用戶免受惡意的危害,其他的瀏覽器與伺服端指令語言採用了類似的
訪問控制決策。
XSS漏洞可以追溯到1990年代。大量的網站曾遭受
XSS漏洞攻擊或被發現此類漏洞,如
Twitter,
Facebook,
MySpace,
Orkut,
新浪微博和
百度貼吧。研究表明,最近幾年
XSS已經超過
緩衝區溢出成為最流行的攻擊方式,有68%的網站可能遭受此類攻擊。根據開放網頁套用安全計畫(Open Web Application Security Project)公布的2010年統計數據,在Web安全威脅前10位中,XSS排名第2,僅次於
代碼注入(Injection)。
縮寫
Cross-site scripting的英文首字母縮寫本應為
CSS,但因為
CSS在
網頁設計領域已經被廣泛指
層疊樣式表(Cascading Style Sheets),所以將Cross(意為“交叉”)改以交叉形的
X做為縮寫。但早期的檔案還是會使用CSS表示Cross-site scripting。
檢測方法
通常有一些方式可以測試網站是否有正確處理特殊字元:
><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>(這個僅於IE7(含)之前有效)
攻擊手段和目的
攻擊者使被攻擊者在瀏覽器中執行腳本後,如果需要收集來自被攻擊者的數據(如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。
用戶方面
參閱