大家如果对Oauth还不是很了解可以先看下这篇文章https://www.cnblogs.com/maoxiaolv/p/5838680.html

我这篇博客主要是总结一下安全测试过程中遇到Oauth2.0有哪些可能存在的漏洞,以及如何去测试。

Oauth2.0协议流程:

(A)用户打开客户端以后,客户端要求用户给予授权。(比如说你登陆淘宝,但是不想注册淘宝账户,于是淘宝说你可以用QQ登陆哟,于是说好,这个时候淘宝将你引导至QQ的认证服务器)

(B)用户同意给予客户端授权。(这个时候你在手机上弹出是否授权,你点击是,这个时候会返回一个授权码给淘宝,为什么是返回给淘宝呢?因为第一步中发送的认证服务器中会带有一个重定向url,是淘宝自己的)

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。(淘宝拿着这个授权码再去找认证服务器)

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。(淘宝取人授权码无误后,发放accesstoken令牌)

(E)客户端使用令牌,向资源服务器申请获取资源。(淘宝拿着令牌就可以访问QQ资源服务器)

(F)资源服务器确认令牌无误,同意向客户端开放资源。(QQ资源服务器对比令牌无误后开放资源)

上面有些细节没讲(例如url一般是怎样的),但不影响我们的测试。

这里还要科普两个知识点:

1.并不是什么网站都可以想QQ要授权的,比如说淘宝想和QQ搞这Oauth,必须先在QQ(服务提供商)那里进行注册,淘宝需要提供以下三个东西

  1)应用程序名称

  2)应用程序网站

  3)回调URL

  注册完成后,QQ会给淘宝两个东西

  1)Client ID (用于在构建上面B步骤中的请求url,这样QQ才知道是什么网站在找我要授权吧)

  2)Client Secret(也是淘宝要给QQ的东西,Client ID谁都知道可以伪造,这东西只有QQ和淘宝知道,至于是怎么给的还不知道)

2.上面的C、D两个步骤属于授权过程,Oauth2.0提供了四种授权模式

  • 授权码授权模式(Authorization Code Grant)
  • 隐式授权模式(Implicit Grant)
  • 密码授权模式(Resource Owner Password Credentials Grant)
  • 客户端凭证授权模式(Client Credentials Grant)

  

 Oauth2.0协议本身没有什么问题,只是开发人员在实现授权过程中没有严格安装协议规定来,可能会导致一些常见的问题

 其中主要是前三种可能存在问题,先以授权码授权模式为例将下流程吧:

授权码模式:

(A)用户访问客户端,客户端将用户引导向认证服务器。

(B)用户选择是否给予客户端授权。

(C)如用户给予授权,认证服务器将用户引导向客户端指定的redirection uri,同时加上授权码code。

(D)客户端收到code后,通过后台的服务器向认证服务器发送code和redirection uri。

(E)认证服务器验证code和redirection uri,确认无误后,响应客户端访问令牌(access token)和刷新令牌(refresh token)。

请求示例

(A)步骤:客户端申请认证的URI(淘宝请求QQ)  

https://www.example.com/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read&state=xxx

参数说明:

  response_type:授权类型,必选项,此处的值固定为"code"
  client_id:客户端的ID,必选项
  redirect_uri:重定向URI,必选项
  scope:申请的权限范围,可选项
  state:任意值,认证服务器会原样返回,用于抵制CSRF(跨站请求伪造)攻击。

(C)步骤:服务器回应客户端的URI(用户点击授权后,QQ引导用户访问A步骤中指定的重定向url,并带着授权码和state)

https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xxx

参数说明:

  code:授权码,必选项。授权码有效期通常设为10分钟,一次性使用。该码与客户端ID、重定向URI以及用户,是一一对应关系。
  state:原样返回客户端传的该参数的值。

(D)步骤:客户端向认证服务器申请令牌(淘宝带着接收到C步骤中的请求后,用授权码发送下面的请求去找QQ认证服务器要token)

https://www.example.com/v1/oauth/token?client_id=CLIENT_ID&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

参数说明:

  client_id:表示客户端ID,必选项。
  grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
  code:表示上一步获得的授权码,必选项。
  redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。

注意:协议里没有提及client_secret参数,建议可以使用此参数进行客户端的二次验证。

(E)步骤:响应(D)步骤的数据

    {"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA","example_parameter":"example_value"}

参数说明:

  access_token:访问令牌,必选项。
  token_type:令牌类型,该值大小写不敏感,必选项。
  expires_in:过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  refresh_token:更新令牌,用来获取下一次的访问令牌,可选项。
  scope:权限范围,如果与客户端申请的范围一致,此项可省略。

使用场景

  • 授权码模式是最常见的一种授权模式,在oauth2.0内是最安全和最完善的。
  • 适用于所有有Server端的应用,如Web站点、有Server端的手机客户端。
  • 可以得到较长期限授权。

