什么是跨站请求伪造CSRF | 保护的示例和方法

发布时间:2025-03-09 09:46:14   来源:网络 关键词:跨站请求伪造CSRF

那些希望全面保护资源免受网络漏洞攻击的组织必须更新其知识并熟悉所有现有类型。CSRF 是本文中大量讨论的内容。

什么是 CSRF 攻击?

XSS的对应物,是与网络漏洞有关的多种攻击之一,其中授权用户被迫在已验证其身份的网站上执行一些不可接受或未经授权的操作。通过使用双因素登录、密码和其他方式,网站可以验证最终用户的身份并允许他们访问网站/应用程序的服务/设施。这样,最终用户和网站之间就建立了信任。

威胁行为者利用此信任因素通过 CSRF 攻击获取对网站的未经授权的访问。CSRF 有许多同义词,包括敌对链接、Sea Surf、Session Riding、一键攻击等。

以下是值得关注的 CSRF 攻击区域标记 -

  • 在网站/网络应用程序上执行此操作很容易跳过验证操作是否得到用户同意。
  • XSS 涉及网站侵犯用户隐私,而 CSRF 则涉及用户利用网站的情况。必须收集有关 XSS 和 CSRF 的更多信息,才能在更深层次上区分这些漏洞。
  • 它对使用 JavaScript 或任何其他类型的代码来成功执行不感兴趣。
  • 单页应用程序更有可能成为 CSRF 的受害者,因为它们将 CSRF 令牌存储为 cookie,这是威胁行为者的最爱。

什么是 CSRF 令牌?

CSRF 令牌是随机创建的安全且唯一的会话令牌,对于尽可能降低 CSRF 攻击的发生概率至关重要。挑战令牌和同步令牌是最常见的例子。

CSRF 令牌必须集成在用于服务器端功能并与最终用户浏览器共享的 HTML 表单的隐藏/不可见组件中。其体积必须非常大,这样威胁行为者才无法理解。

支持 CSRF 的网站和 Web 应用程序将为单个 HTTP 请求或登录会话生成专属 CSRF 令牌。

正确验证 CSRF 令牌将阻止 CSRF 攻击。但是,某些因素会影响 CSRF 令牌验证。

验证在很大程度上受请求类型的影响。例如,一些网站会完全验证 HTTP POST 请求,而拒绝 GET 请求。

令牌的可用性也会影响验证。例如,如果某个时间点没有令牌,则请求将被忽略。

CSRF 如何工作?

进行 CSRF 攻击需要满足 3 个条件。

  1. 网站上发生的特权操作,例如导致改变用户中心数据的操作。
  2. 目标站点在用户身份验证期间必须使用至少 1 个 HTTP 请求,同时启用会话 cookie。
  3. 用户请求的任何部分对于攻击者来说都是隐藏的或不可读的。

一旦满足所有这三个条件,就可以执行 CSRF 攻击了。

在诱骗用户发起伪造请求方面,CSRF 的手段多种多样。在了解这些方式之前,让我们先通过一个示例来了解如何创建恶意请求。

例子

假设 John 需要通过 money.com 网站向 Jena 转账 500 美元。

现在,money.com 网站没有强大的 CSRF 保护措施,威胁攻击者 Leo 利用这个机会接收 John 试图转移的资金。

为了实现这一目标,攻击者 Leo 将采取以下行动:

  • 创建可操纵的脚本或 URL
  • 通过社会工程学引诱 John 使用更正后的 URL/脚本

现在,让我们了解不同场景下 CSRF 攻击的工作原理:

当网站接受 GET 请求时

在这种情况下,约翰提出的转账请求将如下所示:

获取 http ://money.com/transfer.do?acct=JENA&amount=500 HTTP/1.1

威胁者 Leo 将通过 John 利用这一点。首先,他将创建一个可操纵的 URL,将 John 发起的资金转账直接转到他的银行账户。

他将访问 John 的转账命令,并将 Jena 的名字替换为自己的。他还可以更改转账金额。利用的命令如下所示:

http://money.com/transfer.do?acct=LEO&amount=5000

在被利用的 URL 中,Leo 将原来的转账金额替换为 5000 美元。

在这里,诸如包含 HTML 内容的电子邮件或将被滥用的 URL 放在已验证页面前面之类的社会工程手段会欺骗 John 加载被利用的 URL。由于更改后的页面/URL/脚本与原始 URL/脚本/页面非常相似,因此很容易被欺骗。

当网站接受 POST 请求时

如果网站仅获得 POST 请求,那么 John 的命令将如下所示:

发布 http://money.com/transfer.do HTTP/1.1acct=JENA&amount=500

现在,此类请求通过 FORM 标签传递:

<form action="http://money.com/transfer.do" method="POST">
<input type="hidden" name="acct" value="Leo"/>
<input type="hidden" name="amount" value="5000"/><input type="submit" value="查看我的图片"/>
</form>

 

