oauth认证中容易被错误使用而导致的漏洞
2014-05-26 16:56
239 查看
没有state参数导致的csrf,被别人绑定账号
我们知道oauth授权的大致流程是这样的
提供一个登录按钮 url大致是这样的
https://api.weibo.com/oauth2/authorize?【client_id】=【2857799177】&【redirect_uri】=【https://sae.sina.com.cn/ssl/?m=sso&a=weibo_callback&sccb=http%3A%2F%2Fsae.sina.com.cn%2F%3Fm%3Duser%26a%3Dreg_check_login】&【response_type】=【code】&【forcelogin】=【true】
这里对url立面的参数和值使用【】区分了。其中重要的部分是client_id和redirect_uri,如果用户同意授权并登录之后,后台会记录client_id,生成一个code,然后重定向到那个redirect_uri,然后携带code,比如http://sae.sina.com/?【code】=【fldjs8943fasoh】
这样第三方应用就获取到了code,然后根据事先注册的client_id和app_secret就能去获取access_token之类的信息了。然后凭借access_token去访问用户信息。
但是我们想如果两个人交换了这个code,那样不就会绑定了对方的账号么?因为这个code或者这个带有code的url只能携带提供oauth服务的网站的账号,比如微博账号,然后绑定在第三方(比如论坛)上,只要是没有论坛账号没有绑定微博账号的人,访问带有这个code的url,都会将这个微博账号绑定在论坛账号上。
怎么防范呢,其实在oauth官方文档中有说明,就是再加入一个随机参数,比如state=3428oiresuihf,服务器访问回调url的时候也会带着这个参数,比如http://sae.sina.com/?code=fdsfjkldsfjdlks&state=fdsafjdsklw9 第三方应用需要自行去设置和对比这个参数,比如在session中存储等等。
但是要强调的是:不是必须加入state参数,而是必须用csrf保护。参考http://drops.wooyun.org/papers/598中间部分。
redirect_uri校验不严格
这样就网站可能就会将code重定向到攻击者的网址上,然后我们使用这个code填到真实的redirect uri上就能绑定账号了。
主要问题就是url没有校验,url校验不严,可绕过,url跳转漏洞等等。参考
http://blog.knownsec.com/2014/05/oauth_vulnerability_analysis/
错误的参数传递
比如用户同意授权之后重定向的时候会携带uid,然后将账号绑定在这个uid上,却没有校验uid。
参考http://www.wooyun.org/bugs/wooyun-2012-011104
http://www.wooyun.org/bugs/wooyun-2013-017543
------------------------
参考 http://www.freebuf.com/articles/web/5997.html http://tech.ccidnet.com/art/32963/20121109/4448657_1.html http://drops.wooyun.org/papers/1989(这个里面还有oauth常见的其他被错误使用导致的漏洞,可以好好看看)
我们知道oauth授权的大致流程是这样的
提供一个登录按钮 url大致是这样的
https://api.weibo.com/oauth2/authorize?【client_id】=【2857799177】&【redirect_uri】=【https://sae.sina.com.cn/ssl/?m=sso&a=weibo_callback&sccb=http%3A%2F%2Fsae.sina.com.cn%2F%3Fm%3Duser%26a%3Dreg_check_login】&【response_type】=【code】&【forcelogin】=【true】
这里对url立面的参数和值使用【】区分了。其中重要的部分是client_id和redirect_uri,如果用户同意授权并登录之后,后台会记录client_id,生成一个code,然后重定向到那个redirect_uri,然后携带code,比如http://sae.sina.com/?【code】=【fldjs8943fasoh】
这样第三方应用就获取到了code,然后根据事先注册的client_id和app_secret就能去获取access_token之类的信息了。然后凭借access_token去访问用户信息。
但是我们想如果两个人交换了这个code,那样不就会绑定了对方的账号么?因为这个code或者这个带有code的url只能携带提供oauth服务的网站的账号,比如微博账号,然后绑定在第三方(比如论坛)上,只要是没有论坛账号没有绑定微博账号的人,访问带有这个code的url,都会将这个微博账号绑定在论坛账号上。
怎么防范呢,其实在oauth官方文档中有说明,就是再加入一个随机参数,比如state=3428oiresuihf,服务器访问回调url的时候也会带着这个参数,比如http://sae.sina.com/?code=fdsfjkldsfjdlks&state=fdsafjdsklw9 第三方应用需要自行去设置和对比这个参数,比如在session中存储等等。
但是要强调的是:不是必须加入state参数,而是必须用csrf保护。参考http://drops.wooyun.org/papers/598中间部分。
redirect_uri校验不严格
这样就网站可能就会将code重定向到攻击者的网址上,然后我们使用这个code填到真实的redirect uri上就能绑定账号了。
主要问题就是url没有校验,url校验不严,可绕过,url跳转漏洞等等。参考
http://blog.knownsec.com/2014/05/oauth_vulnerability_analysis/
错误的参数传递
比如用户同意授权之后重定向的时候会携带uid,然后将账号绑定在这个uid上,却没有校验uid。
参考http://www.wooyun.org/bugs/wooyun-2012-011104
http://www.wooyun.org/bugs/wooyun-2013-017543
------------------------
参考 http://www.freebuf.com/articles/web/5997.html http://tech.ccidnet.com/art/32963/20121109/4448657_1.html http://drops.wooyun.org/papers/1989(这个里面还有oauth常见的其他被错误使用导致的漏洞,可以好好看看)
相关文章推荐
- 正则表达式(regex)错误使用导致功能漏洞分析
- 正则表达式(regex)错误使用导致功能漏洞分析
- 使用JNDI的一个容易忽略的错误
- [subversion] 使用中的错误列举 ra_local , 403 Forbidden 清除ToitoiseSVN的认证
- C语言指针一种容易错误使用的方法
- 忆龙2009:使用ACS进行机器跨域认证出现错误:"NTLIB: Could not find machine host"
- sql语句中导致索引失败的一些错误使用方式
- 使用makefile和不使用makefile时,容易犯的一个错误。
- 特殊情况下产生的”在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。”
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误
- 使用JS,IE提示:由于出现错误 80020101 而导致此项操作
- 分析器错误信息: 在应用程序级别以外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。导致该错误的原因可能是在 IIS 中没有将虚拟目录作为应用程序进行配置。
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。
- 分析器错误信息: 在应用程序级别以外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。导致该错误的原因可能是在 IIS 中没有将虚拟目录作为应用程序进行配置。
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。
- 使用JNDI的一个容易忽略的错误
- "在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误"的解决方法
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误
- 使用 libevent 容易犯的一个错误