CSRF 攻击【译文】

352 阅读3分钟
原文链接:www.synopsys.com/glossary/wh…

一、定义

Cross-Site Request Forgery简称 CSRF,翻译过来是“跨站点请求伪造”。利用 Web 应用程序对经过身份验证的用户的信任,强制用户向当前对其进行身份验证的 Web 应用程序提交请求

二、CSRF 干了什么?

攻击者进行 CSRF 攻击的目的是迫使用户提交状态更改请求。示例包括:

  • 提交或删除记录
  • 提交交易
  • 购买产品
  • 更改密码
  • 发送消息

举个例子,假设 Bob 在 samplebank.com 上有一个网上银行账户。他定期访问该站点与他的朋友 Alice 进行交易。Bob 不知道 samplebank.com 容易受到 CSRF 攻击。同时,攻击者打算利用此漏洞从 Bob 的帐户中转移 5000 美元。成功发起攻击的条件如下:

  1. 利用 URL 建立一个漏洞。
  2. 然后引诱 Bob 点击有漏洞的 URL。
  3. Bob 正在该网站 samplebank.com 上进行活动会话。

假设网上银行应用程序是使用 GET 方法构建的,用于提交转账请求。因此,Bob 向 Alice(帐号为 213367)转账 500 美元的请求可能如下所示:

GET samplebank.com/onlinebanki… HTTP/1.1

根据成功发起 CSRF 攻击的第一个要求,攻击者必须制作恶意 URL 以将 5, 000 美元转移到帐户 425654:

samplebank.com/onlinebanki…

攻击者想要欺骗 Bob 加载恶意 URL,有很多种方式,例如:在表单中包含恶意 HTML 图像元素,在用户登录的经常访问的页面上放置恶意 URL,或通过电子邮件发送恶意 URL。

下面是一个伪装 URL 的示例:

<img src=  https://samplebank.com/onlinebanking/transfer?amount=5000&accountNumber=425654” width=“0” height= “0”>

想象在攻击者制作的发送给 Bob 的电子邮件中包含 img 标签的场景,收到后,无需人工干预,Bob 的浏览器应用程序会自动打开此 URL。结果,没有经过 Bob 的允许,恶意请求被发送到网上银行应用程序。如果 Bob 与 samplebank.com 有一个活动会话,应用程序会将其视为来自 Bob 的授权金额转账请求。然后它将金额转移到攻击者指定的帐户。

要执行成功的 CSRF 攻击,有一些限制:

  • 只有当用户与易受攻击的应用程序处于活动会话中时,攻击才会成功。
  • 攻击者必须找到有效的 URL 才能恶意制作,URL 可以更改目标应用程序的状态。
  • 攻击者还需要为 URL 参数找到正确的值。否则,目标应用程序可能会拒绝恶意请求。

三、应用程序如何防止 CSRF (跨站点请求伪造)攻击?

为了击败 CSRF 攻击,应用程序需要一种方法来确定 HTTP 请求是否是通过应用程序的用户界面合法生成的。最好的办法是通过 CSRF token 。每个用户会话中的 token 都是唯一的,并且为很长的随机值,让其他人很难猜到。

应用程序应为每个用户会话分配一个唯一的 CSRF token。这些标记被插入到与关键服务器端操作相关的 HTML 表单的隐藏参数中。然后将它们发送到客户端浏览器。

应用程序团队有责任确定哪些服务器端操作本质上是敏感的。CSRF token 必须是 HTML 表单的一部分,而不是存储在会话 cookie 中。添加不可预测参数的最简单方法是使用安全散列函数(例如 SHA - 2)来散列用户的会话 ID。为确保随机性,token 必须由密码安全的随机数生成器生成。

每当用户调用这些关键操作时,浏览器生成的请求必须包含相关的 CSRF token。服务器用这个 token 来验证用户请求的合法性。如果 CSRF token 不匹配,服务器将拒绝该请求。

总结:防止 CSRF 攻击,需要为每个会话生成唯一的 session ID