在安全测试中,发现搜狐微博存在一处可被利用的CSRF漏洞,而且漏洞的严重性在于,它有可能导致蠕虫式攻击——攻击者可以在用户毫不知情的情况下,代其发布微博内容。
问题出在哪里?从接口层面来看,服务端在接收POST和GET请求时,既没有对请求来源(Referer)进行校验,也没有在表单数据中加入有效的token来防止跨站请求伪造。说白了,就是服务器完全信任了任何一个发过来的POST请求,只要能让它执行动作,它就照做。
漏洞验证过程
第一个可以攻击的点是发布微博的接口:https://t.sohu.com/t/twAction.jsp。攻击者可以构造一个自动提交的HTML表单,当用户访问这个页面时,表单会静默提交一条微博内容。

效果图显示,攻击成功后在用户微博时间线中间出现了一条由攻击者指定的内容。

第二个漏洞点与第一个类似,同样是针对微博发布接口:

效果上同样实现了在用户不知情的情况下发布微博。

第三个漏洞则更加敏感——关注操作的接口:https://t.sohu.com/follow/addfollows。攻击者可以构造一个自动关注指定用户的表单,一旦受害者访问该页面,就会在后台悄悄关注攻击者指定的账号。

接口返回信息表明操作成功。

修复方案
要堵上这个漏洞,其实两个步骤就够了:
第一,对POST请求的Referer来源进行严格校验,只允许来自本站域名的请求通过;
第二,在POST表单中加入一个随机生成的token,每次请求时服务端验证token的有效性——这样一来,攻击者无法提前获取token,也就无法构造有效的攻击请求。
这两步组合起来,基本上就能杜绝CSRF攻击的可能性。在类似场景中,这两条原则同样适用,毕竟跨站请求伪造的招式万变不离其宗。
