本文基于 @蓝色 di 雪球在 2014 年 8 月 22 日的 KCon 上的演讲《利用 OAuth 劫持用户身份》整理而成。
演讲者简介
@蓝色 di 雪球,新浪微博安全团队安全工程师。主要从事微博产品的安全测试,安全功能架构,以及相关自动化平台工具架构和研发工作。致力于研究应用安全,安全自动化以及安全运维等。
OAuth 是什么
OAuth 是一个开源授权协议,通过授权,第三方应用可以在不使用用户名密码的情况下,访问用户在某一个网站上的私密数据。目前微博、淘宝、微信、Twitter、Facebook 等用户基数比较大的公司都在使用 OAuth,从谷歌的搜索结果也可以看到 OAuth 的发展很快,使用的人非常多。OAuth 分为 OAuth 1.0 和 OAuth 2.0,OAuth 2.0 简单清晰,是 1.0 的升级版,但是不兼容 1.0,目前大多数网站也都是使用的 OAuth 2.0。
OAuth 的四种调用方式
- Authorization Code
最常用的,相对安全,需要有 Server 端支持。
- Implicit
直接获取 access_token,不需要 Server 端支持。
- Resource Owner Password Credentrals
第三方可以获得用户名和密码,需要第三方绝对可信。 - Client Credentials
不需要用户授权,授权通过服务器进行。
请求参数
在了解 OAuth 的漏洞之前,首先需要了解常用的 OAuth 调用方式的请求参数。
- Authorization Code
- https(加密传输)
- response_type=code(控制调用)
- redirect_uri(回掉地址)
- scope(控制权限)
- Implicit
- display(场景控制)
- response_type=token(控制调用)
- referer(请求来源)
- 没有 redirect_uri
OAuth 风险分析
风险分析
- 信息泄漏
主要包括 Authorization Code 泄漏、Access Token 泄漏、AppSecret 泄漏。 - CSRF
主要包括授权劫持和绑定劫持。授权劫持是指用户在目标网站处于登录状态的情况下,攻击者通过伪造授权链接来诱骗用户点击,用户访问攻击者的链接后,攻击者就会劫持用户授权。绑定授权同样是在用户处于登录状态的情况下,攻击者通过用户授权登录目标网站并阻断用户授权流程,进而诱骗用户点击,用户在访问攻击者的链接后,攻击者就可以劫持用户授权。 - URL 回调污染
主要是指由于 redirect_uri 回调地址填写不严格或者授权服务器不验证或者验证不严格而导致的 code 或者 access_token 泄露。 - 权限认证
主要是指 OAuth 高级授权接口的越权访问,比如 GitHub 的 scope 漏洞,导致可以访问私有代码区。 - 不区分调用方式
主要是指在 Authorization Code 和 Implicit 两个调用方式,它们的区别仅仅是一个参数,黑客可以利用这个参数来绕过 AppSecret 认证。
如何优雅的利用 OAuth 漏洞
- 劫持用户应用方身份
这种方式需要用户绑定第三方应用和网站进行授权绑定,黑客修改回调地址后,紧接着用户就会跳转到接受 code 的网址,黑客获得 code 后就可以登录与网站绑定的第三方账号。具体的攻击过程是这样的:1)用户授权将网站与第三方应用绑定 2)用户已经登录网站 3)黑客构造 OAuth 回调污染地址 4)通过私信等其它途径诱惑用户点击 URL 5)利用 Authorization Code 劫持用户第三方应用的身份 - 劫持用户授权方身份
黑客利用 OAuth 中的 URL 跳转漏洞,XSS 漏洞后拿到 accesss_token。通过 access_token,黑客可以劫持大 V 用户发微博、劫持大量用户发评论、删除指定微博、刷粉、强制关注等。
OAuth 漏洞修复
微博中存在的问题:
- 开放平台中 redirect_uri 不规范
- redirect_uri 校验存在逻辑错误
- 不区分调用方式
最终的修复方案:
- 将大型应用添加进白名单,严格验证开放平台回调地址
- 非白名单进行全路径验证
- 运营和产品推动,规范白名单内应用的回调地址,改完移出白名单,直到白名单清空
评论