授权码授权模式常出现的安全问题是A步骤中,由于开发者没有严格按照协议来,请求中没有带上state,可能造成账户劫持的问题。正常情况下,淘宝先生成一个state并放在session中,然后再A步骤中的请求中带上state,QQ返回url带有授权码和state的链接给淘宝,淘宝这个时候需要在后台对比这个state是否和session中的一样,用来防止csrf攻击(这里将的有点啰嗦,实际上就是csrf嘛)。如果开发者在开发中没有使用state,我们也应该怎样测试呢?

1.确认A步骤中是否带有state,如果没有该参数则存在漏洞

2.准备AB两个账号,A是攻击者,B是受害者,两个都登陆的情况下,当然是不同的浏览器下喽(这里有个场景限制,就是绑定账户的地方才有,比如说我有各淘宝账户,但是要记住账号密码登陆很麻烦,我将他绑定到QQ,以后就可以直接用QQ登陆啦)

3.A点击绑定QQ,然后用打开burp抓包,点击授权,一步一步forward,知道遇到请求中带有授权码的请求,复制该请求后drop掉,因为code一般都是一次性的

4.拿去B账户的浏览器中打开(实际攻击中就是csrf嘛),会发现B账户绑定了A账户的QQ,以后A就可以用自己的QQ登陆B的淘宝了。

隐身授权模式:

A)客户端将用户引导向认证服务器。

(B)用户决定是否给于客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端指定的”重定向URI",并在URI的Hash部分包含了访问令牌。

