浅谈CSRF攻击与防御
2016-03-13
引言:CSRF是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。深刻理解CSRF的危害性,对CSRF的防范将会取得事半功倍的效果。
CSRF简介
CSR F(Cross-siterequest forgery),中文名称为跨站请求伪造,也被称为CSRF/XSRF。
CSRF是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。
可以这样理解CSRF:攻击者盗用了用户的身份,以用户的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以用户的名义发送邮件、发消息,盗取用户的账号,添加系统管理员等。
CSRF的形式
用户如有以下行为,将可能受到攻击:登录受信任网站A,并在本地生成Cookie;在不登出A的情况下,访问危险网站B。
但除此之外,依旧不能保证以下情况不会发生:
1.不能保证登录了一个网站后,不再打开一个Tab页面并访问另外的网站。
2.不能保证关闭浏览器后,用户本地的Cookie立刻过期,上次的会话已经结束。(事实上关闭浏览器不能结束一个会话)。
3.有些网站可能是一个存在其他漏洞的可信任的经常被人访问的网站。
CSRF攻击分类
CSRF漏洞一般分为站外和站内两种类型。CSRF站外类型的漏洞本质上就是传统意义上的外部提交数据问题。通常程序员会考虑给一些留言或者评论的表单加上水印以防止SPAM问题,但是有时为了提高用户的体验性,可能没有对一些操作做任何限制,所以攻击者可以事先预测并设置请求的参数,在站外的Web页面里编写脚本伪造文件请求,或者和自动提交的表单一起使用来实现GET、POST请求,当用户在会话状态下点击链接访问站外Web页面,客户端就被强迫发起请求。
CSRF站内类型的漏洞在一定程度上是由于程序员滥用$_REQUEST类变量造成的。在一些敏感的操作中(如修改密码、添加用户等),本来要求用户从表单提交发起POST请求传递参数给程序,但是由于使用了$_REQUEST等变量,程序除支持接收POST请求传递的参数外也支持接收GET请求传递的参数,这样就会为攻击者使用CSRF攻击创造条件。一般如果把预测的请求参数放在站内或者留言的图片链接中,用户浏览了这样的页面就会被强迫发起这些请求。
CSRF攻击是源于Web的隐式身份验证机制。Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。
CSRF漏洞检测
先抓取一个正常请求的数据包,然后去掉referer字段再重新提交,如果还是有效那基本上就存在问题了。当然参数可能含有不能预测的参数(如userid之类),这个时候就看这个不可预测的参数能不能通过其他手段比如Flash拿到,如果能,则还是存在问题。还有就是试着改post为get,因为有些程序是不区分get/post的。
可以用一些专门针对CSRF漏洞进行检测的工具,如 CSRFTester,CSRF Request Builder等。
CSRF的防御
CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。
1.服务端进行CSRF防御
服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
Cookie Hashing(所有表单都包含同一个伪随机值):这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了。这个方法已经可以杜绝99%的CSRF攻击了,还有1%由于用户的Cookie很容易由于网站的XSS漏洞而被盗取,但是一般的攻击者看到有需要算Hash值,基本都会放弃,某些除外,所以如果需要100%的杜绝,这个不是最好的方法。
验证码:这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串。这个方案可以完全解决CSRF,但个人觉得在易用性方面似乎不是太好,还有是验证码图片的使用涉及了一个被称为MHTML的Bug,可能在某些版本的微软IE中受影响。
One-Time Tokens(不同的表单包含一个不同的伪随机值):在实现One-Time Tokens时,需要注意一点:就是“并行会话的兼容”。如果用户在一个站点上同时打开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况:用户只能成功地提交他最后打开的表单,因为所有其他的表单都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。
总结
CSRF攻击作为一种存在已久的攻击方式,在大量的商业网站上都可以找出。对广大系统维护者来说需要深入理解CSRF攻击,并制定最适合当前系统的防御方案,在不损害应用程序性能的前提下提高系统安全性,而对即将开发的网络应用系统来说,深刻理解CSRF的危害性,在设计阶段就考虑到对CSRF的防范将会取得事半功倍的效果。