張雨鋒,王 炅
(閩江學(xué)院 計(jì)算機(jī)與控制工程學(xué)院,福建 福州 350108)
近十年來(lái),我國(guó)互聯(lián)網(wǎng)行業(yè)經(jīng)歷了蓬勃發(fā)展的階段。隨著用戶(hù)數(shù)量的不斷增加,互聯(lián)網(wǎng)技術(shù)的創(chuàng)新、數(shù)字經(jīng)濟(jì)的發(fā)展以及政府?dāng)?shù)字化建設(shè)方面的技術(shù)水平也得到了顯著提升。隨著互聯(lián)網(wǎng)的不斷發(fā)展,越來(lái)越多的用戶(hù)加入網(wǎng)絡(luò)社會(huì)中,各類(lèi)互聯(lián)網(wǎng)應(yīng)用不斷涌現(xiàn),互聯(lián)網(wǎng)凝聚了全世界最為龐大的用戶(hù)群體。
近年來(lái),隨著社交網(wǎng)絡(luò)、微博等一系列社交軟件以及其他互聯(lián)網(wǎng)應(yīng)用的不斷涌現(xiàn),Web環(huán)境上的互聯(lián)網(wǎng)應(yīng)用已經(jīng)得到廣泛應(yīng)用。然而,由于Web應(yīng)用程序的廣泛使用,跨站腳本攻擊(XSS攻擊)已成為一種常見(jiàn)的網(wǎng)絡(luò)安全問(wèn)題。
攻擊者可以在Web應(yīng)用程序中注入JavaScript腳本或HTML標(biāo)簽等代碼,從而利用用戶(hù)的信任,欺騙受害者執(zhí)行惡意腳本。這種跨站腳本攻擊(Cross-Site Scripting,簡(jiǎn)稱(chēng)XSS)不僅可以導(dǎo)致用戶(hù)的個(gè)人信息被盜取,還可以使網(wǎng)站遭受癱瘓等嚴(yán)重后果。XSS攻擊具有易于實(shí)施、難以檢測(cè)等特點(diǎn),成了當(dāng)前Web應(yīng)用程序中一種常見(jiàn)的網(wǎng)絡(luò)安全問(wèn)題。
跨站腳本攻擊是當(dāng)前Web漏洞中危害性和影響最大的一種攻擊手段。在當(dāng)前的互聯(lián)網(wǎng)安全領(lǐng)域中,XSS攻擊成了一個(gè)備受關(guān)注的熱點(diǎn)問(wèn)題。
由于互聯(lián)網(wǎng)不斷的發(fā)展和安全問(wèn)題的不斷涌現(xiàn),根據(jù)目前國(guó)家信息安全漏洞庫(kù)現(xiàn)有數(shù)據(jù)顯示,自2016年7月起已經(jīng)發(fā)現(xiàn)和收集了9 401個(gè)XSS漏洞,2011年至今共新增了3 801個(gè)。在開(kāi)放式Web應(yīng)用程序安全項(xiàng)目的2007年到2013年報(bào)告中,XSS漏洞曾有3次位列前三。隨著互聯(lián)網(wǎng)應(yīng)用的不斷發(fā)展,XSS攻擊已經(jīng)變得越來(lái)越普遍且難以檢測(cè)。因此,研究跨站腳本攻擊的原理和利用變得尤為重要。如何檢測(cè)并預(yù)防XSS漏洞問(wèn)題已經(jīng)成了Web安全領(lǐng)域的重要問(wèn)題。
Cross-Site Scripting,可譯為“跨站腳本”或“層疊樣式表”。由于可能會(huì)存在縮寫(xiě)混淆的問(wèn)題,故跨站腳本攻擊另縮寫(xiě)為XSS[1]。這是一種可以導(dǎo)致網(wǎng)頁(yè)應(yīng)用程序出現(xiàn)問(wèn)題的安全漏洞攻擊方式。
XSS攻擊旨在攻擊并破壞網(wǎng)絡(luò)安全,它會(huì)在網(wǎng)絡(luò)中植入各種巧妙的惡意指令并使其進(jìn)入網(wǎng)頁(yè),讓用戶(hù)進(jìn)行加載并執(zhí)行。雖然這些執(zhí)行惡意的網(wǎng)頁(yè)程序大多數(shù)是JavaScript,但在Java、VBScript、LiveScript、ActiveX、Flash與HTML中也可以執(zhí)行。在攻擊成功后,攻擊方有一定可能會(huì)獲得一些權(quán)限,這些權(quán)限可以授權(quán)攻擊者執(zhí)行一些操作,比如瀏覽私密內(nèi)容,也可能直接影響用戶(hù)的瀏覽體驗(yàn),這一行為將會(huì)破壞安全系統(tǒng)的穩(wěn)定性和安全性,給個(gè)人或社會(huì)造成損失。
XSS可以被劃分為幾種不同的類(lèi)型,其中包括:非持久性型(反射型)XSS、持久型(存儲(chǔ)型)XSS、通用型XSS以及突變型XSS[2]。
反射型XSS攻擊是一種利用應(yīng)用程序反射用戶(hù)輸入并將惡意腳本反映到瀏覽器中的攻擊方式。攻擊者會(huì)將惡意代碼注入U(xiǎn)RL參數(shù)或表單中,當(dāng)用戶(hù)訪問(wèn)包含該參數(shù)或表單的頁(yè)面時(shí),惡意腳本就會(huì)被執(zhí)行。攻擊者通常通過(guò)誘導(dǎo)用戶(hù)訪問(wèn)包含惡意腳本的URL來(lái)實(shí)現(xiàn)攻擊。
舉個(gè)例子,如果用戶(hù)在不加防范的情況下將用戶(hù)名設(shè)置為,那么在訪問(wèn)特定頁(yè)面時(shí),這段代碼就會(huì)被反射到瀏覽器中并執(zhí)行。這種攻擊可以導(dǎo)致各種安全問(wèn)題,例如竊取用戶(hù)的敏感信息或篡改頁(yè)面內(nèi)容。
漏洞成因:XSS漏洞通常發(fā)生在應(yīng)用程序?qū)⑽唇?jīng)處理的用戶(hù)輸入或用戶(hù)可控參數(shù)輸出到頁(yè)面上的情況下,以下是一些主要的場(chǎng)景。
(1)將不可信數(shù)據(jù)插入HTML標(biāo)簽之間時(shí);將不可信數(shù)據(jù)插入HTML屬性里時(shí);將不可信數(shù)據(jù)插入SCRIPT里時(shí)[3]。
(2)將不可信數(shù)據(jù)插入Style屬性里的情況,同樣具有一定的危害性。
(3)將不可信數(shù)據(jù)插入HTML URL里時(shí)。
(4)使用富文本時(shí),并未采用XSS規(guī)則引擎來(lái)實(shí)現(xiàn)編碼過(guò)濾。
對(duì)于以上的幾個(gè)場(chǎng)景,若服務(wù)端或者前端沒(méi)有做好防范措施,就會(huì)出現(xiàn)漏洞隱患。
反射型XSS攻擊通??梢岳盟阉骱推渌麘?yīng)用程序功能,但相對(duì)于存儲(chǔ)型XSS攻擊,它的安全性較低。這是因?yàn)榉瓷湫蚗SS攻擊需要用戶(hù)點(diǎn)擊相關(guān)鏈接才能被觸發(fā),而且現(xiàn)代瀏覽器的內(nèi)置XSS保護(hù)程序和防御措施(如NoScript)可以減少其威脅。盡管如此,反射型XSS攻擊仍然可能導(dǎo)致用戶(hù)信息泄露和身份盜竊等嚴(yán)重問(wèn)題。
持久型XSS攻擊通常是通過(guò)社交網(wǎng)絡(luò)和Web文檔等方式實(shí)現(xiàn)的HTML注入。與反射型XSS攻擊不同的是,持久型XSS攻擊不需要任何特定的鏈接來(lái)傳播。它將惡意代碼嵌入目標(biāo)網(wǎng)站的數(shù)據(jù)庫(kù)中,從而在其他用戶(hù)訪問(wèn)該網(wǎng)站時(shí)自動(dòng)執(zhí)行。
這種攻擊技術(shù)的優(yōu)勢(shì)在于,它只需要感染一次就可以影響到許多用戶(hù)。持久型XSS攻擊可能出現(xiàn)在多種網(wǎng)絡(luò)環(huán)境中,例如博客評(píng)論、用戶(hù)評(píng)論、留言板、社交媒體、HTML電子郵件等。當(dāng)用戶(hù)訪問(wèn)被感染的網(wǎng)站時(shí),惡意代碼將自動(dòng)執(zhí)行,可能導(dǎo)致用戶(hù)信息泄露和身份盜竊等安全問(wèn)題。
漏洞成因:XSS漏洞的產(chǎn)生可以歸結(jié)為兩種原因。(1)惡意程序的存儲(chǔ)可能會(huì)導(dǎo)致XSS漏洞。攻擊者可以將惡意代碼存儲(chǔ)在服務(wù)器上,以便將其注入網(wǎng)站的頁(yè)面中。(2)XSS漏洞也可能是由于其他用戶(hù)在前端,或者是管理員在前后端的訪問(wèn)時(shí)無(wú)意間執(zhí)行了惡意代碼而導(dǎo)致的。攻擊者可以通過(guò)各種方式欺騙用戶(hù)或管理員,使其執(zhí)行惡意代碼,從而產(chǎn)生跨站連接并且可能產(chǎn)生跨站的攻擊。
DOM是一個(gè)與平臺(tái)和編程語(yǔ)言無(wú)關(guān)的接口,可以通過(guò)JavaScript對(duì)網(wǎng)頁(yè)顯示內(nèi)容和操作瀏覽器的接口進(jìn)行訪問(wèn)和操作。它的主要作用是讓信息無(wú)需通過(guò)服務(wù)器而直接在瀏覽器中接收和處理,從而減輕服務(wù)器的負(fù)擔(dān)。
然而,在DOM節(jié)點(diǎn)通過(guò)修改頁(yè)面內(nèi)容的操作中,存在一種XSS攻擊方式,稱(chēng)為DOM Based XSS。與其他類(lèi)型的XSS攻擊相比,DOM Based XSS攻擊具有較高的隱蔽性和難度。
漏洞成因:DOM型XSS是基于DOM文檔對(duì)象模型[4],其本質(zhì)是一份XML文檔。它能夠讓瀏覽器通過(guò)JavaScript更加便捷地訪問(wèn)和使用DOM,它的出現(xiàn)大大提高了瀏覽器的效率。當(dāng)發(fā)現(xiàn)并確認(rèn)客戶(hù)端代碼中存在DOM型XSS漏洞時(shí),釣魚(yú)者會(huì)利用自己構(gòu)建的URL誘導(dǎo)用戶(hù)進(jìn)行訪問(wèn),這種利用方式與反射型技術(shù)有相似之處。它的優(yōu)勢(shì)在于,構(gòu)造的URL參數(shù)無(wú)需發(fā)送到服務(wù)器,從而實(shí)現(xiàn)繞過(guò)WAF、躲避服務(wù)端的檢測(cè)功能。
通用型XSS也叫做UXSS或者Universal XSS,全稱(chēng)Universal Cross-Site Scripting。上文所提到的3種XSS攻擊的是因?yàn)榭蛻?hù)端或服務(wù)端的代碼開(kāi)發(fā)不嚴(yán)謹(jǐn)?shù)葐?wèn)題而存在漏洞的目標(biāo)網(wǎng)站或者應(yīng)用程序。這些攻擊的先提條件是訪問(wèn)頁(yè)面存在漏洞,但是UXSS是一種利用瀏覽器或者瀏覽器擴(kuò)展漏洞來(lái)制造產(chǎn)生XSS的條件[5]并執(zhí)行代碼的一種攻擊類(lèi)型。
3.5.1 漏洞成因
由于Web瀏覽器具有強(qiáng)大的功能,因此成了當(dāng)前大多數(shù)人使用的應(yīng)用程序之一。然而,一旦新漏洞被發(fā)現(xiàn),無(wú)論是被攻擊者利用還是向官方報(bào)告,都需要相當(dāng)長(zhǎng)的時(shí)間來(lái)解決,這段時(shí)間內(nèi)漏洞可能會(huì)被用于UXSS攻擊。
隨著技術(shù)的發(fā)展,越來(lái)越多的瀏覽器支持?jǐn)U展程序,但這也可能會(huì)給用戶(hù)帶來(lái)更多的安全隱患。UXSS攻擊是其中一種,它不僅可以攻擊網(wǎng)站頁(yè)面,還可以訪問(wèn)其他沒(méi)有漏洞的頁(yè)面,因此成為XSS攻擊中最具破壞力的類(lèi)型之一。
3.5.2 幾個(gè)典型的漏洞案例
(1)Adobe Acrobat的IE6和火狐瀏覽器可能存在安全漏洞。
這是一個(gè)比較經(jīng)典的例子。當(dāng)在使用擴(kuò)展程序時(shí)可能會(huì)導(dǎo)致錯(cuò)誤,使得代碼可以執(zhí)行。具體來(lái)說(shuō),在PDF閱讀器中存在漏洞,允許攻擊者在客戶(hù)端執(zhí)行腳本。攻擊者可以構(gòu)造惡意頁(yè)面并寫(xiě)入惡意腳本,然后利用擴(kuò)展程序打開(kāi)PDF時(shí)運(yùn)行代碼。Stefano Di Paola和Giorgio Fedon首先記錄和描述了一個(gè)在Mozilla Firefox瀏覽器中Adobe Reader插件中可利用的UXSS缺陷,該插件通過(guò)一系列參數(shù)允許從外部數(shù)據(jù)源獲取數(shù)據(jù)以填充文檔表單,如果沒(méi)有正確執(zhí)行,將允許跨站腳本攻擊。具體案例可以詳見(jiàn):Acrobat插件中的UXSS報(bào)告。
(2)Flash Player UXSS漏洞-CVE-2011-2107。
在2011年,發(fā)現(xiàn)了一個(gè)Flash Player插件中的漏洞,該漏洞存在于所有版本中。攻擊者可以利用構(gòu)造的.swf文件來(lái)訪問(wèn)Gmail設(shè)置并添加轉(zhuǎn)發(fā)地址,從而收到任意一個(gè)被攻破的Gmail賬號(hào)的所有郵件副本(發(fā)送時(shí)都會(huì)抄送)。Adobe承認(rèn)了這個(gè)漏洞的存在。具體案例可以詳見(jiàn): Flash Player UXSS漏洞-CVE-2011-2107報(bào)告。
(3)安卓版Chrome瀏覽器漏洞。
Chrome瀏覽器的安全性備受關(guān)注,因此它的XSS攻擊潛力受到限制。攻擊者可以利用Chrome的Intent對(duì)象,創(chuàng)建一個(gè)惡意的網(wǎng)頁(yè),并注入大量的病毒和木馬。由于Intent對(duì)象的存在,攻擊者可以輕松地通過(guò)Chrome來(lái)執(zhí)行攻擊,因?yàn)樗鼈兛梢灾苯优cAndroid操作系統(tǒng)的其他組件進(jìn)行交互,而無(wú)需任何額外的權(quán)限。這使得Chrome成為攻擊者的熱門(mén)目標(biāo)之一。具體案例可以詳見(jiàn): Issue 144813: Security: UXSS via com.android.browser.application_id Intent extra。
突變型XSS也被稱(chēng)為mXSS或Mutation-based Cross-Site-Scripting,這是一種XSS攻擊的變體。
3.6.1 漏洞成因
當(dāng)JavaScript代碼被映射到innerHTML屬性時(shí),會(huì)出現(xiàn)一些意外的變化,從而可能導(dǎo)致原本安全的HTML代碼被渲染成可能帶來(lái)威脅的XSS攻擊代碼,這將導(dǎo)致原本的安全認(rèn)定失效。
在攻擊代碼段中,當(dāng)一些JS代碼被輸出到DOM中或其他形式被再次渲染時(shí),就會(huì)導(dǎo)致XSS攻擊的執(zhí)行。這種在HTML內(nèi)容進(jìn)入innerHTML后發(fā)生的意外變化,也會(huì)導(dǎo)致XSS攻擊流程的發(fā)生。
這種類(lèi)型的XSS攻擊流程是將拼接的內(nèi)容置于innerHTML屬性中,這種操作在現(xiàn)代WEB應(yīng)用代碼中非常常見(jiàn),因?yàn)楹芏郬EB應(yīng)用都使用了innerHTML屬性。這將導(dǎo)致潛在的mXSS攻擊。從瀏覽器的角度來(lái)看,mXSS對(duì)三大主流瀏覽器(IE、Chrome、Firefox)都有影響。
3.6.2 mXSS的類(lèi)型
(1)反引號(hào)打破屬性邊界導(dǎo)致的 mXSS。該類(lèi)型是最早被發(fā)現(xiàn)并利用的一類(lèi)mXSS,于2007年被提出,隨后被有效地修復(fù)。
(2)未知元素中的xmlns屬性所導(dǎo)致的mXSS。一些瀏覽器不支持HTML5的標(biāo)記,例如IE8會(huì)將article、aside、menu等當(dāng)作是未知的HTML標(biāo)簽。
(3)在CSS中,可以使用反斜線“”對(duì)字符進(jìn)行轉(zhuǎn)義,例如property: 'v【1 lue'表示property: 'value',其中61是字母a的ASCII碼(16進(jìn)制)。此外,反斜線后也可以接Unicode編碼,例如:20AC 表示。通常情況下,這種轉(zhuǎn)義方式不會(huì)出現(xiàn)問(wèn)題。然而,在使用innerHTML時(shí),一些奇怪的情況會(huì)發(fā)生,從而導(dǎo)致所謂的mXSS(CSS中的跨站腳本攻擊)。
(4)CSS中雙引號(hào)實(shí)體或轉(zhuǎn)義導(dǎo)致的mXSS。接上一部分,這依然是CSS中所存在的問(wèn)題," " " 等雙引號(hào)的表示形式均可導(dǎo)致這類(lèi)問(wèn)題。
(5)CSS屬性名中的轉(zhuǎn)義所導(dǎo)致的mXSS。
(6)非HTML文檔中的實(shí)體突變。
(7)HTML文檔中的非HTML上下文的實(shí)體突變。
XSS攻擊涉及兩個(gè)要素:攻擊者提交惡意代碼和瀏覽器執(zhí)行惡意代碼?;谶@兩個(gè)攻擊要素,有4種預(yù)防方式可供選擇。
DOM類(lèi)型的XSS攻擊涉及網(wǎng)站前端JavaScript代碼的問(wèn)題,即前端代碼對(duì)不可信數(shù)據(jù)的處理不夠嚴(yán)謹(jǐn),導(dǎo)致將不可信數(shù)據(jù)當(dāng)成代碼來(lái)執(zhí)行。特別是在使用.innerHTML、.outerHTML、document.write()這些操作時(shí),更要引起重視,不能把不可信數(shù)據(jù)當(dāng)成HTML插入頁(yè)面中,應(yīng)該盡可能地使用.textContent、.setAttribute()等方法來(lái)處理。
在DOM中,內(nèi)聯(lián)事件監(jiān)聽(tīng)器,如location、onclick、onerror、onload、onmouseover以及標(biāo)簽的href屬性和JavaScript的eval、setTimeout、setInterval等方法,都可以將字符串轉(zhuǎn)換成可執(zhí)行的代碼。如果未經(jīng)驗(yàn)證的數(shù)據(jù)被拼接到這些字符串中并傳遞給API,則會(huì)極大地增加安全風(fēng)險(xiǎn),因此必須謹(jǐn)慎處理,以確保系統(tǒng)的穩(wěn)定性。
當(dāng)數(shù)據(jù)經(jīng)過(guò)前端過(guò)濾并傳遞到后端進(jìn)行處理時(shí),如果攻擊者能夠繞過(guò)前端的過(guò)濾機(jī)制,直接構(gòu)造請(qǐng)求并提交惡意代碼,就會(huì)對(duì)系統(tǒng)安全帶來(lái)威脅。為了解決這個(gè)問(wèn)題,可以在后端將用戶(hù)輸入的信息進(jìn)行過(guò)濾,然后再存入數(shù)據(jù)庫(kù)中。例如:一個(gè)普通用戶(hù)輸入了5 <7,后端將其轉(zhuǎn)化為5 $lt; 7,即在錄入之前進(jìn)行轉(zhuǎn)義處理,避免惡意代碼的注入。
但是,即使對(duì)用戶(hù)輸入進(jìn)行了過(guò)濾,也不能確定這個(gè)內(nèi)容會(huì)輸出到什么地方。這里有兩個(gè)問(wèn)題:(1)用戶(hù)輸入的信息可能會(huì)同時(shí)發(fā)送到前端和客戶(hù)端,如果通過(guò) escapeHTML() 處理,客戶(hù)端展示的信息將成為雜亂碼(例如:5 $lt; 7);(2)在前端中,所需的代碼根據(jù)其不同的位置也應(yīng)當(dāng)不同。例如:在使用 5 $lt; 7 作為 HTML 拼接頁(yè)面的時(shí)候,可以正常地顯示出:5 <7 這一內(nèi)容。
因此,采取輸入過(guò)濾并非完全可靠。“防止瀏覽器執(zhí)行惡意代碼”提供了一種關(guān)于此類(lèi)XSS的防護(hù)措施,可以采用如下兩種方式進(jìn)行有效的防護(hù)。
為了提高瀏覽器的安全性并避免被攻擊者利用,本研究可以在前端渲染過(guò)程中明確告知瀏覽器需要包含哪些內(nèi)容,例如:文本(.innerText)、屬性(.setAttribute)、樣式(.style)等。這樣瀏覽器就能更加安全地執(zhí)行預(yù)期的代碼,避免受到欺騙。
具體來(lái)說(shuō),為了避免使用innerHTML造成的XSS漏洞,可以使用textContent或innerText代替innerHTML來(lái)設(shè)置DOM元素的文本內(nèi)容;在使用jQuery庫(kù)時(shí),可以使用text()方法而不是html()方法來(lái)設(shè)置元素的文本內(nèi)容,以減少XSS的風(fēng)險(xiǎn)。
為了在拼接HTML時(shí)有效地進(jìn)行轉(zhuǎn)義,應(yīng)該使用適當(dāng)?shù)霓D(zhuǎn)義庫(kù)。常用的模板引擎(如 doT.js、ejs 和 FreeMarker)通常只會(huì)將&<>"'/這幾個(gè)字符進(jìn)行轉(zhuǎn)義,雖然這樣有助于保護(hù)HTML,但仍然存在一些缺陷。因此,為了更好地保護(hù)網(wǎng)站免受XSS攻擊,應(yīng)該使用更加嚴(yán)格的轉(zhuǎn)義規(guī)則,并確保在所有的輸入點(diǎn)(包括從數(shù)據(jù)庫(kù)中讀取的數(shù)據(jù))都應(yīng)用適當(dāng)?shù)霓D(zhuǎn)義規(guī)則。
隨著數(shù)字化程度的提高和信息技術(shù)的快速發(fā)展,本研究的生活和工作方式已經(jīng)發(fā)生了根本性的變化。隨之而來(lái)的是,網(wǎng)絡(luò)安全問(wèn)題也越來(lái)越頻繁地發(fā)生。特別是在金融、醫(yī)療、軍事和能源等重要行業(yè),一旦遭到黑客攻擊或病毒感染,將可能導(dǎo)致重大的經(jīng)濟(jì)和社會(huì)損失,甚至威脅到國(guó)家安全。在這些領(lǐng)域,安全問(wèn)題不僅是技術(shù)問(wèn)題,更是一個(gè)戰(zhàn)略問(wèn)題。
OWASP Top 10中的十大安全漏洞問(wèn)題,雖然已經(jīng)成為業(yè)界公認(rèn)的安全標(biāo)準(zhǔn),但是這些漏洞并不是一成不變的。隨著黑客攻擊手段的不斷升級(jí)和安全技術(shù)的不斷創(chuàng)新,新的安全問(wèn)題也不斷出現(xiàn)。因此,本研究需要對(duì)網(wǎng)絡(luò)安全問(wèn)題保持高度的關(guān)注,及時(shí)掌握最新的安全技術(shù)和漏洞信息,采取有效的安全措施來(lái)保護(hù)本研究的網(wǎng)絡(luò)系統(tǒng)和數(shù)據(jù)安全。這包括加強(qiáng)用戶(hù)教育、制定更加嚴(yán)格的安全策略和規(guī)定、加強(qiáng)網(wǎng)絡(luò)監(jiān)控等。只有通過(guò)這些綜合的措施,才能有效地保護(hù)本研究的網(wǎng)絡(luò)安全,確保本研究的數(shù)字生活更加安全、便利、高效。