OAuth回调参数漏洞案例解析

介绍

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写。

OAuth认证原理

OAuth 2.0中有6种常用的授权类型:

  • Authorization Code

  • Implicit

  • Password

  • Client Credentials

  • Device Code

  • Refresh Token

本文只介绍其中的Authorization Code(授权码模式),这也是目前国内大部分厂商使用的模式

你可能之前并没听过OAuth这个词,但一定已经使用过它了

例如新浪微博这里就提供了多种第三方登陆,下面笔者以”用QQ号登陆新浪微博”这个实例来讲解OAuth认证的原理

我们把”微博”称作客户端,”QQ”称作服务端

点击QQ登陆的图标,用户将被导向服务端的认证服务器



用户在此选择是否给予客户端(微博)授权,如果授权,则客户端将会获得用户在服务端(QQ)的昵称,头像和性别资料

先来看下这个URL

https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=101019034&response_type=code&scope=get_info%2Cget_user_info&redirect_uri=https%3A%2F%2Fpassport.weibo.com%2Fothersitebind%2Fbind%3Fsite%3Dqq%26state%3DCODE-tc-1HHqsX-17XJfh-9xPH9uGGNtzIBRFdf9ad2%26bentry%3Dminiblog%26wl%3D&display=

这其中有重要意义的参数有以下几个:

  • client_id

客户端标识,这个参数是和客户端一一对应的,这样服务端才知道认证请求来自哪个客户端.例如”101019034”代表的就是新浪微博这个客户端

  • response_type

授权类型,上文已经说了OAuth有多种授权类型.此处”code”代表使用的是Authorization Code(授权码模式)

  • scope

申请的权限范围

  • redirect_uri

重定向URI,用户给予授权后,将会携带授权码跳转到此地址

  • state

这个参数是用来防御CSRF的,你可以将其理解为我们常用的”token”.这里它的使用和”token”也是一样的

每次授权请求,客户端都会生成一个state,并将其保存到cookie或session中.授权成功后,服务端原样返回state,客户端将其与cookie或session中的值进行比对

回到授权过程,如果用户点击了QQ头像确认授权

认证服务器确认用户身份后,会生成一个授权码(code),然后将用户导向之前redirect_uri指定的地址,并附带上授权码(code)和state

state的作用已经说过是防御CSRF的,最终要的就是这个code了



客户端收到授权码(code)后,将其发送到服务端比对(这一步在客户端后台服务器完成,对用户不可见)

如果比对结果一致,那么游戏结束

在这个请求中,比对结束后,生成了一个alt,并跳转到了login.sina.com.cn域



验证了alt后,就在.sina.com.cn域种上cookie了.

从这个登陆案例来看,只要攻击者拿到了code参数,那么就能劫持用户的微博账号.

有经验的攻击者一定发现了,既然code参数会发送到redirect_uri参数指定的地址,那么只要让redirect_uri跳转到我们指定的地址,那么就能窃取code.

OAuth几个案例

案例1 新浪微博登陆劫持

redirect_uri限制不严格,可跳转到任意子域

虽然redirect_uri不能任意指定,但是微博的业务设定为了可以跳转到任意weibo.com的子域下.

如果我们能在某个子域下的某个页面引入外部资源(img,vedio的href属性;script标签的src属性),再让redirect_uri携带code跳转到这个页面,那么我们就能从referer头里窃取到code.

你可能首先会想到XSS,但是现在XSS不是那么好找了,而且用在这里有点大材小用.其实只要我们能引入一个外部图片就行了.

这种功能很常见,很多地方都允许插入在线图片.

我在xxx.weibo.com域下的一个帖子里插入了一个在线图片,图片地址填ceye平台地址.

然后修改redirect_uri为该帖子的地址.

https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=101019034&response_type=code&scope=get_info%2Cget_user_info&redirect_uri=http%3A%2F%2Fxxx.weibo.com%2Fxxx%2Fxxx%3fothersitebind%2Fbind%3Fsite%3Dqq%26state%3DCODE-gz-1EDEl3-2aubzX-fMrFwdihkKMytGcd5eddc%26bentry%3Dminiblog%26wl%3D&display=

然后把这个链接发给受害者,一旦他点击头像确认登陆,携带code的请求就会被导向到攻击者引入了外部图片的页面.

页面加载了img标签后,code就会通过referer头泄露出去.

上文已经说过,只要攻击者拿到code,那么发送给passport.weibo.com进行认证,就能劫持用户的微博账号了.

案例2-某厂登陆劫持 "案例2 某厂登陆劫持")案例2 某厂登陆劫持

redirect_uri严格限制,但目标域不安全

看了案例1,你可能会觉得应该由xxx.weibo.com背锅,如果严格限制redirect_uri跳转到指定域,就不会由问题了.

这是在一次众测遇到的一个案例,貌似还没修复,就不说名字了.

该厂允许绑定淘宝账号进行第三方登陆,

https://oauth.taobao.com/authorize?client_id=xxx&response_type=code&redirect_uri=http://a.xxx.com/login

并且严格限制了只能跳转到a.xxx.com域下,所以上面那种随便找个子域插入图片的套路看来是不行了.

但不幸的是,我正巧的a.xxx.com域下找到一个XSS,

image

所以,我们能更方便的写入img或者scritp标签了,后面窃取code的方法和上面一样,就不多说了.

案例3 360 OAuth服务端漏洞

攻击OAuth服务端,一锅端

通过上面2个案例,我们可以得出这样的结论:

不仅要严格限制redirect_uri跳转的域,而且要保证其跳转到一个安全的域.

但是,人在广东已经….啊不对,人在家中坐,锅从天上来.

360作为服务端为其它厂商提供了OAuth认证的功能,开发者可以在360应用开发平台进行申请.

人家不仅提供了详细的开发文档,还给开发者弄了个调试工具.

理论上呢,redirect_uri是开发者自己填的,为了安全,只能是某个安全的域名.

但是,360为了便于开发者进行登陆调试,把”openapi.360.cn”这个域名设置成了所有应用的合法回调地址.

那么openapi.360.cn这个域的安全性直接影响到所有客户端.

不幸的是,我又在openapi.360.cn下找到一个XSS,

所以,又能快乐的窃取到code了,并且影响了所有使用360账号登陆的应用.

总结

关于OAuth认证,还有其它的授权类型以及各种漏洞有待探索.

对于本文提及的授权码模式,其中的redirect_uri参数应该有以下递进式的限制:

  • 跳转到专门的认证服务器域名
  • 跳转到该域名下某个确定的页面
  • 确保该页面是安全的(无法引入外部资源)

参考

https://oauth.net/2/

https://tools.ietf.org/html/rfc6819

原文:
https://03i0.com/2018/04/01/OAuth回调参数漏洞案例解析/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348

推荐阅读更多精彩内容