(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。

(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。

(F)浏览器执行上一步获得的脚本,提取出令牌。

(G)浏览器将令牌发给客户端。

请求示例

(A)步骤:客户端发出请求

https://www.QQ.com/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read&state=xxx

参数说明

  response_type:授权类型,此处的值固定为"token",必选项。
  client_id:客户端的ID,必选项。
  redirect_uri:重定向的URI,必选项。
  scope:权限范围,可选项。
  state: 任意值,认证服务器会原样返回,用于抵制CSRF(跨站请求伪造)攻击。

(C)步骤:认证服务器响应客户端的请求url

https://www.example.com/callback#access_token =ACCESS_TOKEN&state=xyz&token_type=example&expires_in=3600&state=xxx

参数说明

  access_token:访问令牌,必选项。
  token_type:令牌类型,该值大小写不敏感,必选项。
  expires_in:过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  scope:权限范围,如果与客户端申请的范围一致,此项可省略。
  state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

使用场景

  • 适用于所有无Server端配合的应用
  • 如手机/桌面客户端程序、浏览器插件。
  • 基于JavaScript等脚本客户端脚本语言实现的应用。

这里主要讲下隐式授权和授权码授权的区别:

两者主要是应用场景不同,授权码授权模式中淘宝是有自己的server端的,也就是说淘宝有自己的账户,只是想和QQ绑定而已。而隐式授权模式适用于比如说QQ自己的其他服务,比如英雄杀这种网页游戏,假设它自己有没有单独的server端,那么就可以使用隐式授权模式找QQ的其他服务要授权(这里有点说不清楚哈,大家意会,其实也不一定是QQ自己的其他服务,比如说我自己开了各三国杀的网站游戏,我不想要自己的服务器端,因为用户可能不想麻烦再注册账户,那么我用隐式授权模式实现QQ的开发的Oauth服务,这样用户就可以直接用QQ的账户登陆啦)

说完大家就可以发现一个问题就是,隐式授权模式可能就不存在账户劫持的问题了,因为我(三国杀)都没有账户你怎么劫持呢?但是这里有个其他的问题:

这是上面A步骤和C步骤发送的两个请求

A   https://www.QQ.com/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read&state=xxx
C   https://www.example.com/callback#access_token =ACCESS_TOKEN&state=xyz&token_type=example&expires_in=3600&state=xxx

C步骤中的请求链接实际上来源A请求中的redirect_uri参数(用于指定重定向的链接),最为关键的地方是C请求中带有access_token,那么实际场景就是当state参数不存在的时候又可以进行csrf攻击了,伪造redirect_uri就好了,但正常情况下QQ至少会对redirect_uri的域名做校验吧,所以不能随便重定向,需要找到受信任的网站下的xss漏洞,然后重定向获取劫持access_token即可可以发现隐式授权如果存在问题一般是指服务提供商没有做好redirect_uri的校验,同时呢开发人员也没有加上state参数。

密码模式授权:这个没什么好说的,就是需要用户输入QQ的账号密码。判断是否存在漏洞就是看下有没有爆破漏洞

最后我还想说下sso(单点登陆的问题),sso和Oauth还是有区别的,sso主要是指比如我说登陆企业的OA后,我在OA里面再登陆企业邮箱啊、jira啊、wiki啊等等都不用再输入账号密码了,这就是单点登陆。sso存在的问题主要是盗取access_token后登陆他人账户,原因主要没有对redirect_uri做校验:场景一:和上面Oauth隐身授权模式的攻击手法一样,厂商只对域名做了校验,我们找到白名单中的域名下的xss漏洞进行利用就好了场景二:厂商没有做任何校验,这里和Oauth有些区别,sso不同的公司实现其他可能都有些不同,根据开发者的安全意识而异,所以可能对redirect_uri没有任何校验,这样利用起来就方便很多了,可以直接跳转到www.evil.com,同时这里还可以尝试javascript:alert(1)进行xss

不能在写了,早上来就写这个,工作还没干呢

转载于:https://www.cnblogs.com/jinqi520/p/10075471.html

Oauth2.0安全问题浅谈相关推荐

  1. hadoop 批流处理的实现_从T+1到T+0,浅谈PetaBase的实时流式处理

    随着互联网+的进一步发展,各行业对大数据技术的应用日趋成熟,企业的信息化范围正在高速扩展. 我们发现,越来越多的企业大数据分析已不再局限于传统的T+1场景,对数据的实时性分析和处理要求很高.例如网站流 ...

  2. android rxbus2.0封装,浅谈Rxbus封装(一)

    最近再看一个项目,但是那个项目里面的Rxjava是1.x版本的,由于最近又有一个项目要开始了,在封装各种基类,所以我准备将项目中的Rxbus用Rxjava2.x来修改一下继续用,由于2.x的Rxjav ...

  3. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  4. Oauth2.0的安全运行是否必须使用Https协议?官方总结的安全问题有哪些?(附英文文档分析)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.Oauth2.0 1.Oauth2.0与Https的关系? 2.Oauth2.0的user-agent不使用Htt ...

  5. linux中sh+$0,浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释

    摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: ...

  6. 浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别

    举例浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别 demo Dom结构: <di ...

  7. 255.0.0.0子网掩码相应的cidr前缀表示法是?_【洛谷日报#246】浅谈表达式的求值(Vol.2 进阶)...

    Warning 在观看本博客之前,请保证自己理解了表达式的三种表达方式. 本文旨在让大家更深层次的了解表达式,基础的知识就是上方的链接中所写的.所以,在了解后缀表达式的运算原理之后,我将不会讲述类似的 ...

  8. android分屏模式_浅谈 Android 7.0 多窗口分屏模式的实现

    从 Android 7.0 开始,Google 推出了一个名为"多窗口模式"的新功能,也就是我们常说的"分屏模式".那么,这个功能有什么用呢?作为开发者,我们又 ...

  9. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

最新文章

  1. 施有朋:人工智能崛起,AI赋能医疗领域,创业者该如何选择
  2. 「后端小伙伴来学前端了」Vue中学会使用Echarts生成各种各样的图表,得学学了,必须要会的基本操作了
  3. 开发composer包
  4. onlinezakladki 右键菜单还原
  5. applicationcontext添加配置_让小白也能懂的Bean配置方法
  6. mysql的配置以及后端数据库的连接
  7. 织梦系统的安装与详细信息
  8. hdu 1209 clocks wrong answer 我的错误代码(没审好题唉,角度一样后,还要按小时排序。...
  9. 虽然今天angular5发布了,但我还是吧这篇angularjs(1)+webpack的文章发出来吧哈哈哈...
  10. Css选择器命名规则
  11. 仿 qq音乐播放器 html代码,仿QQ音乐播放器
  12. Java 打印Word文档
  13. 《西点军校的经典法则》序 -- 責任(せきにん)、栄誉(えいよ)、国家(こっか)...
  14. 电子系统综合设计作业笔记
  15. sourcetree拉取项目时报错,解决两个冲突
  16. 短视频剪辑如何入门?短视频剪辑常用的配音软件
  17. 记一次kubernetes的搭建遇坑coredns状态为CrashLoopBackOff并不断重启
  18. 「魔窗」问题终于解决了
  19. 200 件实物,从过往的平面设计窥视上海的变化
  20. 使用百度ai识别身份证信息

热门文章

  1. 2021年市政方向-岗位技能(质量员)考试及市政方向-岗位技能(质量员)考试资料
  2. PHP Imagick添加文字水印
  3. 大数据挖掘企业服务平台(数据挖掘建模平台)产品概述
  4. 分享裁剪画面并添加滚动水印的小妙招
  5. 硬盘维修的失败案例总结20201005
  6. 【沁恒WCH CH32V307V-R1在MounRiver Studio上环境配置教程】
  7. 第一章(6)计算机网络体系结构之计算机网络的性能指标
  8. 添加个性标签—三方开源TriangleLabelView
  9. 自动拼图工具gaps安装
  10. python unicode转中文_python3中Unicode字符转中文