你所不知道的CSRF攻击
CSRF到底是什么?
跨站请求伪造(Cross-site request forgery):是一种挟制用户在当前已登陆的Web应用程序上执行非本意操作的网络攻击方法,也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF。
那么请说人话:CSRF是一种网络攻击方式,可以在用户毫不知情的情况下以用户的名义伪造请求发送给受攻击站点(指的是我们日常通过账号密码等授权登陆的网站),从而使用户在不知情或非本意的情况下执行权限内的操作,比如以你的名义发送邮件、发消息、盗取你的账号、添加系统管理员,甚至于购买商品、虚拟货币转账等等,具有很大的危害性。
由于浏览器曾今被认证过,所以被访问的网站会认为是真正的用户操作而去执行。这就利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
CSRF攻击原理
CSRF攻击原理如下图所示。其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户,同时User C也是倒霉蛋受害者。
从上图可以看出,要完成一次CSRF攻击,倒霉蛋受害者必须依次完成以下几个步骤:
1. 用户C打开浏览器,访问受信任网站A,输入用户名密码请求登陆网站A;
2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
这时候你如果问我什么是Cookie,麻溜的去google好吗!我知道我这样说你一定会打我,那么我还是告诉你吧 :)
什么是Cookie:是浏览器访问服务器后,服务器传给浏览器的一段数据,用来记录某些当页面关闭或者刷新后仍然需要记录的信息。浏览器会将这段数据保存,不会轻易删除。此后每次浏览器访问该服务器,都必须带上这段数据。Cookie一般有两个作用:
- 识别用户身份
- 记录历史
3. 用户未退出网站A之前,在同意浏览器中,打开一个Tab页访问网站B;
4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方网站A;
5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发送请求。网站A并不知道该请求实际上是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
你千万不要问我是不是如果不登录A网站或者不在登录A网站的同时去访问B网站就不会受到CSRF攻击了。你当人坏蛋傻?
首先,你不能保证你登录了一个网站之后,不在打开另一个Tab页面并访问其他网站。
其次,你不能保证你关闭浏览器之后,你本地的Cookie立刻过期,你上次的会话已经结束。
最后,上述中所谓的攻击网站,很可能就是一个钓鱼网站或者黄色网站。
如果你拍着胸脯保证,那么请你赶紧的Alt+f4关闭这个窗口 :)
采取什么样的防范措施?
来来来,我们先从根源出发,anti-csrf-token方案(校验token)
- 服务端在收到路由请求时,生成一个随机数,在渲染请求页面是把随机数埋入页面(一般埋入form表单内)。
- 服务端设置setCookie,把该随机数作为cookie或者session种入用户浏览器。
- 当用户发送GET或POST请求时带上_csrf_token参数(对于form表单直接提交即可,因为会自动把当前表单内所有的input提交给后台,包括_csrf_token)。
- 后台在接受到请求后解析请求的cookie获取_csrfz-token的值,然后和用户请求提交的_csrf_token做个比较,如果相等表示请求合法。
建议:少用GET方法。假如攻击者在我们的网站上传了一张图片,用户在加载图片时实际上是向攻击者的服务器发送了请求,这个请求会带有referer表示当前图片所在页面的URL。而如果使用GET方式接口的话攻击者会轻易的获取_csrf_token,短时间可以使用这个token来操作其他GET接口。
结语:
请大家养成良好上网习惯,不要轻易点击链接或图片,及时退出长时间不使用的已登录账户,安装防护软件并及时更新:)