浅谈系列之CSRF攻守之道

浅谈系列之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安全》

下期预告:还没想好,大家想看什么可以私信我。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hobby云说

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值