3.CSRF攻击

CSRF攻击

什么是CSRF攻击

CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”,是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF 攻击就是黑客利用了用户的登录状态,并通过第三方的站点来做一些坏事。

攻击方式

1、自动发起 Get 请求

<!DOCTYPE html>
<html>
  <body>
    <h1>黑客的站点:CSRF攻击演示</h1>
    <img src="https://xxx.com?user=hacker&number=100">
  </body>
</html>

比如你点了陌生的链接,被隐藏在img标签 ,你以为是张图片,结果它向xxx.com发送了一个get请求,并且携带了参数,它可能利用了你在xxx.com登陆过,发送请求的时候携带了xxx.com的cookie,它可能就是一个什么转账汇款啥的恶意操作

2、自动发起 POST 请求

<!DOCTYPE html>
<html>
<body>
  <h1>黑客的站点:CSRF攻击演示</h1>
  <form id='hacker-form' action="https://xxx.com/转账" method=POST>
    <input type="hidden" name="user" value="hacker" />
    <input type="hidden" name="number" value="100" />
  </form>
  <script> document.getElementById('hacker-form').submit(); </script>
</body>
</html>

这里写上中文转账就是想大致表达意思,可能隐藏了表单,同样也会携带相应的用户 cookie 信息发送了POST请求,进行恶意的操作

3. 引诱用户点击链接发送GET请求

<div>
  <img width=150 src=http://images.xuejuzi.cn/1612/1_161230185104_1.jpg> </img> </div> <div>
  <a href="https://xxx.com/转账啥的?user=hacker&number=100" taget="_blank">
    点击下载美女照片
  </a>
</div>

这段黑客站点代码,页面上放了一张美女图片,下面放了图片下载地址,而这个下载地址实际上是黑客用来转账的接口,一旦用户点击了这个链接,就发送了请求。

和XSS的区别

和 XSS 不同的是,CSRF 攻击不需要将恶意代码注入用户的页面,仅仅是利用服务器的漏洞和用户的登录状态来实施攻击。

攻击发生的条件

发生的必要条件:

  • 第一个,目标站点一定要有 CSRF 漏洞;
  • 第二个,用户要登录过目标站点,并且在浏览器上保持有该站点的登录状态;
  • 第三个,需要用户打开一个第三方站点,可以是黑客的站点,也可以是一些论坛。

如何防止CSRF攻击

CSRF攻击重点是携带用户登陆网站的cookie,利用cookie模拟用户向服务器发送请求

所以我们用cookie中一个重要字段:SameSite

在HTTP响应头的set-cookie中加上

比如

set-cookie: c=abcd;SameSite=none

看看SameSite的三个取值:

  • Strict

如果 SameSite 的值是 Strict,那么浏览器会完全禁止第三方 Cookie。

比如你从A页面中访问 B 的资源,而 B 的某些 Cookie 设置了 SameSite = Strict 的话,那么这些 Cookie 是不会被发送到 B 的服务器上的。只有你从 B 的站点去请求 B 的资源时,才会带上这些 Cookie。

  • Lax

相对宽松,在第三方站点只有 **get 方法提交表单 ** 和 a 标签发送 get 请求 两种会带上cookie,在第三方站点中使用 Post 方法,或者通过 img、iframe 等标签加载的 URL,这些场景都不会携带 Cookie

  • None

默认模式,请求会自动携带上 Cookie。

2.验证请求的来源站点

服务器来验证请求来源

服务器的策略是优先判断 Origin,如果请求头中没有包含 Origin 属性,再根据实际情况判断是否使用 Referer 值

Origin 属性只包含了域名信息,并没有包含具体的 URL 路径,这是 Origin 和 Referer 的一个主要区别。在这里需要补充一点,Origin 的值之所以不包含详细路径信息,是有些站点因为安全考虑,不想把源站点的详细路径暴露给服务器

但是这两个请求头信息都可以伪造

3.CSRF Token

第一步,在浏览器向服务器发起请求时,服务器生成一个 CSRF Token。CSRF Token 其实就是服务器生成的字符串,然后我们前端保存在前端中。

第二步,在一些重要的请求 服务器要验证CSRF Token

总结

CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”,是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站请求

攻击:

  • 自动 GET 请求
  • 自动 POST 请求
  • 诱导点击发送 GET 请求

防范:

  • cookie的 SameSite 属性
  • 服务器验证请求头的Origin和Referer
  • CSRF Token
上一篇:Django中使用Ajax及避开CSRF 验证的方式详解


下一篇:bzoj4152[AMPPZ2014]The Captain 最短路