suukii / fe-interview

前端面试题整理
5 stars 0 forks source link

能不能说说 CSRF 攻击 #27

Open suukii opened 4 years ago

suukii commented 4 years ago

概念

Cross-site request foregery,跨站请求攻击,指的是攻击方诱导用户进入第三方网站(可能是攻击方自己的网站,也可能是其他网站),在第三方网站中,利用用户在被攻击网站的登录状态,向被攻击网站发起跨站请求,绕过被攻击网站后台的用户验证,达到冒充用户对被攻击网站进行某项操作的目的。

CSRF 的攻击原理是诱导用户跳转到新的页面,利用服务器的验证漏洞和用户之前的登录状态来冒充用户进行操作。

CSRF 一般流程

suukii commented 4 years ago

常见的 CSRF 攻击类型

在第三方网站中,攻击方是如何发起跨站请求的呢?一般有以下几种常见的方式:

自动发 GET 请求

一般会利用 img 标签,

<img src="http://bank.example/withdraw?amount=10000&for=hacker" />

用户打开带有这个 img 元素的网站时,浏览器就会自动发起一个 HTTP 请求 http://bank.example/withdraw?amount=10000&for=hacker,如果用户在 bank.example 已经登录过了,这个请求就会带上 bank.example 的 Cookie。

如果服务器没有相应的验证机制,它会认为这是一个正常用户的请求,从而执行其中指定的操作,攻击者达成攻击目的。

自动发 POST 请求

通常是以一个自动提交的表单的形式。攻击方可能自己填写了一个表单,再加上一段自动提交表单的脚本:

<form id='hacker-form' action="https://xxx.com/info" method="POST">
  <input type="hidden" name="user" value="hhh" />
  <input type="hidden" name="count" value="100" />
</form>
<script>document.getElementById('hacker-form').submit();</script>

用户访问该页面时,表单就会自动提交,相当于冒充用户提交了一次 POST 请求,这个请求也会带上被攻击网站的 Cookie。

链接类型 GET 请求

攻击方可能会把请求放在 <a> 标签中,然后利用夸张的文字诱导用户点击,用户点击后,就与 自动发 GET 请求 同理了。

suukii commented 4 years ago

如何防御 CSRF 攻击

利用 Cookie 的 Same-Site 属性

Same-Site 属性有以下 3 个值:

如果攻击者的 CSRF 请求没有携带相应的 Cookie,就会被服务器拒掉了。

验证来源站点

利用 RefererOrigin 请求头字段确定请求的来源域名:

  • Origin 字段包含请求的域名(不包含 path 和 query)
  • Referer 字段包含具体的 URL

如果服务器发现了来自非可信赖域名的请求,就可以不予响应,但是,这两个字段在某些情况下可能不存在,而且还可以伪造,并不是十分可靠。

CSRF Token

  • 用户浏览器向服务器请求页面时,浏览器会生成一个 CSRF Token 字符串植入到页面中。
  • 之后浏览器再发送请求时,需要带上这个 CSRF Token。
  • 服务器会验证请求中携带的 CSRF Token,如果没有通过验证,就不予响应。
  • 通常攻击者无法拿到这个 CSRF Token,所以伪造请求会被服务器拒绝。