查 杭,冷雪輝
(南昌工程學(xué)院瑤湖學(xué)院,江西 南昌 330000)
隨著信息時代的發(fā)展,人們的各種資料基本實現(xiàn)信息化和網(wǎng)絡(luò)化,但隨之帶來的安全問題越來越嚴(yán)峻。WEB應(yīng)用程序在生活中應(yīng)用非常廣泛,XSS漏洞是WEB應(yīng)用程序中最常見的漏洞。當(dāng)WEB應(yīng)用程序應(yīng)用于金融、社交等要求保密性極高的場所時,敏感數(shù)據(jù)一旦泄露,產(chǎn)生的損失將不可估量。微信小程序是WEB應(yīng)用程序的另一種表現(xiàn),隨著微信用戶的增加,其應(yīng)用范圍越來越廣,因此微信小程序的安全問題受到了越來越多的關(guān)注。
2019年6月,社交空間中發(fā)生了一起好友紛紛發(fā)帶有惡意鏈接的說說事件,本文通過對鏈接的分析,分析XSS攻擊如何繞開安全機制的檢測成功攻擊用戶,并提出可行的解決方案,不僅能提高用戶對于莫名鏈接的進(jìn)一步認(rèn)識,也能將其應(yīng)用于微信小程序信息安全管理中。
在網(wǎng)絡(luò)通信中,目前主要的通信方式有TCP和UDP兩種。其中,日常生活中接觸最廣泛的是TCP通信,包括通過瀏覽器或相應(yīng)的應(yīng)用程序請求超文本標(biāo)記網(wǎng)頁,或在網(wǎng)頁內(nèi)或應(yīng)用程序中使用套接字直接向服務(wù)器中請求數(shù)據(jù)。這些請求的過程大都可以看作使用TCP協(xié)議的傳輸過程。在微信小程序的設(shè)計中,考慮到微信小程序客戶端與服務(wù)器端之間的通信問題,微信小程序的官方社區(qū)提供了WebSocket和HTTP兩種網(wǎng)絡(luò)請求方式。其中,WebSocket屬于持久連接,只需建立一次連接請求,在連接關(guān)閉前都可以通過該連接進(jìn)行數(shù)據(jù)交互;HTTP則屬于一次連接,即發(fā)起連接請求后,客戶端會對服務(wù)端進(jìn)行一次request,并攜帶相應(yīng)的請求信息,服務(wù)器對request進(jìn)行響應(yīng),并對請求信息進(jìn)行處理,返回response,連接結(jié)束[1]。
對于上面兩種連接方式的應(yīng)用,前者可以應(yīng)用在客戶端與服務(wù)器消息傳遞頻率較為頻繁的情況下,如在線聊天室等。因為客戶端與服務(wù)器進(jìn)行長連接,當(dāng)兩者之間的數(shù)據(jù)交互頻率較低時,連接的保持會消耗客戶端和服務(wù)器端的端口、網(wǎng)絡(luò)帶寬及內(nèi)存等資源。在大部分應(yīng)用場景中,如購物、看新聞等,對數(shù)據(jù)的刷新周期一般以分鐘記。若在一分鐘內(nèi)只做一次請求,那么WebSocket形式的長連接顯然不適用。所以,這種情況下主要采用HTTP協(xié)議對服務(wù)器的數(shù)據(jù)進(jìn)行請求。
對于一般的微信小程序開發(fā)來說,客戶端的網(wǎng)絡(luò)請求一般發(fā)生在頁面加載和數(shù)據(jù)變更時,即:小程序框架解析并渲染頁面,需要從服務(wù)器中請求數(shù)據(jù);在使用微信小程序的過程中,某些地方的數(shù)據(jù)發(fā)生了更改,需要傳遞到服務(wù)器中,也需要向服務(wù)器發(fā)出處理指令。從應(yīng)用分析來看,對于微信小程序的網(wǎng)絡(luò)請求設(shè)計方面,以HTTP協(xié)議作為主要傳輸形式更合理。
HTTP協(xié) 議 有 GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS和TRACE8種請求方式。其中,微信小程序用于從服務(wù)器端獲取數(shù)據(jù)和將本地發(fā)生的更改上傳至服務(wù)器中主要采用GET和PUT兩種方式,且對于HTTP協(xié)議,HTTP請求有著固定的格式:
上面的HTTP請求消息包括請求類型、請求目標(biāo)、客戶端、請求類型及編碼等。因此,微信小程序進(jìn)行網(wǎng)絡(luò)請求時,要先明確請求目標(biāo)即主機名,之后再向主機發(fā)送請求的資源信息[2-3]。
基于HTTP協(xié)議,網(wǎng)絡(luò)瀏覽器能夠幫助人們以一種簡單的方式訪問互聯(lián)網(wǎng)資源。使用瀏覽器訪問目標(biāo)網(wǎng)站,只需要知道該目標(biāo)網(wǎng)站的站點主機名稱即可。由瀏覽器通過DNS服務(wù)器為查詢該主機地址,并對該主機發(fā)送HTTP請求。隨著WEB應(yīng)用程序等相關(guān)技術(shù)和產(chǎn)業(yè)的不斷發(fā)展,網(wǎng)絡(luò)請求也從早期的單純對文本或圖像等媒體文件的請求,演變成了很多其他功能性請求。伴隨著它的功能復(fù)雜化,網(wǎng)絡(luò)請求的資源名稱也愈加復(fù)雜。于是,部署在服務(wù)器端、作為網(wǎng)站連接請求的預(yù)處理先驅(qū)CGI的作用開始凸顯。現(xiàn)在使用瀏覽器訪問網(wǎng)頁時,瀏覽器的請求地址欄可能不再是純粹的文件路徑?,F(xiàn)在大部分網(wǎng)站服務(wù)器已經(jīng)支持站內(nèi)的路由導(dǎo)航,網(wǎng)站系統(tǒng)也支持通過CGI從網(wǎng)絡(luò)請求鏈接中提取隨著request發(fā)送的請求數(shù)據(jù)中的參數(shù)變量,這些參數(shù)可能是傳遞的信息,也可能是客戶端發(fā)送到服務(wù)器的特定指令,作為程序執(zhí)行的相關(guān)變量參數(shù)[4]。
當(dāng)前比較主流的WEB應(yīng)用程序的參數(shù)傳遞方式主要有兩種。
(1)直接對網(wǎng)站中的動態(tài)網(wǎng)頁進(jìn)行請求,在目標(biāo)的資源地址后補充’?’并以{參數(shù)名}={值}的形式進(jìn)行傳遞。網(wǎng)站服務(wù)器把相關(guān)參數(shù)單獨提取解析后,傳遞給請求的動態(tài)頁面處理程序。
(2)根據(jù)網(wǎng)站服務(wù)器的路由配置,使用參數(shù)配置路由,且相鄰層級的路由參數(shù)用’/’分隔,主要形式為{主機名}/{參數(shù)1}/{參數(shù)二}。
采用第一種方法以傳遞參數(shù)不受服務(wù)器路由配置的限制,不限參數(shù)數(shù)量和參數(shù)類型,且此種方法的參數(shù)配置發(fā)生錯誤時錯誤不會引起路由系統(tǒng)錯誤。但是,該參數(shù)的作用模式可以直接作用于動態(tài)資源的配置程序,相比于路由參數(shù),其內(nèi)容在從網(wǎng)絡(luò)傳輸層到程序應(yīng)用層直接缺乏路由系統(tǒng)的初步檢驗,其安全性較第二種參數(shù)傳遞方法較低[5]。因此,采用第一種參數(shù)傳遞方法服務(wù)器在使用該參數(shù)之前需要做一次額外檢驗,以保證在該處惡意代碼不會通過參數(shù)的傳遞注入到程序框架中。
2019年6月,某社交空間有一則誘導(dǎo)惡意轉(zhuǎn)發(fā)的鏈接。用戶在私人空間中點擊該鏈接會按明文鏈接的順序跳轉(zhuǎn)3次到新浪微博主頁,同時用戶點擊后,用戶空間會在不提醒用戶的情況下自動轉(zhuǎn)發(fā)該內(nèi)容。其他用戶通過其私人空間的點擊和轉(zhuǎn)發(fā),使得這個注入攻擊迅速擴散。為了避免類似的事情發(fā)生在更多網(wǎng)站項目中,本文將對這個惡意注入實例對HTTP網(wǎng)頁鏈接的安全性進(jìn)行討論,并提出相應(yīng)的解決或預(yù)防方案尤為必要。
首先,獲取該惡意鏈接:
http://open.qzone.qq.com/url_check?url=https%3A%2F%2Fweibo.cn%2Fsinaurl%3F_wv%3D1027%2 6cmd%3Dplay%26u%3Dhttp%253A%252F%252Fct.epro.sogou.com%252Fct%253Fid%253D1025611%2 526h%253D333%2526w%253D33336%2526fv%253 D32%2526if%253D16%2526sohuurl%253Dhttps%2 5253A%25252F%25252Fnews.china.com%25252Ft_we1561734359ZWl0ZQ.html%2526bs%253D1423%25 2C794%252522%257D%257D%25250a%253Beval%2 528atob%2528%252522ZG9jdW1lbnQud3JpdGUoIjxz Y3JpcHQgc3JjPSdodHRwOi8vbS5qcXVlcnkua2ltOjgwO-TAvd2ViL2lmLnBocD8xMjMnPjwvc2NyaXB0PiIp%252522%2529%2529%253B%25250aif%2528O%2 529%257Bif%2528B%2529%257B%2525221%2526t mp_cdif%253D0%2526mi%253D0%2526m%253DMT U1OTQwMzcwMV9wcmV0dHkgZG9nXzEwMjU2MTEA%2526ex%253D%2526glx%253D0%2526r%253D1561 734359%2526business%253D%2523123&cmd=play&_wv=2098179#123
由鏈接形式可以看出,鏈接中含有大量的%xx格式的代碼。該代碼為URL編碼,將其轉(zhuǎn)化為Unicode得到:
http://open.qzone.qq.com/url_check?url=https://weibo.cn/sinaurl?_wv=1027&cmd=play&u=http://ct.epro.sogou.com/ct?id=1025611&h=333&w=3333 6&fv=32&if=16&sohuurl=https://news.china.com/t_we1561734359ZWl0ZQ.html&bs=1423,794"}};eval(ato b("ZG9jdW1lbnQud3JpdGUoIjxzY3JpcHQgc3JjPSdodH RwOi8vbS5qcXVlcnkua2ltOjgwOTAvd2ViL2lmLnBocD 8xMjMnPjwvc2NyaXB0PiIp"));if(O){if(B){"1&tmp_cdif=0&mi=0&m=MTU1OTQwMzcwMV9wcmV0dHkgZG9n XzEwMjU2MTEA&ex=&glx=0&r=1561734359&busine ss=#123&cmd=play&_wv=2098179#123”
對該鏈接逐層級分析。首先,鏈接最底層是http://one.qq.com/url_check,這是QQ空間的外鏈校驗域,后面攜帶參數(shù)URL,其值為:
https://weibo.cn/sinaurl?_wv=1027&cmd=play&u=http://ct.epro.sogou.com/ct
該鏈接打開后能夠跳轉(zhuǎn)到URL參數(shù)值指向的鏈接中,因此第二階跳轉(zhuǎn)到:
https://weibo.cn/sinaurl
該鏈接仍為跳轉(zhuǎn)鏈接,其跳轉(zhuǎn)目標(biāo)為參數(shù)u的值,即:
http://ct.epro.sogou.com/ct?id=1025611&h=333&w=33336&fv=32&if=16&sohuurl=https://news.china.com/t_we1561734359ZWl0ZQ.html&bs=1423,794"}};eval(at ob("ZG9jdW1lbnQud3JpdGUoIjxzY3JpcHQgc3JjPSdod HRwOi8vbS5qcXVlcnkua2ltOjgwO-TAvd2ViL2lmLnBo cD8xMjMnPjwvc2NyaXB0PiIp"));
該鏈接為搜狗推廣的鏈接,也是最后一級的跳轉(zhuǎn)鏈接。從該鏈接中可以提取到參數(shù)id、h、w、fv、if、sohuurl和bs。根據(jù)在搜狗廣告推廣界面的一般規(guī)律,可以得到這些參數(shù)為廣告推廣的相關(guān)信息,內(nèi)容也沒有問題,且原鏈接在最后一個參數(shù)的底端使用兩個“}}”做了數(shù)據(jù)閉合,因此惡意代碼注入發(fā)生在分號后面的eval(atob("ZG9jdW1lbnQud3J pdGUoIjxzY3JpcHQgc3JjPSdodHRwOi8vbS5qcXVlcnk ua2ltOjgwOTAvd2ViL2lmLnBocD8xMjMnPjwvc2NyaX B0PiIp"))。
根據(jù)W3C的定義,atob()函數(shù)的作用在于將base64編碼的字符串還原;eval()提供了一個接口,使得鏈接中的腳本可以被解釋執(zhí)行,甚至可以通過URL執(zhí)行頁面中的腳本程序。按照這個思路,需要將字符串“ZG9…”進(jìn)行解密,解密結(jié)果為:
“document.write("<script src='http://m.jquery.kim:8090/web/if.php?123'></script>")”
這行代碼的意思是在當(dāng)前頁面中寫入一個來自“http://m.jquery.kim:8090/web/if.php?123”的腳本。從這里看此處是一個典型的XSS跨域攻擊。先是在開放平臺中利用URL函數(shù)逃過了BO檢查,向頁面中寫入了一個外源腳本,接著外源腳本產(chǎn)生作用。由于用戶主要使用該社交空間旗下的瀏覽器訪問該社交空間,外源的跨域腳本公式利用其CSRF漏洞對用戶的社交空間產(chǎn)生相關(guān)作用,在此漏洞下,攻擊者利用其進(jìn)行惡意轉(zhuǎn)發(fā)。
該攻擊的核心原理可以簡述如下:
(1)攻擊者利用base64編碼隱藏敏感信息,且將帶有攻擊行為的鏈接制作成層層跳轉(zhuǎn)的形式,以繞過相關(guān)安全機制的檢測。
(2)攻擊者注入代碼的鏈接能夠在某些平臺上成功執(zhí)行,且執(zhí)行后該平臺未主動監(jiān)測惡意腳本來源,使得該XSS攻擊在用戶本地生效而攻擊成功。
(3)該社交空間在瀏覽器和WEB應(yīng)用程序中的交互可能存在漏洞,使得攻擊者可以利用WEB應(yīng)用程序?qū)浖男湃纬晒?zhí)行CSRF攻擊。
在微信小程序開發(fā)過程中也會遇到相關(guān)問題。由于微信小程序去除了外源的腳本引用,使得其在本地更加安全。但是,微信小程序的數(shù)據(jù)來源于運行在云端的遠(yuǎn)程服務(wù)器,而遠(yuǎn)程服務(wù)器與微信小程序的信息通信主要通過HTTP的數(shù)據(jù)請求實現(xiàn),因此存在XSS攻擊的可能。
一般情況下,微信小程序向服務(wù)器端發(fā)送的請求主要為GET和PUT。通過前者,服務(wù)器可以根據(jù)小程序傳遞的相關(guān)參數(shù)解析參數(shù),并返回相應(yīng)的結(jié)果。對于后者,微信小程序向服務(wù)器發(fā)送內(nèi)容更新指令,服務(wù)器解析指令參數(shù),執(zhí)行相應(yīng)的操作,并返回相應(yīng)的結(jié)果。根據(jù)其作用方式的特點,可以總結(jié)其攻擊方式如下。
對于GET請求,攻擊者可以篡改request中的內(nèi)容,使之傳遞到服務(wù)器后,在服務(wù)器處理參數(shù)的過程中造成程序出錯或使得服務(wù)器返回錯誤的結(jié)果。同時,在response的過程中,攻擊者也可以向其中注入惡意代碼,引起客戶端的數(shù)據(jù)處理模塊出錯或產(chǎn)生錯誤結(jié)果,甚至可能引起惡意指令對個人信息安全造成影響。
對于PUT請求,由于傳遞的參數(shù)中有更多的指令元素,攻擊者通過直接的錯誤信息注入,可能使得服務(wù)器處理程序直接崩潰,甚至影響整個系統(tǒng)的后端數(shù)據(jù)安全。
所以,在微信小程序中對XSS攻擊進(jìn)行探討和防范特別重要。
對于以上分析的幾點問題,提出如下解決方案:
(1)在整個通信過程中采用嚴(yán)格的鑒權(quán)通信模式,即使用預(yù)定的SECRETKEY對原文進(jìn)行數(shù)字簽名,服務(wù)器端校驗數(shù)字簽名后開始正式通信。
(2)將通信內(nèi)容進(jìn)行對稱加密,配合鑒權(quán)機制,不僅能夠保證數(shù)據(jù)可靠,也能保證數(shù)據(jù)在傳輸過程中的安全系數(shù)。
(3)服務(wù)器和客戶端對傳遞的消息進(jìn)行檢驗,確保沒有非法的腳本或者惡意指令的注入。
隨著WEB應(yīng)用程序的發(fā)展,它的應(yīng)用愈加廣泛。WEB應(yīng)用程序的安全問題對于WEB應(yīng)用程序開發(fā)者來說顯得愈加重要。維護(hù)網(wǎng)絡(luò)安全是每個人的責(zé)任,在防范可能發(fā)生的危險的同時,也要共同維護(hù)互聯(lián)網(wǎng)的和諧大環(huán)境,為網(wǎng)絡(luò)凈化貢獻(xiàn)力量。
作為開發(fā)者,應(yīng)該以數(shù)據(jù)安全為中心。在設(shè)計和開發(fā)數(shù)據(jù)接口時應(yīng)該考慮全面,在模擬測試階段就應(yīng)該確保數(shù)據(jù)能夠絕對安全。同時,開發(fā)者應(yīng)時刻關(guān)注目前網(wǎng)絡(luò)上流行的攻擊方式,并時常檢查應(yīng)用軟件可能存在的問題并不斷完善。
對于一款高效且實用的微信小程序來說,安全是任何強大功能的前提。設(shè)計開發(fā)小程序和WEB應(yīng)用時,必須嚴(yán)格按照加密通信方案設(shè)計,并且在設(shè)計過程中減少對外部程序的依賴,包括URL程序和外置腳本或其他資源。因為有外部的內(nèi)容可能會為軟件增光添彩,也可能帶來被攻擊的危險。