浅谈系列之CSRF攻守之道
本文涉及简称:
Session:在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息;
Cookie:储存在用户本地终端上的数据帮助,用户实现记录用户个人信息;
URL:统一资源定位符,程序上用于指定信息位置的表示方法,可以理解为大家口中常说的网址;
Token:在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。
一、CSRF原理回顾
我们简单回顾一下CSRF的概念,王麻子盗用你的身份,用你的名义发送恶意的请求,以实现各种不可见人的操作。(详情见:浅谈系列之跨站请求-伪造)
二、CSRF之攻
简单示例
假如,我的博客www.scwipe.com也存在CSRF漏洞,删除我的某一篇id为39的博客,整个过程分为以下几步:
1、构造一个页面H,假设为https://csrf.scwipe.com/csrf.html,html的内容为
<img src=”https://www.scwipe.com/manage/entry.do?m=delete&id=39” />
2、诱惑我访问https://csrf.scwipe.com/csrf.html这个页面,此时我还没有关闭博客;
3、当我点进去看这个页面的时候,页面H就向我的博客发送了一次GET请求,即<img>标签里src的内容,因为此时我还没有,成功的删除了id=39的这篇文章。
回顾这个过程,王麻子只是诱惑我访问了一个页面,就轻易的用我的身份在我的博客里执行了一次操作。仔细复盘,假如王麻子精心设计一番,是不是可以在其他的地方,执行更可怕的操作,造成更大更坏的影响呢?
百度CSRF Worm漏洞
早在2008年,国内的安全组织80sec公布百度用户中心短消息功能存在CSRF Worm漏洞,发送短消息接口如下,
http://msg.baidu.com/?ct=22&cm=MailSend&tn=bmSubmit&sn=用户账号&co=消息内容
只需要修改sn和co参数,就可以给指定的用户发送指定的消息内容。一次请求只能给一个用户发送请求,并不足以在短时间内兴风作浪,引起大问题的是利用链里的第二点,百度的另一个接口,如下所示,
http://frd.baidu.com/?ct=28&un=用户账号&cm=FriList&tn=bmABCFriList&callback=gotfriends
这个接口可以查询出某个用户的所有好友,将两个接口结合起来,诱导一个百度用户查看王麻子构造的恶意页面后,这个恶意页面将给所有好友发送一条消息,这条消息里又包含一张图片,图片里的地址又指向CSRF页面,这些好友又在不知情的情况下给他们的好友发送一样的信息,如此一来就形成了蠕虫链式爆炸。
三、CSRF之本质
常言道,知己知彼,百战不殆,想要防守CSRF,那必须先了解CSRF的原因。
广义来说,主要原因在于Web的隐式身份验证机制。看起来有Cookies去进行验证,但是并不能保证拿着这个Cookies去请求的是不是用户本身的意愿,就好比古时反贼拿着虎符调兵遣将一般,后果不堪设想。
狭义来讲,主要原因在于重要操作的所有参数都是可以被王麻子猜测到。
四、CSRF之守
又所谓,工欲善其事,必先利其器,想要防住CSRF,那还得是从身份验证下手,常见的有以下几种思路。
验证码
CSRF一般都是在用户毫不知情的情况下发生的,那就可以在发起请求时,通过增加验证码,让用户有所感知。
优:可以强制要求必须经过交互才能完成请求,能有效的把CSRF扼杀在摇篮中;
劣:显然,每次请求都要求交互,大大降低使用体验;
Referer 校验
Referer校验最常见的就是在下载页面我先用referer来判断上一页面是不是自己网站,如果不是,说明有人盗连了你的下载地址。同理,也可以用来校验这个请求是不是来自合法的“源”。
优:在网页和网页的交互之间一般都具有一定的逻辑关系,如此一来每个正常的Referer校验有一定的规律,如果不同于这个规律,就很有可能是CSRF。
劣:服务器并不是任何时候都可以取到Referer,部分用户从隐私角度考虑,限制了Referer的发送,这样一来就失去了校验的意义。
Anti CSRF Token
前文提到CSRF狭义角度的重要参数可预测本质,王麻子只有预测出URL的所有参数和参数值,才能成功的构造一个伪造请求。如果提升重要参数的不可预测性,即把参数加密,或者使用一些随机数,让王麻子无法猜测到参数。但是让本来不需要加密的参数加密,给交互本身带来了很大的麻烦,既然是需要提升不可预测性,新增一个随机数,也一样的能达到目的,即现在人们常用的Token。
优:Token需同时放在表单和Session中,服务器只需要验证表单中的Token和用户的Session/Cookie是否一致,即可判断是否发生CSRF;
劣:CSRF的Token仅仅用于对抗CSRF,如果Token泄露,这个方案就变得无效。在实际应用种,Token一般放在Session或者浏览器的Cookie中,当此站点还存在XSS漏洞等跨域漏洞时(XSS详细见浅谈系列之跨站脚本),XSS是模拟用户的浏览器执行任意的操作,王麻子就可以拿到页面内容里的Token,然后再构造一个合法的请求。
五、写在最后
生命是脆弱的,乔布斯曾说过把每一天当作生命的最后一天来过,你将会活出最有意义的人生。祝此刻看文章的你,一切顺利。
参考文献:《白帽子讲Web安全》
下期预告:还没想好,大家想看什么可以私信我。