【网络安全】深入探究CSRF攻击与防范

目录

 

1.0 什么是CSRF攻击?

2.0 CSRF攻击过程

3.0 CSRF防范策略

3.1  验证HTTP请求头中指定字段

3.2 添加校验Token

4.0 小结导图


1.0 什么是CSRF攻击?

       CSRF攻击的全称是跨站请求伪造( cross site request forgery),是一种对网站的恶意利用,尽管听起来跟XSS跨站脚本攻击有点相似,但事实上CSRF与XSS差别很大,XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。你可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。 CRSF能做的事情包括利用你的身份发邮件、发短信、进行交易转账等,甚至盗取你的账号。

2.0 CSRF攻击过程

1. 对比XSS:跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

(XSS详细说明:https://blog.csdn.net/weixin_41950078/article/details/115427888

CSRF的特点:

  • 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
  • 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。
  • 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
  • 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。

CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。

2.完成一次CSRF攻击,必须满足以下两个条件:

  • 用户登录受信任网站,并在本地生成Cookie(图中 步骤2)。
  • 在不登出该受信任网站的情况下,访问危险网站(图中 步骤3)。

这两个条件看似不容易同时满足,但实际情况是用户登录了一个网站后,即便关闭了浏览器,储存在本地的Cookie也未必会立刻过期。

3.0 CSRF防范策略

那我们应该如何防御呢?

CSRF攻击主要有两个特点:

1.  通常发生在第三方域名

2.  CSRF攻击者只是使用而无法获取Cookie等信息

3.1  验证HTTP请求头中指定字段

referer是HTTP请求头,包含请求来源地址。服务器知道正确来源, 验证referer禁止来自第三方网站的请求。我们登陆一个安全受限网站后,在页面上的所有操作其实都是该网站的内部请求,但是攻击者实施CSRF攻击,只能在自己的网站构造请求,该请求的Referer是指向攻击者自己客户端或网站的,所以我们增加一个拦截器过滤Referer就可以屏蔽攻击。

缺点:

  • 有些浏览器允许用户指定没有referer。需要对referer为空时候进行取舍,要不要通过。
  • Referer值会记录访问来源,有些用户认为侵犯自己隐私权,有些用户可能会开启浏览器防止跟踪功能,不提供Referer,导致正常用户请求被拒绝。 
  • Referer是由浏览器提供的,我们无法保证所有浏览器的Referer都不会被篡改。

3.2 添加校验Token

CSRF的另一个特征是,攻击者无法直接窃取到用户的信息(Cookie,Header,网站内容等),仅仅是冒用Cookie中的信息。

而CSRF攻击之所以能够成功,是因为服务器误把攻击者发送的请求当成了用户自己的请求。那么我们可以要求所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击。

我们可以在HTTP请求中加入一个随机产生的Token,并在服务器端建立一个拦截器来验证这个Token。当用户登陆后,Token保存在Session里。在用户发出请求时,该令牌会与其他请求信息一并被发出。在接收用户请求时,如果请求中没有Token或者Token内容不正确,则认为可能是CSRF攻击而拒绝该请求。

CSRF Token的防护策略分为三个步骤:

1.将CSRF Token输出到页面中:服务器需要给这个用户生成一个Token,该Token通过加密算法对数据进行加密。显然在提交时Token不能再放在Cookie中了,否则又会被攻击者冒用。为了安全起见Token最好还是存在服务器的Session中,之后在每次页面加载时,使用JS遍历整个DOM树,对于DOM中所有的a和form标签后加入Token。这样可以解决大部分的请求。

2.页面提交的请求携带这个Token: GET :http://url?csrftoken=tokenvalue。 POST:<input type=”hidden” name=”csrftoken” value=”tokenvalue”/> 这样,就把Token以参数的形式加入请求了。

3.服务器验证Token是否正确:当用户从客户端得到了Token,再次提交给服务器的时候,服务器需要判断Token的有效性。

4.0 小结导图

猜你喜欢

转载自blog.csdn.net/weixin_41950078/article/details/115429677