CSRF基本上是关于攻击者通过cookie在浏览器中的工作方式利用用户的现有会话。根本的问题是,一个cookie与请求一起发送的地方(其起源,即域)的请求到来时,无论从,唯一的事情才是最重要的是它去到。因此,如果有用户登录到应用程序(具有会话cookie),则攻击者可能会试图诱使该用户访问其恶意网站,攻击者可以在该网站上使用用户的凭据(通过完全访问)向应用程序域发出请求。将用户发布到应用程序,或者通过创建ajax请求更巧妙地将其发布。
请注意,这仅在应用程序中的身份验证基于浏览器自动发送的内容(最明显的是会话cookie)的情况下适用,但是例如基本的http身份验证或客户端证书身份验证也可能受到攻击。CSRF也仅适用于更改某些内容(状态或数据)的请求。
有一件重要的事情起作用,浏览器使用相同的原始策略(SOP)。稍微简化一下,这意味着如果从一个域(或更确切地说是源)下载了某些内容,则另一个域将无权访问。
因此,为了防止上述攻击并防止其域上的攻击者使用户向用户登录的应用程序发送不需要的请求,可能有几种不同的策略。
该应用程序生成一个csrf令牌,将其存储在用户会话(服务器端)中,并将其发送给客户端,例如,将其以每种形式写在一个隐藏字段中,或在一个可以从Javascript读取该字段的单个字段中进行编写并添加到请求中。之所以有效,是因为其域上的攻击者无法使用用户会话中的有效令牌创建表单或请求,并且攻击者也无法从应用程序页面读取令牌。当然,攻击者可以尝试下载应用程序表单以获取令牌,但随后他将需要凭据。攻击者需要有效的用户会话和相应的csrf令牌。攻击者可能拥有自己的适当帐户登录,但是无论如何,他仍然可以执行该操作。或者他可能有一个csrf令牌,但是未经身份验证,或较低特权帐户。但是他不能同时拥有两者,这就是重点。
因此,此保护基本上可以验证该请求是否来自合法应用程序实际提供的源,而不是其他人。
请注意,在这种情况下,在cookie中设置令牌是没有意义的,因为cookie会像会话cookie一样自动发送。
另一种策略是生成令牌,并将其设置为客户端的cookie。然后,客户端从cookie中读取令牌,并发送与请求标头相同的令牌。服务器仅比较请求标头和cookie是否包含相同的令牌。之所以可行,是因为攻击者无法从其他来源设置的cookie中读取应用程序令牌(请参阅上面的SOP),但是合法域上的应用程序可以。因此,发送请求的客户端有效地证明了该请求正在合法的应用程序域上运行。这样做的好处是应用程序是无状态的,不需要会话。缺点是它的安全性稍差。
(有趣的是,这种情况下的令牌甚至可以在客户端上生成,它仍然可以工作,因为他自己域上的攻击者无法设置或读取应用程序域cookie,但是由于它是加密操作,因此绝对安全性较低。浏览器。)
如您正确指出的,另一种策略可能是检查引用或请求的来源。它基本上可以工作,但被认为不太安全。尽管双重发布对于许多应用程序来说已足够安全,但引荐/来源检查通常不足够。还有就是它浓厚的历史元素,我认为,不过,它确实是不太安全。
问题有很多方面,有些是我想到的:
因此,由于这些原因,仅检查引用者/来源不是很可靠,因此应该设置另一层保护。
一项新的发明由谷歌在Chrome是SameSite
属性饼干(除了已经存在的和普遍的httpOnly
和secure
cookie的属性)。截至目前,Chrome仅支持此功能,而其他浏览器均不支持。
如上所述,潜在的问题是cookie(即会话cookie)是根据请求目标而不是源发送给服务器的。这意味着,如果Attacker.com将服务器页面发送给用户,并且该页面将浏览器中的发布请求发送到legitapp.com,则legitapp.com设置的任何cookie都会发送到legitapp.com。因此,如果它是登录到legitapp.com并访问Attacker.com的用户,则可以利用现有会话。
这由SameSite cookie属性更改,该属性使原始域与目标域不同时,在这种情况下不发送cookie。可以将其设置为'strict'或'lax',这基本上决定了GET请求的行为,但如果使用其中任何一项,都会阻止CSRF应用于非GET请求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句