状态参数可在基于OAuth2的身份验证中阻止哪种CSRF攻击?

我正在使用Google OAuth2 API进行身份验证部分。
我使用的是“服务器”流,而不是“隐式”流。

在实施步骤1以获取code准则时,建议使用state参数以确保最后,服务提供商将收到与其发起的身份验证请求相关的响应。

请参见https://developers.google.com/identity/protocols/OpenIDConnect#createxsrftoken

我了解到code可能会被盗,redirect_uri可能会被盗。

但是我不明白为什么将其称为反CSRF保护?

根据wiki CSRF攻击“利用了网站在用户浏览器中的信任”。
据我了解,应该在浏览器中保留一些敏感内容,以使CSRF攻击成为可能。最经典的示例-身份验证Cookie。

但是与OpenID-connect代码流有关的浏览器中保留了什么?
这只是从服务提供者到身份提供者再返回的两次结果重定向。
代码本身作为URL参数在回调中传递。
浏览器的角色是被动的-重定向两次。什么都没有存储在这里。

所以我的问题是state到底能阻止哪种CSRF攻击?任何人都可以举一个详细的例子吗?还是只是滥用Google准则中的“ CSRF”一词?

maoyink 回答:状态参数可在基于OAuth2的身份验证中阻止哪种CSRF攻击?

CSRF的目的是通过单击攻击者发送的链接,欺骗用户在网站中执行操作(通常是用户在正常情况下不会执行的破坏性写操作)。此类活动的一个示例是删除网站中用户自己的帐户。假设用户已登录该网站,则来自该用户浏览器的请求将受到该网站服务器的信任,该服务器无法(在没有CSRF令牌的情况下)查明该用户实际上是由该用户发出的。

对于Google OAuth2(授权码授予类型),请注意,对Google auth服务器的初始请求包含用户在成功进行身份验证后实际要访问的URL。攻击者可以出于恶意目的精心构造该URL,并让用户使用它。

状态令牌检查使服务器可以确保请求确实来自其自己的网站,而不是来自其他任何地方。如果攻击者使用一些随机状态令牌创建了url,则服务器将无法识别该URL并拒绝该请求。

,

如果您有这样的疑问,那么您必须参考的最佳资源就是规范。对于OAuth 2.0,这是RFC6749。规范中有专门的部分讨论Cross-Site Request Forgery

  

跨站点请求伪造(CSRF)是攻击者利用的一种利用      导致受害最终用户的用户代理遵循恶意URI      (例如,作为误导性链接,图片或      重定向)到信任服务器(通常通过      存在有效的会话Cookie)。

从规范的角度来看,您必须在应用程序中实现 state 处理机制

  

客户端必须为其重定向URI实现CSRF保护。      这通常是通过要求将任何请求发送到      重定向URI端点,以包括将请求绑定到的值      用户代理的身份验证状态(例如会话的哈希)      用于验证用户代理的Cookie)。客户应      利用“状态”请求参数将该值传递给      授权请求时使用授权服务器。

有关详细说明,直接来自标本

  

针对客户端重定向URI的CSRF攻击允许攻击者      注入自己的授权码或访问令牌,      导致客户端使用与      攻击者的受保护资源,而不是受害者的受保护资源

注入来自攻击者的授权代码,然后操纵您的应用程序以使其表现出攻击者想要的方式。

,

在OAuth2中使用授权代码流时,用户浏览到客户端应用程序,然后将浏览器重定向到授权服务器以进行登录并获得访问令牌。

302 https://auth.server/authorize?response_type=code&client_id=....

在授权服务器上登录后,它将使用发出的代码将您重定向回注册的重定向URI。然后,客户端应用程序将代码替换为访问令牌,并有选择地转到状态参数中编码的URL。

现在,攻击者可能会诱骗您单击链接(从电子邮件或类似内容),例如:

<a href="https://auth.server/authorize?response_type=code&client_id=...."

这将对授权服务器执行相同的请求。登录后,授权服务器将您重定向回客户端应用程序,客户端应用程序将无法知道传入的带有授权码的GET请求是由发起的302重定向还是单击该请求引起的恶意电子邮件中的超链接。

客户端应用程序可以通过在授权请求的状态参数中添加一些熵来防止这种情况。由于状态参数将作为查询参数包含在返回客户端应用程序的最终重定向中,因此客户端应用程序可以检查熵是否与其在本地保存的内容(或仅在安全的HTTP cookie中)匹配,并确定已启动授权请求,因为攻击者无法在状态参数中设计带有熵的URL,该URL会与客户端应用程序保留的内容匹配。

本文链接:https://www.f2er.com/3115532.html

大家都在问