我在公司中将identityserver3的OAuth2.0用于SSO,我无法理解状态参数如何阻止CSRF。
我已复制攻击流程,如下所示:
1.Mallory访问某个客户的网站,并开始授权该客户使用OAuth访问某些服务提供商的过程
2,客户向服务提供商请求允许代表马洛里进行访问的权限,这被授予
3.Mallory重定向到服务提供商的网站,她通常会在该网站上输入用户名/密码来授权访问
4.相反,Mallory捕获/阻止此请求并保存其URL(回调URL)
5.现在,Mallory以某种方式让Alice访问该URL。如果爱丽丝使用自己的帐户登录到服务提供商,则她的凭据将用于发布授权码
6,将授权码换成访问 token
7.Now Mallory在客户端上的帐户已被授权访问服务提供商上的Alice帐户
我可以理解步骤1到步骤4。但是从步骤5开始,我有些困惑。根据我的理解,在步骤5中,爱丽丝(Alice)在登录时访问了回调网址(URL),然后服务器仅使用授权代码访问OAuth服务提供商以获取Openid和后端的 token ,然后爱丽丝(Alice)的浏览器用Mallory的帐户和访问 token 执行登录。与Mallory的浏览器有什么关系?
您能详细解释一下吗?感谢您抽出时间阅读我的话!
最佳答案
我认为步骤3和步骤4不太正确。我已经编辑了您的示例,以显示我认为攻击的工作方式。
1,Mallory访问某个客户的网站(例如https://brilliantphotos.com)并开始授权该客户使用OAuth访问某些服务提供商的过程(例如Acebook-因为brilliantphotos.com允许其用户将图片发布到他们的Acebook页面上)
2.brilliantphotos.com将Mallory的浏览器重定向到Acebook的授权服务器,一旦完成身份验证,就请求重定向回自身。
3.Mallory重定向到授权服务器,在此她输入Acebook用户名/密码以授权访问。
4,成功登录后,Mallory会捕获/阻止后续的重定向请求并保存其URL(带有与Mallory相关的身份验证代码的Callback Url),例如
https://brilliantphotos.com/exchangecodefortoken?code=malloryscode
5.现在,Mallory以某种方式让Alice访问该URL(也许作为论坛帖子的链接...),请注意,Alice可能已经使用自己的帐户登录了brilliantphotos.com。
6.Alice单击指向brilliantphotos.com的链接,然后将授权代码交换为访问 token (访问顽皮的Mallory的帐户)。如果爱丽丝已登录,那么可以想象brilliantphotos.com可以将爱丽丝的帐户与新创建的访问 token 相关联。
7.现在,如果Alice继续使用brilliantphotos.com网站,则客户可能会无意中将图片发布到服务提供商(Acebook)上Mallory的帐户中。
如果状态参数由brilliantphotos.com维护,则Mallory的状态代码将绑定(bind)到她的浏览器,但不绑定(bind)到Alice的浏览器。因此,当Alice单击恶意URL时,brilliantphotos.com将无法将状态代码与Alice的浏览器 session 相关联。