关于CSRF的笔记

什么是CSRF攻击?

CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

举例说明CSRF攻击

程序员小C在登录并浏览论坛网站a.com的时候,跳出来一个广告,是关于无恢复期植发,这对于一个程序员来说是多么有诱惑性啊,小C无法控制自己就点了进去。点进去之后,发现页面只有一张加载不出来的图片,小C表示很失望,就关闭了页面,但是不知道这个操作已经实现了CSRF攻击。

实现CSRF攻击的两个必要条件:

  • 用户登录受攻击网站,并返回cookie保存在浏览器端
  • 用户在登录期间访问了第三方网站(攻击者网站),第三方网站冒充用户向受攻击网站发送请求,代替用户执行某些操作

在a.com中,当用户删除某个帖子的时候,会发起请求www.a.com:8002/content/del… ,比如发起请求www.c.com:8002/content/del… 时,就会删除id为87343的帖子。

当小C登录网站a.com的时候,服务器会返回一个表示登录信息的cookie
res.setHeader('Set-Cookie', ['user=22333; expires=Sat, 21 Jul 2018 00:00:00 GMT;']);

攻击者现在构造了一个陷阱页面,页面的内容如下:

<p>CSRF 攻击者准备的网站:</p>

<img src="http://www.a.com:8002/content/delete/87343">

image.png

小C点击陷阱页面,浏览到该图片时,会自动发起一个请求,该请求因为是对a.com的请求,会携带a.com域名下的cookie(包含用户登录信息的cookie),此时攻击者网站就代替小C删除了ID为87343的帖子。

而小C对此一无所知。

通过上述例子,可以看出CSRF攻击是通过cookie实现的,攻击者通过引诱用户访问第三方网站实现的冒用用户实现一些操作的行为,该攻击属于被动型攻击。

CSRF的特点

  • 攻击者只能冒用用户的cookie身份,但是不能获取用户的cookie
  • 攻击者只能去执行一些操作,但是不能获取到操作的结果
  • 攻击的行为一般是发生在第三方网站,受攻击网站无法防止
  • 可以用各种方式实现攻击:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。

CSRF的防范

CSRF的防范可以分成两类:

  1. 阻止不明外域的访问
  • 同源检测

  • Samesite Cookie

  1. 提交时要求附加本域才能获取的信息
  • CSRF Token

  • 验证码

1. 阻止不明外域的访问

同源检测

http请求中有一个字段Referer,它表示该http请求的来源,用户在a.com网站中发起的请求Referer字段都是a.com,而第三方网站发出的请求都不是a.com,禁止一切Referer不为a.com的请求,即可防止CSRF攻击。

if (req.headers.referer !== 'http://www.c.com:8002/') { res.write('csrf 攻击'); return; }

还有一个作用是:防止别人盗取图片链接,在自己的网站中使用。

Samesite Cookie

Samesite是chrome提出的增强网络安全的cookie属性,它用来表明cookie是第一方cookie(同站cookie),即不允许携带第三方cookie。

Samesite 有两个属性值,分别是 Strict 和 Lax:

Strict:不允许携带第三方cookie,即在访问b.com网站时不允许携带a.com域名下的cookie

Lax:只有链接跳转和get表单提交可以携带cookie,post表单提交和跨站的异步请求则不会携带。

None:允许携带第三方cookie

Samesite的默认值从None变成了Lax,在一定程度上增强了网络的安全性,保护了用户的隐私。更多关于该属性的内容请点击

Samesite的默认值变成Lax之后,可以很大程度上减少CSRF的攻击,但是无法避免链接跳转型的CSRF的攻击。将Samesite设置成Strict,可以避免所有的CSRF攻击,但是这样就无法同步子系统下的登录信息,很不方便。

2. 提交时要求附加本域才能获取的信息

这种方式可以起作用是因为攻击者只能利用用户的cookie,却无法取到用户真正的cookie信息,在cookie的基础上附加攻击者无法取到的额外信息(不放在cookie中)就可以避免CSRF攻击。

  • CSRF Token

该方法是在请求的参数中携带一个随机生成的token,然后在服务器端加一个拦截器,如果请求中的token不正确或者没有携带token,就拒绝该请求。

  • 验证码

也是利用攻击者无法取到真正的用户才能获取到的信息来验证用户身份。

验证码被认为是对抗 CSRF 攻击最简洁而有效的防御方法。

就是在用户执行一些重要行为的时候,附加验证码验证用户行为,可以有效对抗CSRF攻击,但是给网站中的所有行为加验证码当然是不可取的,可以适当取用。

CSRF用户自我防范

尽量不要打开可疑链接,一定要打开时,使用不常用的浏览器。

参考文章:

github.com/dwqs/blog/i…
juejin.cn/post/684490…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享