CSRF(Cross-site request forgery 跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
攻击通过在授权用户访问的页面中包含链接或者脚本的 方式工作。例如:一个网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚发布了一个具有Bob银行链接的图片消 息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,并将此链接作为图片tag。如果Bob的银行在cookie中保 存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。
CSRF是一种依赖web浏览器的、被混淆过的代理人攻击(deputy attack)。在上面银行示例中的代理人是Bob的web浏览器,它被混淆后误将Bob的授权直接交给了Alice使用。
下面是CSRF的常见特性:
风险在于那些通过基于受信任的输入form和对特定行为无需授权的已认证的用户来执行某些行为的web应用。已经通过被保存在用户浏览器中的cookie进行认证的用户将在完全无知的情况下发送HTTP请求到那个信任他的站点,进而进行用户不愿做的行为。
使用图片的CSRF攻击常常出现在网络论坛中,因为那里允许用户发布图片而不能使用JavaScript。
国庆期间,@蟋蟀哥哥 再次对 OSChina 实施了 CSRF,详情如下:
@蟋蟀哥哥 要求与我分享这群鹅,我没有理会,于是他故伎重演,为什么说故伎重演呢,因为这事情以前他干过,而后消停了一段时间。
下面进入纯技术分析阶段:
OSC 上有很多操作都是通过一些固定的链接来调用,举两个最具代表意义的链接:
注销: http://www.oschina.net/action/user/logout
顶贴: http://www.oschina.net/action/question/vote?id=xxxx&vote=up
踩贴: http://www.oschina.net/action/question/vote?id=xxxx&vote=down
只要在浏览器访问 http://www.oschina.net/action/user/logout 这个链接,已登录的用户就会退出登录状态;同理,只要访问下面两个链接就会有相应的顶和踩的动作。
国庆期间 @蟋蟀哥哥 主要是针对下面两个链接搞鬼。
搞鬼的手段如下:
1. 利用自己的网站生成一个跳转页面,跳转到上述几个 OSC 的地址
2. 随便到微博或者其他短网站服务上为自己的页面生成一个短链接(此步可选)
3. 在 OSC 上发动弹或者是其他形式的方法贴出前两步生成的链接
可以采用一些吸引人的词汇,例如 苍井空高清无码之类的。
就这么挖了一个坑,因为 @蟋蟀哥哥 在 OSC 很活跃,很多人都晓得,于是也就相信了他发的链接,个个往坑里跳。于是乎就出现了:
1. 怎么点了个链接后就退出登录啊
2. 点了个链接就踩了某个贴或者顶了某个贴
这两天,@蟋蟀哥哥 用这种方法让很多人顶了他发的代码(不过他发的代码是挺好的),然后用同样的方法踩了我发的贴。
以上姑且称为漏洞分析,的确是 OSC 存在的不足,有问题不怕,解决的方法如下:
1. 将以上链接改为只允许通过 POST 方法才能访问
2. 给这些操作链接增加校验参数
请大家将鼠标移到页面顶部的“退出”链接上(不要点),浏览器会在底部显示该链接对应的 URL 地址,形如:
http://www.oschina.net/action/user/logout?session=d51b7f2fbd1429059494&goto_page=http%3A%2F%2Fmy.oschina.net%2Fjavayou
其中这个 session 参数就是我们加入的校验参数,它只跟当前访客用户有关,每个人都不同的。当点击此链接时,我们在服务器端的程序会判断取当前登录用户的资料,并比较资料中的 session 值和通过 URL 传递过来的 session 是否一致,如果一致则退出登录,否则不做任何处理。
而 @蟋蟀哥哥 是无法知晓你们的 session 值,因此他已经无法再伪造一个链接让你们点了就退出登录。
这个 session 值是在用户注册的时候随机生成的一个字符串。
这种方法稍微复杂了些,我们还可以将 session 简化为只传递当前登录用户的id,例如将顶贴链接修改为:
http://www.oschina.net/action/question/vote?id=xxxx&vote=up&user=xxxx
在生成此链接时 xxxx 替换为当前登录用户的 id,于是每个人看到的链接地址都是不同的,蟋蟀就只能生成针对某个人才有效的链接。
不管怎么说,蟋蟀这招挺损的,这种问题在多用户的各种社区中存在应该是比较普遍的,而且关键是要修复这个问题需要修改不少代码,而且涉及的地方也比较多。
而且 OSC 还存在不少此类的问题,看来需要做一次地毯式搜索一次性解决。
@蟋蟀哥哥 我祝你这个国庆过得真TMD的好啊!不过鹅呢,我们家决定留着自己吃