葛強 李俊 胡永權
摘 要: 跨站腳本攻擊(XSS)是客戶端Web安全的主要威脅。因跨站腳本攻擊的多樣性以及Web安全漏洞的隱蔽性,使得該類型的攻擊很難徹底防御。介紹了跨站腳本攻擊的基本概念,針對不同環(huán)境發(fā)生的跨站腳本攻擊機制進行了分析,探討了不同環(huán)境下如何防御跨站腳本攻擊的具體技術。
關鍵詞: Web安全; XSS; 跨站腳本攻擊; Web漏洞; XSS防御
中圖分類號:TP393 文獻標志碼:A 文章編號:1006-8228(2016)10-11-03
Discussion on XSS attack mechanism and defense technology
Ge Qiang1,2, Li Jun3, Hu Yongquan1
(1. College of Computer and Information Engineering, Henan University, Kaifeng, Henan 475004, China;
2. College of Environment and Planning, Henan University; 3. Information Office)
Abstract: Cross site scripting (XSS) attack is a major threat to the security of Web client. Because of the diversity of XSS attacks and Web security vulnerabilities hidden, this type of attack is very difficult to completely defense. This paper introduces the basic concept of XSS attacks, analyzes the XSS attack mechanisms of different environment, and discusses the specific technology to defense the XSS attacks of different environment.
Key words: Web security; XSS; cross site scripting attack; Web vulnerability; XSS defense
0 引言
在當今的Web2.0時代,Web上的大多數(shù)站點實際上是應用程序,它們功能強大,提供各種各樣的服務。網站向用戶展示的內容是以動態(tài)形式生成的,并且能夠滿足用戶的個性化需求[1]。但這些個性化的應用也給站點帶來一定的安全隱患,例如,跨站腳本攻擊等,同時,AJAX技術的流行使得XSS攻擊威脅變得更加嚴重。XSS攻擊在OWASP組織公布的OWASP TOP 2013中位列第三[2-3],可見XSS攻擊所造成的威脅之大。
1 XSS原理
XSS攻擊是一種間接攻擊,攻擊者通過Web服務器來攻擊其他用戶。攻擊者向服務器提交一段惡意代碼,而在服務器端并沒有對用戶的輸入做足夠的安全處理,就將用戶輸入寫入數(shù)據(jù)庫。當其他用戶向服務器再次請求含有惡意代碼的網頁時,服務器就會把包含惡意代碼的網頁返回,瀏覽器收到返回信息后進行相應的渲染、解碼工作,此時惡意代碼被觸發(fā)執(zhí)行,用戶的機密信息將被竊取,甚至可以控制用戶的系統(tǒng)[4]。XSS攻擊原理如圖1所示。
先舉一個簡單的例子來展示跨站腳本攻擊的效果,主要代碼如下:
請輸入你的姓名:
Result.jsp代碼如下:
你好:<%=request.getAttribute("name")%>
如果用戶輸入惡意內容,并且沒有對用戶的輸入做安全處理,因此在result頁面就可能會出現(xiàn)安全威脅。如用戶輸入“”,該字符串沒有經過安全檢查就寫入數(shù)據(jù)庫,當該name值被再次取出時,這個字符串會被瀏覽器解析執(zhí)行,瀏覽器將彈出“Hello”。
2 瀏覽器的解碼
防御XSS攻擊的主要方式是對用戶的輸入進行安全檢查并進行適當?shù)木幋a。對用戶在不同地方的輸入應當進行不同的編碼。只有對用戶的輸入進行完整的安全檢查和正確的編碼才能有效防御XSS攻擊。
對于下面這段代碼,瀏覽器會進行三種解碼。HTML解碼、JS解碼、URL解碼。
This is a test
首先,對于段落“This is a test”瀏覽器會進行HTML解碼。其次,對于“Hello”瀏覽器會首先進行HTML解碼,然后進行JS解碼。最后對于連接“www.a.com”瀏覽器會進行URL解碼[5]。因此,如果上述三個位置都是用戶可編輯的,則開發(fā)人員就需根據(jù)瀏覽器對以上幾處位置所進行的解碼順序來進行對應的編碼操作。
3 XSS解決方案
3.1 ESAPI解決方案
防御XSS攻擊的有效辦法就是對用戶輸入進行安全檢查,然后采取相應措施,主要的措施有替換、移除、編碼[6-7]。下面主要討論采用編碼方法防御XSS攻擊。
ESAPI是一個免費、開源的Web應用程序安全控制組件,可以幫助編程人員開發(fā)低風險應用程序。為了防御XSS攻擊,在實際情況中,應根據(jù)網頁顯示用戶輸入內容位置的不同,而采用不同的編碼方式。用戶的輸入可能在網頁的多個地方進行輸出,比如HTML標簽中、HTML屬性中,URL中,事件中等等。ESAPI提供了對以上輸出場景的編碼方案。
⑴ 對于在HTML標簽中輸出和在Html屬性中輸出時均可采用HtmlEncode編碼方案。例如:
String safeinput=ESAPI.encoder().encodeForHTML
(request.getParameter(“userinput”));
⑵ 在事件中輸出時可采用JavascriptEncode編碼方案。
String safeinput=ESAPI.encoder().encodeForJavaScript
(request.getParameter(“userinput”));
⑶ 在地址欄中輸出時可采用URLEncode編碼方案。例如:
Link
經過URLEncode編碼后將變?yōu)椋?/p>
⑷ 處理富文本
論壇中的帖子是最常見的“富文本”。它允許用戶插入圖片、視頻、音頻等。在處理富文本時的思路還是進行“輸入檢查”。在處理富文本時,“事件”應該被嚴格禁止,而且一些危險的標簽也應該被過濾掉,例如
屬性“name”的值是用戶的輸入內容,對此,瀏覽器會對該值進行兩種解碼,首先是進行HTML解碼,然后進行JS解碼。因此對于此位置上的用戶輸入應當在服務器端先進行HTML編碼,其次進行JS編碼[8]。
String safeinput=ESAPI.encoder().encoderForJavaScript
(request.getParameter("name"));
safeinput=ESAPI.encoder().encoderForHTML(safeinput);
如果對“name”的值只進行HTML編碼而不進行JS編碼結果會怎樣?首先測試最簡單的字符串,將“name”的值賦值為“”,瀏覽器彈出“”。對于期待的效果彈出字符串“XSS”似乎并沒有實現(xiàn),這樣看來只使用HTML編碼似乎起到了作用,但適當改變“name”的值就會是另一種結果。如果改變“name”的值為“正常彈出);alert(‘XSS攻擊”,則會出現(xiàn)“正常彈出”,然后出現(xiàn)“XSS攻擊”。不難看出,當改變“name”的值后,alert的閉合情況發(fā)生了改變。“name”值中的“);”首先閉合了第一個alert,即“alert(‘正常彈出)”,然后是“alert(‘XSS攻擊)”。由此看來,在此只進行HTML編碼是不行的。如果在此同時進行了HTML編碼與JS編碼,效果如圖2所示。
3.2 其他防御XSS攻擊的辦法
除了第2小節(jié)的方法外,還需要以下幾種手段進行輔助。
⑴ 防止Cookie劫持
針對此攻擊有一個比較不錯的防御辦法是使用HttpOnly屬性。通過為Cookie增加HttpOnly屬性,即可大大降低Cookie被劫持的風險。如果Cookie帶有HttpOnly屬性,則瀏覽器會禁止JavaScript訪問該Cookie。添加方法是在web.xml中配置
⑵ 輸入檢查
對于用戶的輸入都必須進行輸入檢查。主要檢查在用戶的輸入中,是否包含了一些危險字符如<、、”和一些危險標簽如
客服熱線:400-656-5456??客服專線:010-56265043??電子郵箱:longyuankf@126.com
電信與信息服務業(yè)務經營許可證:京icp證060024號
Dragonsource.com Inc. All Rights Reserved