大家經(jīng)常會看到QQ空間自動(dòng)轉(zhuǎn)發(fā)一些附帶鏈接的不良信息,即便我們的QQ密碼并沒有被盜取。最近通過對一個(gè)QQ空間自動(dòng)轉(zhuǎn)發(fā)鏈接進(jìn)行分析,發(fā)現(xiàn)該自動(dòng)轉(zhuǎn)發(fā)機(jī)制通過利用騰訊網(wǎng)站存在漏洞的頁面,精心構(gòu)造出利用代碼獲取用戶的QQ號和skey值,從而獲得用戶的一些敏感操作權(quán)限。并通過該漏洞自動(dòng)轉(zhuǎn)發(fā)一些不良信息誘導(dǎo)用戶點(diǎn)擊,從而導(dǎo)致大面積傳播。
傳播現(xiàn)象
如果有一天,你發(fā)現(xiàn)好多QQ好友空間都在發(fā)一條說說,并且這個(gè)說說附帶了一個(gè)鏈接,像下圖這樣:
此時(shí)你就要注意了,那個(gè)網(wǎng)頁你點(diǎn)進(jìn)去你也會一起中毒,并在你沒有察覺的情況下在你的空間轉(zhuǎn)同樣的內(nèi)容。
針對這種情況,我們通過分析其原理得知其轉(zhuǎn)發(fā)機(jī)制,下邊我們以一個(gè)實(shí)例,并用最容易理解的方式來告訴大家這種不良信息是如何轉(zhuǎn)發(fā)以及如何防范。
轉(zhuǎn)發(fā)機(jī)制
騰訊地圖的一個(gè)實(shí)時(shí)競價(jià)頁面存在一個(gè)XSS漏洞,由于沒有對請求參數(shù)做嚴(yán)格檢查,通過精心構(gòu)造的請求數(shù)據(jù)導(dǎo)致返回信息中的數(shù)據(jù)可被利用來執(zhí)行js代碼,同時(shí)服務(wù)器沒有對請求來源進(jìn)行檢測,因此可以造成CSRF攻擊。
查看之前抓取到的利用該漏洞進(jìn)行不良信息轉(zhuǎn)發(fā)的頁面,在該頁面開頭嵌入了一個(gè)iframe標(biāo)簽如下:
標(biāo)簽style為隱藏屬性,從而使得該插入頁面不會被用戶發(fā)現(xiàn),插入的頁面鏈接就是構(gòu)造好的url地址。
當(dāng)頁面被加載時(shí),頁面通過這個(gè)url接口向騰訊地圖的RealTime Bidding服務(wù)器發(fā)送一個(gè)請求,服務(wù)器沒有對請求來源進(jìn)行效驗(yàn),直接將請求的數(shù)據(jù)返回,并附帶了一些查詢信息,如下圖所示,其中exploit是構(gòu)造的利用代碼。
當(dāng)exploit = “</script><svg><script>eval(window.name);//”,請求服務(wù)器之后iframe標(biāo)簽里的內(nèi)容就變成下邊的內(nèi)容:
利用代碼中的標(biāo)簽“</script><svg><script>”用于繞過瀏覽器的XSS過濾器,瀏覽器會將這三個(gè)標(biāo)簽忽略掉只留下后邊的內(nèi)容,然后第一個(gè)注釋符號將后邊的內(nèi)容都給注釋掉了,最后的有效內(nèi)容就一句:eval(window.name)。之后eval會將字符串name里邊的內(nèi)容當(dāng)作js代碼執(zhí)行,其執(zhí)行結(jié)果就是在文檔結(jié)尾創(chuàng)建<script></script>標(biāo)簽去加載執(zhí)行js主功能模塊http://conf3.gamexm.net/moo.js。主功能js部分代碼如下所示:
該js代碼做了混淆,其按照OlOlll=”(x)”的方式進(jìn)行替換,我們還原第一部分代碼為:
eval("var l = function(x){return String.fromCharCode(x)}");
該處生成一個(gè)函數(shù)I,其功能是返回?cái)?shù)字對應(yīng)的ascii碼,下邊利用該函數(shù)將一些數(shù)字還原成新的函數(shù),依次類推,最后解出來的功能代碼如下所示:
代碼通過document.cookie獲取用戶的cookie信息,然后從中提取uin值和skey值,通過抓包可以看到,uin值是由o開頭加上QQ號組成,因此相當(dāng)于就獲取了用戶的QQ號,skey是以@開頭的一段字符。之后調(diào)用函數(shù)document.createElement創(chuàng)建了一對script標(biāo)簽來執(zhí)行如下腳本:
其中參數(shù)q是QQ號,k為skey的值,getGTK(str)是為了給skey簽名,這樣可以確保skey是有效的。該腳本把獲取到的QQ號和skey值通過附加到鏈接參數(shù)提交給遠(yuǎn)程服務(wù)器。
利用Skey進(jìn)行敏感操作
Skey 是一次性口令,服務(wù)器為每個(gè)用戶建立一個(gè)skey作為用戶的權(quán)限代碼,服務(wù)器驗(yàn)證該值即可獲取用戶的一些權(quán)限操作,該值會被瀏覽器記錄在cookie信息中,只要用戶不退出登錄就會有效。也就是說如果獲得一個(gè)QQ號碼的Skey代碼,也就相應(yīng)的拿到了對方QQ登陸和管理權(quán)限,通過調(diào)用相應(yīng)的操作接口API,即可不通過用戶密碼實(shí)現(xiàn)對用戶空間,相冊的訪問權(quán)限,同時(shí)也可以發(fā)表說說,刪除留言等一些敏感操作。
下邊進(jìn)行一個(gè)簡單的測試來實(shí)現(xiàn)在QQ空間發(fā)表狀態(tài)。
首先通過抓包獲取到cookie信息中的uin值和skey
然后我使用curl命令通過發(fā)表說說的api向服務(wù)器發(fā)送一個(gè)包,包內(nèi)容如下:
Curl命令執(zhí)行過后,會在我的空間就自動(dòng)發(fā)了一條說說:this is a test
由此想到了之前的天涯病毒營銷系統(tǒng),它是通過服務(wù)端配置中間收信網(wǎng)站后生成客戶端,當(dāng)用戶點(diǎn)擊客戶端樣本后,其客戶端樣本使用WebBrowser控件加載QQ郵箱快速登錄,再利用自動(dòng)填表的方式讓軟件自動(dòng)點(diǎn)擊“快速登錄”按鈕,進(jìn)而可以得到本機(jī)QQ當(dāng)前登錄的Client Key,然后將QQ號和ClientKey提交到遠(yuǎn)程服務(wù)器上,服務(wù)端即可通過該ClientKey進(jìn)行QQ登錄操作,登錄之后具有訪問QQ空間,QQ郵箱,財(cái)付通,修改個(gè)人資料,上傳文件到QQ群共享等操作。這里的ClientKey和skey其功能相同,都是一個(gè)權(quán)限代碼。
修復(fù)方案和建議
1. 針對用戶,不要隨意點(diǎn)擊一些不良網(wǎng)站信息,如果不小心中招,解決方法就是快速退出空間,如果是手機(jī)登錄的話就要退出QQ,重新登陸QQ,這樣會產(chǎn)生新的skey,原來的skey就失效了。如果只是單純的刷新網(wǎng)頁,或者關(guān)掉手機(jī)QQ空間,則不會改變skey。
2. 針對漏洞廠商,要檢測所有接口的輸入?yún)?shù),進(jìn)行嚴(yán)格過濾,防止XSS漏洞的產(chǎn)生;同時(shí)要對數(shù)據(jù)請求來源進(jìn)行判斷,非同源數(shù)據(jù)過濾掉,從而防止CSRF攻擊。