CSRF攻击原理与防范策略详解

网络漏洞的威胁日益猖獗,数量持续攀升,这使得保障用户的安全与隐私变得比以往任何时候都更加关键。忽视网络漏洞的修复可能导致声誉严重受损,面临监管机构巨额罚款,更会彻底失去用户的信任。无论是网站还是网络应用程序,都极易遭受恶意软件、垃圾邮件等攻击的侵袭,而本文将重点剖析其中一种攻击媒介——跨站请求伪造(CSRF)攻击。CSRF攻击之所以令人担忧,在于其能够在用户毫无察觉的情况下发动。对于开发人员或网站管理者而言,这类攻击也极难被察觉,因为恶意请求与正常请求在外观上几乎毫无差异。本文将深入探讨CSRF攻击的本质、运作机制以及应对策略。

什么是CSRF攻击?

跨站请求伪造攻击,简称CSRF攻击,是一种通过发送恶意请求,在用户不知情的情况下欺骗已认证用户,使其执行非预期操作的攻击方式。这种攻击的核心在于改变状态,攻击者通常不会收到相应的回应。

CSRF攻击是如何工作的?

在大多数情况下,CSRF攻击涉及发送改变状态的请求,而攻击者并不期望获得任何反馈。这类请求的例子包括删除记录、修改密码、购买产品或发送消息等。这些操作都可能在不经意间发生,而用户对此毫无察觉。恶意攻击者往往利用社会工程学手段,通过聊天或电子邮件向缺乏警惕的用户发送看似无害的链接。当用户点击该链接时,攻击者预设的命令便会被执行。例如,点击链接可能导致用户账户中的资金被转移,或者更改用户的电子邮件地址,使其无法恢复账户访问权限。

CSRF攻击的关键步骤在于,让已认证的用户在登录时发起改变状态的请求。通过CSRF攻击,攻击者的目的是让用户在不知情的情况下向网站或网络应用程序提交包含恶意数据的网络请求,这些数据可能包括cookies、URL参数等。要使CSRF攻击成功,必须满足以下条件:

1. 经过验证的用户必须登录到一个使用cookies进行会话管理的网络应用程序。
2. 攻击者必须创建一个改变状态的伪造请求。
3. 由目标服务器处理的真正请求不应包含不可预测的参数,例如,在启动状态改变请求之前,请求不应期望有一个密码作为验证参数。

完成CSRF攻击的常见方法是在具有薄弱的SameSite cookie策略的应用程序中使用cookies。网络浏览器会自动且通常匿名地包含cookies,这些cookies在用户向某个域发出任何网络请求时都会被保存。SameSite cookie策略定义了浏览器在跨站浏览情况下如何处理cookies。如果设置为严格,cookie就不会在跨站浏览时共享,从而有效防止CSRF攻击。如果设置为无,浏览器会在所有跨站上下文中附加cookie,这使得应用程序容易受到CSRF攻击。当用户在不知情的情况下通过网络浏览器提交恶意请求时,保存的cookie会使该请求在服务器看来是合法的。服务器随后会根据该请求改变用户的账户、会话状态或返回所请求的数据。

让我们深入探讨CSRF攻击的两个典型例子:GET请求和POST请求。

GET请求的CSRF

以一个金融银行网络应用程序为例,攻击者利用了GET请求和超链接传递的特性。假设转账的GET请求如下:

GET https://xymbank.com/online/transfer?amount=1000&accountNumber=547895 HTTP/1.1

在这个真实请求中,用户要求将1000美元转账到账户号码为547895的账户中,作为购买产品的付款。尽管这个请求明确、简单且实用,但它使账户持有人暴露在CSRF攻击之下。这是因为该请求不依赖于攻击者可能不知道的细节。因此,攻击者只需修改请求的参数(金额和账户号码),就能创建一个可执行的伪造请求。恶意请求对银行的任何用户都有效,只要他们正在进行cookie管理会话。

以下是伪造的向黑客账户(账户号码为654585)转账500美元的请求。请注意,以下示例是CSRF攻击中涉及的步骤的高度简化版本,仅用于解释:

GET https://xymbank.com/online/transfer?amount=500&accountNumber=654585 HTTP/1.1

攻击者必须找到一种方法,诱骗用户在登录在线银行应用程序时发送此请求。实现这一点的一种方法是创建一个无害的超链接,吸引用户点击。链接可能如下所示:

CSRF攻击原理与防范策略详解

Click here to get more information.

如果攻击者获得了目标的正确电子邮件地址,他们可以通过电子邮件将此链接发送给许多银行客户。那些在登录时点击链接的人将触发请求,导致从登录的账户向攻击者转账500美元。

POST请求的CSRF

让我们看看,如果同一个金融机构只接受POST请求,他们会经历怎样的CSRF攻击。在这种情况下,之前使用的超链接传递方法将不再适用。因此,一个成功的CSRF攻击需要攻击者创建一个HTML表单。为购买的产品发送1000美元的真正请求如下:

POST /online/transfer HTTP/1.1
Host: xymbank.com
Content-Type: application/x-www-form-urlencoded
Cookie: session=FRyhityeQkAPzeQ5gHgTvlyxHJYhg
amount=1000
account=547895