使用FORM标签强制点击提交按钮完成请求提交。或者,可以使用JavaScript自动呈现请求。

当网站使用其他 HTTP 方法时

除了GET和POST,其他HTTP请求模式如PUT和DELETE也是经常使用的。基于PUT的HTTP请求会在被操纵的页面/URL中包含JavaScript。由于我们现在使用的高级浏览器都强制执行同源策略,因此通常不会看到针对PUT和DELETE请求的CSRF攻击。

如何检测跨站请求伪造?

无论漏洞类型如何,早期检测都是控制损害的关键。

有助于及时检测 CSRF 的最实用的标记是:

  • 允许通过 GET 请求进行会话管理的网站。第三方可以轻松访问此类网站。因此,它们更容易受到 CSRF 攻击。确保您的网站不在其中。
  • Web 代理在 CSRF 检测中非常有用。由于它跟踪 HTTP 请求从头到尾的旅程,因此您可以重放请求,而无需启动与应用程序的客户端界面的交互。

如何预防CSRF攻击?

如果不立即处理,CSRF 攻击可能会导致数据威胁、资金窃取、登录详细信息更改,甚至失去对关键应用程序的控制。因此,除了早期检测外,还应部署可行的 CSRF 预防策略。

基于 CSRF 令牌的预防

防御 CSRF 攻击的主要方法是确定 HTTP 请求是否合法创建,即仅使用应用程序的用户界面。网站所有者或管理员可以使用 CSRF 令牌。

应用程序安全团队应该找出服务器端功能中易受攻击的部分,并在该易受攻击的操作部分的 HTML 表单中引入 CSRF 令牌。

确保预期的 HTML 表单不是会话 cookie 的组成部分。此外,使用加密保护的随机数生成器来创建令牌。

利用 SameSite Cookie 属性

它通常用于大力支持 CSRF 攻击预防方法。它与 Secure Flag 和 HTTPOnly 有很多共同之处,它使浏览器能够同时处理 cookie 以及跨站点请求。

其可接受的值如下:

  1. “严格”值将阻止通过浏览传输 cookie。
  2. “ Lax”是默认值,当 Web 解决方案希望允许由外部链接组成的用户访问请求时,它可以维护其安全性。目前,大多数浏览器都具有此功能,作为在使用 CSRF 令牌的同时对 CSRF 攻击的额外防线。
  3. 如果您希望使用 cookie 来访问跨站点 URL,则使用值“none” 。

利用用户交互进行 CSRF 保护

这是实施 CSRF 预防策略的最简单方法。它涉及使用重新身份验证、一次性令牌创建和CAPTCHA部署。所有这些技术都增加了用户交互,减少了威胁攻击的入侵空间。此外,它还增强了用户体验。

控制登录 CSRF

许多开发人员未能理解 CSRF 可能存在于登录表单中并造成损害的事实。这就是为什么它被大多数人忽略的原因。可以通过为每个用户生成预会话并在这些会话中引入 CSRF 令牌来防止 CSRF 影响登录表单。它使早期身份验证变得安全。但是,请确保在启动实际会话后应销毁此预会话。忽略这一点将引发会话固定攻击。

双重提交 cookies

此方法通常用作 CSRF 防御策略。它涉及将类似的令牌值存储在 cookie 中,而不是服务器会话中。这样做会鼓励类似 cookie 的 CSRF 令牌转发,同时将隐藏字段/值与其关联。收到请求后,服务器需要确定存储在隐藏字段和 cookie 中的 CSRF 值是否匹配。

如何防止 Javascript 中的 CSRF 攻击?

希望防止 JavaScript 遭受 CSRF 攻击的安全专家可以使用自定义请求标头,因为它依靠 SOP 或同源策略方法来保护应用程序的 JavaScript 部分。此标头只能在 JavaScript 的来源上暗示。但是,浏览器默认不允许 JavaScript 创建自定义标头。

这种方法带来双重好处,例如不需要在 UI 中做任何更改,也不需要呈现服务器端状态。

是否有必要保护 API 免受 CSRF 攻击?

CRSF 袭击事件不断增加,没有例外。

随着 API 的使用量不断增加,并且对于 Web 和移动应用程序开发至关重要,它已成为 CSRF 攻击的主要目标。当 API 成为 CSRF 攻击的受害者时,整个数字解决方案或应用程序都会被置于堆栈中。

为了实现强大的API 安全性,保护 API 免受 CSRF 攻击至关重要。针对 API 的 CSRF 攻击可以轻松预防。

应该限制对内容类型应用程序或 JSON 发出的 API 请求。这样,CSRF 攻击的可能性就会降低。通过内容类型发出的 API 请求更安全。

API 访问令牌应显示在请求标头中。此外,API 应忽略基于 cookie 的 CSRF 令牌。

基于 JavaScript 的单页应用程序应仅使用 Cookie 进行存储。此类应用程序还应将身份验证令牌作为标头传输到 API,并且不应接受缺少标头的请求。

 

猜你喜欢
最新文章