背景
十几年前被列入信安领域十大著名漏洞之一,现在虽然排名下降,但是如果没有做好防范,仍会让人中招。
原理
利用了cookie会在http请求中自动携带的特点。
前提:用户登录了某个网站,该网站将cookie发送到用户客户端,该cookie是登录凭证
攻击:攻击者诱导用户访问自己的钓鱼网站,被攻击者通过在同一个浏览器下点击了攻击者伪造的访问真实后端的接口的一个跨域携带cookie的请求。跨域携带cookie因为被同源策略禁止,因此ajax的方式无法携带cookie,(否则攻击者就不用诱导别人了,直接自己发就可以了)。
- 这个方式通常是一个img 的src,然后src是实际的GET接口地址,这个img可以隐藏,利用了img天然跨域的策略(类似于jsonp)
- 针对post提交,攻击者构造一个隐藏的表单,通过Js自动触发form的提交事件从而触发发起post请求。
这种模拟真实站点发起的网络请求,虽然第三方网站并不会拿到受害网站的cookie,(cookie有作用域),但是可以利用cookie自动携带到http请求头中来骗过浏览器,让浏览器认为这个请求是来自于该网站前端的正常请求,因此就会自动将该源的cookie携带到这个请求上。
和xss攻击的不同
- xss攻击是将攻击脚本直接注入浏览器中,用户一打开受害网站就中招,csrf攻击则需要诱导用户打开自己的网站
如何防御这种攻击
- 服务器端:利用响应头中Reference字段,来判断用户是否来源于原站点。
- 缺点:攻击者仍然可以通过修改ajax来完成对于Reference响应头的修改
- 使用一段来自于服务器的唯一的值来校验。
- 具体做法:服务器每次都返回一个唯一的,不重复的值隐藏到客户端,客户端每一次请求都会携带这个值,当服务器收到这个值就将其销毁。
- 原理:类似于token,做了服务器端校验,且有有效期(一次请求和响应)。利用了攻击者网站无法得知用户浏览器的数据的特点。
- 采用token的方式进行通信
- token的方式进行通信,因为token是一个成熟的RFC提案,所以广泛的被采用在前后端分离的项目中用以保证接口安全。因为是专门干这个的,所以被采用量也特别高。
- 对cookie进行设置
- 让它只能在http协议下发送
- 让它只能在https协议下发送
- 让它只能在源站点发送
总结
CSRF攻击也可以搭配xss攻击来使用,主要是利用了cookie这个不安全的特性的特点,所以建议大家从现在开始,所有项目的服务器和客户端通信尽量不要使用cookie。
前端做存储也尽量不要使用cookie来存储内容,因为cookie大小也小,最重要的是它的提出导致了很多安全漏洞,而我们现在有更好的选择,为什么不采用呢?