这个POST请求需要一个cookie来确定用户的身份,以及他们希望发送的金额和账户。攻击者可以修改这个请求来进行CSRF攻击。攻击者只需在伪造的请求中添加一个真实的cookie,就能使服务器处理传输。他们可以通过创建一个看似无害的超链接,将用户带到一个触发网页,该网页已预设了金额和账户参数。一旦认证的用户访问该页面,浏览器在将请求转发给服务器之前会添加会话cookie。然后服务器将500美元转发到黑客的账户。

减轻CSRF攻击的3种方法

有多种方法可以防止和显著减轻对网站或网络应用的潜在CSRF攻击,包括:

1. 使用CSRF令牌
2. 利用referrer标头
3. 选择注重安全的托管解决方案

如何使用CSRF令牌防止CSRF攻击

一个CSRF安全的网站会给每个会话分配一个唯一的令牌,并在服务器端和客户端浏览器之间共享它。每当浏览器发送一个敏感请求时,服务器都会检查请求是否包含指定的CSRF令牌。如果令牌不正确,服务器将拒绝该请求。出于安全考虑,CSRF令牌不会存储在客户端浏览器的会话cookies中。

CSRF令牌的潜在漏洞

尽管CSRF令牌是一种有效的安全措施,但这种方法并非绝对安全。伴随CSRF令牌的一些漏洞包括:

绕过验证 – 一些应用程序在没有找到令牌的情况下会跳过验证步骤。如果攻击者获得了包含令牌的代码的访问权,他们可以删除该令牌并成功执行CSRF攻击。因此,如果对服务器的有效请求看起来如下:

POST /change_password
POST body: password=pass123&csrf_token=93j9d8eckke20d433

攻击者只需删除令牌,然后像这样发送请求即可执行攻击:

CSRF攻击原理与防范策略详解

POST /change_password
POST body: password=pass123

池式令牌 – 一些应用程序维护一个令牌池来验证用户会话,而不是为每个会话分配一个特定令牌。攻击者只需获得池中的一个令牌,就能冒充网站上的任何用户。攻击者可以使用他们的账户登录到一个应用程序,以获得一个令牌,例如:

[application_url].com?csrf_token=93j9d8eckke20d433

由于令牌是池化的,攻击者可以复制并使用相同的令牌登录到不同的用户账户,因为每个用户都会再次使用它。

CSRFs可以将令牌复制到cookie中 – 一些应用程序会将与令牌相关的参数复制到用户的cookie中。如果攻击者获得了这样的cookie,他们可以轻松地创建另一个cookie,并将其放置在浏览器中,从而执行CSRF攻击。因此,攻击者可以使用他们的账户登录到一个应用程序,并打开cookie文件,看到以下内容:

Csrf_token:93j9d8eckke20d433

然后他们可以使用这些信息创建另一个cookie来完成攻击。

无效的令牌 – 一些应用程序在验证CSRF令牌时不会与用户会话进行匹配。在这种情况下,攻击者可以成功登录到一个会话中,获得与上述类似的CSRF令牌,并使用它来策划对受害者会话的CSRF攻击。

如何利用Referrer Header防止CSRF攻击

另一个防止CSRF攻击的策略是使用referrer标头。在HTTP中,referrer标头表示请求的来源。它们通常被用于分析、优化和记录。你也可以在服务器端启用检查referrer标头,以防止CSRF攻击。服务器会检查请求的来源,并确定请求的目标来源。如果它们匹配,那么该请求是允许的。如果不匹配,服务器将拒绝该请求。使用referrer标头比使用令牌要简单得多,因为它不需要单独的用户识别。

Referrer标头的潜在漏洞

与CSRF令牌一样,referrer标头信息也存在一些重要的漏洞。首先,referrer标头并非强制性的,有些网站在发送请求时不会包含referrer标头。如果CSRF没有处理没有标头信息的请求的策略,攻击者可以使用标头信息的请求来执行状态改变的攻击。此外,随着最近引入的referrer策略,这种方法变得不再有效。这一规范防止了URL泄露给其他域,使用户对referrer标头中的信息有更多的控制。他们可以选择暴露部分referrer头信息,或者通过在HTML页面上添加一个元数据标签来禁用它,如下所示:

“`html

“`

上面的代码为这个页面的所有请求删除了referrer头。这样做使得那些依赖referrer头的应用程序很难防止来自这样一个页面的CSRF攻击。

小结

跨站请求伪造(CSRF)是一种欺骗认证用户,使其无意中发起改变状态请求的攻击。它们的目标是那些无法区分有效和伪造的状态改变请求的应用程序。CSRF攻击只能在那些依赖会话cookie来识别登录用户并具有弱的SameSite cookie策略的应用程序上取得成功。它们还需要一个接受不包含未知参数(如密码)的请求的服务器。黑客可以使用GET或POST来发送恶意攻击。虽然使用CSRF令牌或强制执行referrer header验证可以防止一些CSRF攻击,但这两种措施都有潜在的漏洞,如果使用不当,就会使你的预防措施失去作用。

文章网址:https://www.wpbull.com/jiqiao/15111.html