跨網站指令碼
跨網站指令碼(英語:Cross-site scripting,通常簡稱為:XSS)是一種網站應用程式的安全漏洞攻擊,是代碼注入的一種。它允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及使用者端腳本語言。
「跨網站指令碼」的各地常用名稱 | |
---|---|
中國大陸 | 跨站腳本 |
臺灣 | 跨網站指令碼 |
此條目可參照英語維基百科相應條目來擴充。 |
XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意製造的網頁程序。這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻擊成功後,攻擊者可能得到更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。
背景和現狀
編輯當網景(Netscape)最初推出JavaScript語言時,他們也察覺到准許網頁伺服器傳送可執行的程式碼給一個瀏覽器的安全風險(即使僅是在一個瀏覽器的沙盒裡)。它所造成的一個關鍵的問題在於使用者同時開啟多個瀏覽器視窗時,在某些例子裡,網頁裡的片斷程式碼被允許從另一個網頁或物件取出資料,而因為惡意的網站可以用這個方法來嘗試竊取機密資訊,所以在某些情形,這應是完全被禁止的。為了解決這個問題,瀏覽器採用了同源決策——僅允許來自相同網域名稱系統和使用相同協定的物件與網頁之間的任何互動。這樣一來,惡意的網站便無法藉由JavaScript在另一個瀏覽器竊取機密資料。此後,為了保護使用者免受惡意的危害,其他的瀏覽器與伺服端指令語言採用了類似的存取控制決策。
XSS漏洞可以追溯到1990年代。大量的網站曾遭受XSS漏洞攻擊或被發現此類漏洞,如Twitter[1],Facebook[2],MySpace,Orkut[3][4] ,新浪微博[5]和百度貼吧 。研究表明[6],最近幾年XSS已經超過緩衝區溢出成為最流行的攻擊方式,有68%的網站可能遭受此類攻擊。根據開放網頁應用安全計劃(Open Web Application Security Project)公布的2010年統計數據,在Web安全威脅前10位中,XSS排名第2,僅次於代碼注入(Injection)。[7]
縮寫
編輯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://888.888.com/999.png" onerror="alert('XSS')">
<div style="height:expression(alert('XSS'),1)"></div>
(這個僅於IE7或以前有效)
攻擊手段和目的
編輯攻擊者使被攻擊者在瀏覽器中執行腳本後,如果需要收集來自被攻擊者的數據(如cookie或其他敏感信息),可以自行架設一個網站,讓被攻擊者通過JavaScript等方式把收集好的數據作為參數提交,隨後以數據庫等形式記錄在攻擊者自己的服務器上。
常用的XSS攻擊手段和目的有:
- 盜用cookie,獲取敏感信息。
- 利用植入Flash,通過crossdomain權限設置進一步獲取更高權限;或者利用Java等得到類似的操作。
- 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作。
- 利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
- 在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DoS攻擊的效果。
漏洞的防禦和利用
編輯過濾特殊字符
編輯避免XSS的方法之一主要是將使用者所提供的內容進行過濾,許多語言都有提供對HTML的過濾:
- PHP的
htmlentities()或是htmlspecialchars()
。 - Python的
cgi.escape()
。 - ASP的
Server.HTMLEncode()
。 - ASP.NET的
Server.HtmlEncode()
或功能更強的Microsoft Anti-Cross Site Scripting Library (頁面存檔備份,存於網際網路檔案館) - Java的xssprotect (Open Source Library) (頁面存檔備份,存於網際網路檔案館)。
- Node.js的node-validator。
很多時候可以使用HTTP頭指定內容的類型,使得輸出的內容避免被作為HTML解析。如在PHP語言中使用以下代碼:
<?php header('Content-Type: text/javascript; charset=utf-8'); ?>
即可強行指定輸出內容為文本/JavaScript腳本(順便指定了內容編碼),而非可以引發攻擊的HTML。
使用者方面
編輯包括Internet Explorer、Mozilla Firefox在內的大多數瀏覽器皆有關閉JavaScript的選項,但關閉功能並非是最好的方法,因為許多網站都需要使用JavaScript語言才能正常運作。通常來說,一個經常有安全更新推出的瀏覽器,在使用上會比很久都沒有更新的瀏覽器更為安全。
參閱
編輯- 內容安全策略
- 蒼月瀏覽器—過濾跨網站指令碼(XSS)的網絡瀏覽器
- SGML實體
- Metasploit—一個包含XSS測試的開源滲透測試工具
外部連結
編輯- CERT® Advisory CA-2000-02 Malicious HTML Tags Embedded in Client Web Requests (頁面存檔備份,存於網際網路檔案館) (英文)
- Cross Site Scripting Info (頁面存檔備份,存於網際網路檔案館) (英文)
- The Same Origin Policy (頁面存檔備份,存於網際網路檔案館) (英文)
- XSS (Cross Site Scripting) Cheat Sheet (英文)
腳註
編輯- ^ Arthur, Charles. Twitter users including Sarah Brown hit by malicious hacker attack. The Guardian. September 21, 2010 [September 21, 2010]. (原始內容存檔於2011-01-20).
- ^ Leyden, John. Facebook poked by XSS flaw. The Register. May 23, 2008 [May 28, 2008]. (原始內容存檔於2011-10-11).
- ^ Full List of Incidents. Web Application Security Consortium. February 17, 2008 [May 28, 2008]. (原始內容存檔於2010-10-21).
- ^ Obama site hacked; Redirected to Hillary Clinton. ZDNet. April 21, 2008 [May 28, 2008]. (原始內容存檔於2014-03-27).
- ^ 新浪微博病毒事件分析. SOHU. 2011-06-28 [2011-10-18]. (原始內容存檔於2011-09-05).
- ^ Berinato, Scott. Software Vulnerability Disclosure: The Chilling Effect. CSO (CXO Media). January 1, 2007: 7 [June 7, 2008]. (原始內容存檔於2008-04-18).
- ^ OWASP Top 10 - 2010 Document (PDF). OWASP. April 19, 2010 [Jan 2, 2013]. (原始內容 (PDF)存檔於2012年12月4日).