📜  什么是跨站请求伪造 (CSRF)

📅  最后修改于: 2021-10-22 03:06:16             🧑  作者: Mango

跨站请求伪造 (CSRF)是最严重的漏洞之一,可以通过多种方式利用 – 从在用户不知情的情况下更改用户信息到获得对用户帐户的完全访问权限。

今天几乎每个网站都使用 cookie 来维护用户的会话。由于 HTTP 是一种“无状态”协议,因此没有内置的方法来保持用户对一系列请求的身份验证。就用户体验而言,在每次操作时询问用户的凭据是一个非常糟糕的主意,这就是使用 cookie 的原因。为此目的,Cookie 非常有效,并且如果它们拥有足够的熵、加密强度并通过安全通道(使用 HTTPS)传输,则它们是安全的。

但是,有一个问题,浏览器会在没有检查请求的“来源”的情况下,只要向该网站发出请求,就会向该网站提交 cookie。这就是 CSRF 出现的地方。

攻击者在他的网站上放置了一些代码,向目标网站发出真实的外观请求。浏览器会在请求中添加目标网站的cookies。这将使伪造的请求成为合法请求,并且其操作将成功执行。

攻击面:
CSRF 的攻击面主要是 HTTP 请求,这些请求会导致与受害者相关的某些内容发生更改,例如:姓名、电子邮件地址、网站甚至密码。它有时也用于更改身份验证状态。 (Login CSRF, Logout CSRF) 不太严重,但在某些情况下仍然有问题。

开发:
考虑一个网站 example.com 和攻击者的网站 evil.com。还假设受害者已登录并且他的会话由 cookie 维护。攻击者将:

  1. 找出他需要代表受害者执行什么操作并找出其端点(例如,要更改 target.com 上的密码,会向网站发出包含新密码作为参数的 POST 请求。)
  2. 将 HTML 代码放置在他的网站 evil.com 上,该代码将模拟对 target.com 的合法请求(例如,带有 post 方法的表单和包含新密码的隐藏输入字段)。
  3. 确保通过使用“自动提交”或诱使受害者单击提交按钮来提交表单。

当受害者访问 evil.com 并提交该表单时,受害者的浏览器会向 target.com 请求更改密码。浏览器还会在请求中附加 cookie。服务器将其视为真正的请求并将受害者的密码重置为攻击者提供的值。这样受害者的帐户就会被攻击者接管。

预防:

  • 在用户端:
    用户端预防在浏览体验方面非常低效,可以通过一次只浏览一个标签而不使用“记住我”功能来进行预防。
  • 在服务器端:
    在服务器端实现 CSRF 保护的方法有很多,其中最流行的是使用 CSRF 令牌。 CSRF 令牌是绑定到用户会话但不会自动提交的字符串。网站仅在收到有效的 CSRF 令牌和 cookie 时才能继续,因为攻击者无法知道用户特定的令牌,因此攻击者无法代表用户执行操作。