揭开CSRF的神秘面纱?

时间:2017-11-05 02:02:10

标签: session cookies jwt csrf openid-connect

我已经阅读了很多long explanations of CSRF和IIUC,启用攻击的核心内容是基于cookie的服务器会话识别。

因此换句话说,如果浏览器(并且注意我在这里专门缩小范围到Web浏览器)不使用基于cookie的会话密钥来识别服务器上的会话,那么CSRF攻击就不会发生。我理解正确吗?

例如,假设有人创建了一个类似的链接:

 href="http://notsosecurebank.com/transfer.do?acct=AttackerA&amount;=$100">Read more!

登录http://notsosecurebank.com时,您被欺骗点击此链接,但http://notsosecurebank.com不使用Cookie来跟踪您的登录会话,因此该链接不会造成任何伤害,因为请求不能经过身份验证并被扔进垃圾桶?

假设

  • OpenID Connect服务器/ OAuth授权服务器已正确实施,不会将身份验证重定向发送到您要求的任何网址。
  • 攻击者不知道客户端ID和客户端密钥

脚注

我在此问题中定位的方案是最常谈到的CSRF方案。还有其他方案适合CSRF标记。这些情况极不可能,但要注意并做好准备。 One of them具有以下组件:

  • 1)攻击者可以将您引导到一个糟糕的客户端
  • 2)攻击者拥有该客户
  • 3)攻击者拥有在OAuth授权服务器上注册的客户端的秘密
  • 4)在您使用适当的服务器进行身份验证后,攻击者能够告知授权服务器验证您是否重定向回坏客户端。

所以设置这个有点像闯入诺克斯堡,但肯定很有意义。例如,OpenID Connect或OAuth授权提供商应该很可能标记注册重定向URL的客户端,这些URL指向其他客户端也已注册的重定向URL。

2 个答案:

答案 0 :(得分:2)

最常见/通常讨论的CSRF Cross Site Request Forgery方案只能在浏览器存储凭据(作为cookie或基本身份验证凭据)时发生。

OAuth2实现(客户端和授权服务器)必须小心CSRF攻击。 CSRF攻击可以发生在客户端的重定向URI和授权服务器上。根据{{​​3}}:

  

针对客户端重定向URI的CSRF攻击允许攻击者      注入自己的授权码或访问令牌,可以      导致客户端使用与之关联的访问令牌      攻击者受保护的资源而不是受害者的(例如,保存      受害者的银行帐户信息到受保护资源      由攻击者控制)。

     

客户端必须为其重定向URI实施CSRF保护。      这通常是通过要求发送给任何请求来完成的      重定向URI端点以包含将请求绑定到的值      用户代理的认证状态(例如,会话的散列)      用于验证用户代理的cookie)。客户应该      利用“state”请求参数将此值传递给      授权服务器在发出授权请求时。

     

[...]

     

针对授权服务器授权的CSRF攻击      端点可以导致攻击者获得最终用户授权      对于恶意客户端,不涉及或警告最终用户。

     

授权服务器必须为其实施CSRF保护      授权端点并确保恶意客户端不能      在没有意识和明确同意的情况下获得授权      资源所有者

答案 1 :(得分:1)

理论是,CSRF与认证方法无关。如果攻击者可以让受害者用户在受害者不想要的另一个应用程序中执行操作,那么该应用程序很容易受到CSRF的攻击。<​​/ p>

这可以通过多种方式表现出来,最常见的是受害用户访问恶意网站,恶意网站又将受害者浏览器的请求发送到另一个应用程序,从而执行用户不想要的操作。这种方式可以由受害者浏览器自动发送凭据。到目前为止,最常见的场景是会话cookie,但也可能有其他场景,例如HTTP Basic auth(浏览器也会记住),或域中的Windows身份验证(Kerberos / SPNEGO)或客户端证书,或者在某些情况下甚至是某种SSO。

有时候,应用程序身份验证是基于cookie的,并且所有非GET(POST,PUT等)请求都受到CSRF的保护,但GET并不是出于显而易见的原因。在像PHP这样的语言中,很容易使得作为POST请求的调用也可以作为GET使用(想想在PHP中使用$_REQUEST)。在这种情况下,任何其他网站都可以包含类似<img src='http://victim.com/performstuff&param=123>的内容,以便无声地执行操作。

复杂系统或流程中的CSRF攻击也不太明显,例如CSRF attacks against oauth

因此,如果Web应用程序使用say令牌(作为请求标头而不是会话cookie发送)进行身份验证,则意味着客户端必须将令牌添加到每个请求,即可能不易受攻击对于CSRF,但一如既往,魔鬼在细节中。