CSRF攻击与防御

**CSRF:**跨站点请求伪造。简单理解就是黑客利用你的身份去访问正常网站,服务器认为这个请求时合法的,然后黑客就以你的名义发送邮件或者转走你的money。这个网站就存在CSRF漏洞。

攻击原理:

  1. 用户C访问受信任网站A,输入账号密码登录网站A。
  2. 通过验证后,网站A产生cookie信息返回给浏览器,此时用户登录成功,可正常访问A。
  3. 用户在未退出A之前,在同一浏览器中,去访问了网站B。
  4. 网站B接收到用户请求后,返回一段攻击性代码,并发出一个请求要求访问网站A。
  5. 浏览器在接受了这些攻击性代码后,根据网站C的请求,在用户不知情的情况下携带了cookie信息,向网站A发起请求。网站A并不知道该请求其实是B发起的,所以会根据用户C的cookie信息以C的权限处理该请求,导致来自B的恶意代码被执行。

CSRF漏洞检测:
最简单的就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么就有CSRF漏洞。
常见的检测工具:CSRFTester,CSRF Request Builder
CSRFTester检测的原理:首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

防御CSRF攻击:

1、验证HTTP Referer字段
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的 Referer 值就会是转账按钮所在的页面的 URL,通常是以 bank.example 域名开头的地址。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

优点:简单易行,不需要改变当前系统的已有的代码逻辑。
缺点:对于某些浏览器,比如IE6或FF2,目前有一些方法可以篡改Referer值。

2、在请求地址中添加token并验证
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。(黑客利用用户的cookie去网站发请求时,并没有携带token,所以会被拦截掉。)

这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。
对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。
而对于 POST 请求来说,要在 form 的最后加上隐藏域 ,这样就把 token 以参数的形式加入请求了。
但是,在一个网站中,可以接受请求的地方非常多,要对于每一个请求都加上 token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。

该方法还有一个缺点是难以保证 token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。
为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到地址,从而得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。

3、在HTTP头中自定义属性并验证
这种就是把token放到HTTP自定义的属性里,通过XMLHttpRequest这个类,一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。这就解决了上一个在所有请求中添加token的不便,同时,通过XMLHttpRequest请求的地址不会被记录到浏览器的地址栏,这样就不用担心token会透过Referer泄露到其他网站。
缺点:这个类的局限性很大,因为该类请求到的页面不能被浏览器记录下,所以进行前进,后退,刷新等操作,都不会返回之前的页面状态,给用户带来不便。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值