期刊VIP學術指導 符合學術規范和道德
保障品質 保證專業,沒有后顧之憂
SQL注入是一種攻擊數據庫的行為,攻擊者把惡意SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串中,從而欺騙Web應用執行惡意的SQL命令,達到竊取數據或破壞的目的[6]。以往的SQL注入只針對運行在Web服務器端的數據庫,并且通過服務器端的SQL查詢來控制它。
Web客戶端數據是指由Web應用發起的、并由瀏覽器或瀏覽器插件執行和控制的、在Web用戶的系統上保存的數據,這些數據大多與Web用戶有關。自從采用簡單的Cookies作為HTTP的狀態管理機制以來,Web站點就開始在用戶的系統上保存數據。
為了滿足Web應用的需求,后來出現了新的Web客戶端數據存儲技術。這些新技術常常使用其他存儲機制,比如數據庫,并且一般提供比Cookies更多的存儲容量。Web客戶端數據存儲技術的發展和廣泛采用,給Web應用帶來了新的安全風險。比如客戶端數據損壞、客戶端數據泄露、客戶端XSS和SQL注入等。這些風險會影響到Web應用的安全與可靠運行。
1 Web客戶端數據存儲技術
目前存在多種Web客戶端數據存儲技術,除了Cookies,還有微軟的IE UserData和Silverlight、Adobe的Flash、Oracle的Java,以及與HTML 5有關的Web SQL數據庫(Web SQL Database)、Web存儲(Web Storage)、索引數據庫API(Indexed Database API)等。在這些存儲技術中,Cookies被所有的瀏覽器支持。其他技術則僅在部分瀏覽器中得到支持,并且有的技術還需要安裝相應的瀏覽器插件才可以使用,如Flash。
為了防止不同的Web應用讀取彼此的數據,上述所有的存儲技術都采用了同一來源策略機制。來源通常由主機名、端口號,以及傳輸協議等界定。瀏覽器會記錄所有Web客戶端數據的來源。當某個Web應用訪問本地存儲的數據(即Web客戶端數據)的時候,瀏覽器將檢查該Web應用的來源和被訪問數據的來源,只有當二者匹配的時候才允許訪問[1]。
大多數Web客戶端數據存儲技術并不指定數據在客戶端的保存期限,因此數據將一直保存在用戶系統上,除非主動刪除它們。不過Cookies是一個例外,它允許指定數據的到期時間。另外,不同的存儲技術采用不同的存儲機制,如純文本、XML、數據庫或其他專有的格式。
Web客戶端數據的使用方式依賴于特定的Web應用。大多數情況下,數據被用作Web應用的輸入。有時候數據也在本地使用,由客戶端腳本加載它們,用以創建動態網頁。
表1給出了目前常見的Web客戶端數據存儲技術。
2 Web客戶端數據存儲的安全風險
2.1 客戶端XSS
跨站腳本XSS(Cross-Site Scripting)是目前Web應用中非常流行的漏洞。不同類型的XSS具有相同的特征:允許惡意JavaScript腳本在用戶瀏覽器中運行。由于腳本是在被攻擊的Web站點的上下文中運行的,因此攻擊者可以訪問正常情況下不能訪問的資源。
XSS的傳統形式是反射XSS,其特點是惡意腳本被用戶發送到Web服務器(比如用戶無意中點擊了一個惡意鏈接),然后又被反射回給用戶。比反射XSS危害性更大的是存儲XSS。它把惡意腳本注入到Web站點所使用的庫中。如果這個庫用于顯示信息給用戶,那么,被注入的惡意腳本將被呈現給訪問這個站點的每一個用戶。
當Web應用使用Web客戶端數據存儲的時候,特別是采用數據庫作為存儲機制的時候,攻擊者就可能把惡意腳本注入到客戶端的本地存儲中。這是一種新的XSS,我們稱之為客戶端XSS,它完全位于本地并且使用客戶端的存儲能力??蛻舳薠SS一旦注入成功,每次當Web頁面使用本地存儲的信息的時候,惡意腳本都會運行。
2.2 客戶端SQL注入
Web客戶端數據存儲技術對數據庫的支持,使客戶端SQL注入成為可能。然而,普通的客戶端SQL注入并無多大危害,因為攻擊者并不能獲得查詢結果,結果會反饋給用戶而不是攻擊者。不過,如果在SQL注入中使用堆棧查詢的話,則危害性可能非常大,因為它允許攻擊者在客戶端數據庫上執行任意的SQL命令。
2.3 Web客戶端數據損壞
Web應用無法控制用戶對客戶端數據的修改或刪除。這會給Web應用帶來影響,這種影響依賴于Web應用對數據的使用。比如,如果視頻網站把用戶調整后的音量保存在Flash的LSO文件中,則對LSO數據的修改或是損壞只能導致音量恢復到默認值。而如果某個網站利用Cookie中的某個值來表示用戶的類型(普通用戶或者管理員),對這個值的修改則可以讓普通用戶變成管理員,從而擁有更大的權限。
2.4 Web客戶端數據泄露
Web應用對存儲在客戶端的數據并沒有多少控制,所以它無法保證數據的完整性。當存儲的數據需要保密,或者能夠用來訪問敏感信息時,數據泄露就成為一個嚴重問題。像XSS和SQL注入攻擊會讓Web客戶端數據處于危險中。另外,當攻擊者能夠訪問用戶的文件系統時,數據泄露也會發生。讓Web客戶端數據泄露更加復雜的一個因素是大部分這類數據并沒有生命期(Cookies是一個例外),可以長期保存在用戶的計算機上,這增加了數據泄露的可能性。
2.5 繞過同一來源策略
同一來源策略對于保護Web客戶端數據是極為重要的,繞過該策略會導致嚴重的后果。那么,攻擊者如何繞過同一來源策略呢?首先,XSS的所有變種都允許攻擊者繞過同一來源策略,因為它能夠讓腳本在被攻擊的域的上下文中運行;其次,Web瀏覽器中的某些漏洞也會導致無法正常實施該策略。此類漏洞在許多瀏覽器上都存在。還有,DNS服務器的DNS緩存污染也可以用來繞過該策略。
另外,當Web應用沒有恰當地定義來源的時候,也會出現繞過同一來源策略的問題。比如,Cookie機制允許開發者使用“domain”屬性設置來源。假如站點good.enjoy.com所指定的域是.enjoy.com。當域enjoy.com下的不同(虛擬)主機的所有權分散的時候,攻擊者可以建立一個域名為devil.enjoy.com的網站,然后他就可以訪問站點good.enjoy.com保存的cookie信息。在博客和社交網站上,這是一個典型的問題,因為此時每個用戶在相同的主域下都有自己的虛擬主機名。相似的問題也存在于共享服務器上——幾個用戶共享同一個主機上的Web空間。
3 Web客戶端數據存儲安全風險對策
3.1 不要信任本地存儲的數據
由于Web應用無法控制客戶端數據的完整性,Web應用開發者永遠不應該信任本地存儲的數據。如果你的Web應用確實需要在客戶端存儲數據,而你又希望數據是完整可靠的,則可以使用數字簽名技術來保證數據的完整性。
3.2 使用加密技術
加密Web客戶端數據可以在一定程度上阻止惡意程序讀取明文數據。在客戶端解密數據會泄漏明文,加密和解密操作必須在Web服務器上進行。不過,加密技術并不能保證客戶端數據總是安全的。如果服務器解密數據后又把明文信息返回給瀏覽器,攻擊者仍然有可能利用XSS來獲得信息。
3.3 防止XSS
對于傳統的XSS,可以通過在服務器端腳本中引入適當的輸出編碼機制來解決。不過,如果使用Web客戶端數據,服務器可能無法看到它們,因此無法重新編碼。當信息存儲在客戶端并由客戶端的腳本檢索的時候,這種情況就可能發生。為了防止客戶端XSS,開發者需要在客戶端以JavaScript函數的形式引入輸出編碼機制。這種編碼機制主要是在輸出的數據中重新編碼不安全的字符,比如,把小于號“<”編碼成“<;”。這會讓攻擊者在Web應用的輸出中注入標簽(這樣就可以執行惡意JavaScript腳本)的行為變得非常困難。
3.4 使用參數化的查詢
如果在Web應用中使用客戶端數據庫,同時使用SQL接口(如HTML 5 Web SQL Database),應該使用參數化的查詢而不是動態串方式。
3.5 指定的數據來源應盡可能窄
如果指定的數據來源過于寬松,存儲在用戶端的數據可能會被其他Web應用讀取。在共享域中,這個問題更加嚴重。如果采用Cookies技術,可以使用“path”屬性來進一步縮小允許讀寫數據的來源。然而,較新的存儲技術如HTML 5客戶端存儲技術并不支持類似的機制[7],這意味著在共享服務器上不應該使用這類存儲技術。
3.6 及時刪除不再使用的客戶端數據
除了Cookies,其他Web客戶端數據存儲技術并不支持數據的自動刪除。為了防止這種情況的發生,Web應用應負責刪除不再需要的數據。