OAuth 2.0 认证和攻击面
0x00 前提
最近在测试公司的 oauth 认证方面的问题,要再去熟悉一下这块,所以把这块写一下。
0x01 OAuth2.0 概念
OAuth是一个关于授权(authorization)的开放网络标准,目前是最常见最通用的一个授权协议。
什么地方是OAuth2.0,其实这个东西非常的常见,
我们的快捷登录其实都是这个,拿这个举例子

那么为什么要用这个呢这个?
其实道理很简单,我们的网站首先使用这个快捷登录肯定是很方便,那么第三方网站和我们网站肯定是不能互相相信对方的,不可能将用户信息交给对方保存,所以一般情况下OAuth允许用户授予此访问权限,而无需将其登录凭据暴露给请求的应用程序。这意味着用户可以选择他们想要共享的数据,而不必将其帐户的账号密码交给第三方。
0x02 流程梳理
为了方便理解,直接用例子展示,首先我们要分清楚各个角色,我们简单分出4个部分:
resource owner(资源拥有者):就是用户
resource server(资源服务器):我们想要快捷登录的的网站 zeo.cool
User Agent:指浏览器。
authorization server(认证服务器):三方授权服务器(例如 Google授权服务器),服务提供商专门用来处理认证授权的服务器,认证成功后向客户端发出访问令牌资源所有者身份验证,获取授权。
client_id : 这个表示网站后台,我们的 zeo.cool的网站后端
在实际中有四种实现方式:
- 授权码模式
- 简化模式
- 密码模式
- 客户端模式
0x03 前提
某一个第三方应用 zeo.cool, 应用先去 Google认证中心进行注册。
提供一个回调地址 https://zeo.cool/oauth_calback
然后会得到:
ClientID = 888888 : 这个是我的网站zeo.cool的一个标识符号
ClientsecretID = 6666666 :这个类似私钥,要好好保存,绝对不能公开
0x04 令牌模式
在OAuth2.0中最常用的当属授权码模式
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。

注意:说明步骤(A)、(B)和©的线条在通过用户代理时被分成了两部分。在它们通过用户代理时被分成两部分。
(A)用户访问客户端,客户端将用户引导向认证服务器
客户端申请认证的URI,包含以下参数:
response_type:表示授权类型,必选项,此处的值固定为"code"
client_id:表示客户端的ID,必选项
redirect_uri:表示重定向URI,可选项
scope:表示申请的权限范围,可选项
state:可以指定任意的随机字符串,可选项
https://www.google.com/v1/oauth/authorize?response_type=code&client_id=888888&redirect_uri=CALLBACK_URL&scope=read&state=dslakf54jlk5li54j
(B)用户选择是否给予客户端授权。
(C)如用户给予授权,Google 认证服务器将用户引导向客户端指定的redirection uri,同时加上授权码code。(用户点击授权后,Google 引导用户访问A步骤中指定的重定向url,并带着授权码code和state)
code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
state:可以指定任意的随机字符串,可选项
https://zeo.cool/oauth_calback?code=SplxlOBeZQQYbYS6WxSbIA&state=dslakf54jlk5li54j
(D)zeo.cool 后段客户端收到code后,通过后台的服务器向认证服务器发送code和redirection uri。(zeo.cool带着接收到(C)步骤中的请求后,用授权码发送下面的请求去找Google认证服务器要token)
grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
code:表示上一步获得的授权码,必选项。
redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
client_id:表示客户端ID,必选项。
(服务器后端操作)
https://www.Google.com/v1/oauth/token?client_id=888888&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL
(E)Google认证服务器验证code和redirection uri,确认无误后,响应客户端访问令牌(access token)和刷新令牌(refresh token)。(响应(D)步骤的数据)
access_token:表示访问令牌
token_type:表示令牌类型,该值大小写不敏感
expires_in:表示过期时间
refresh_token:表示更新令牌
scope:表示权限范围
{"access_token":"sdjlkh13khekj2hjkhd23kjd","token_type":"xxx","expires_in":3600,"refresh_token":"zxfdcsa34323dxccc3","example_parameter":"xxxxx"}
最后我的网站 zeo.cool 就可以拿着 access_token 去找Google 去换取相应的信息了
为什么要先发放授权码,再用授权码换令牌?
这是因为浏览器转向(通常就是一次HTTP 302重定向)对于用户是可见的,换言之,授权码可能会暴露给用户以及用户机器
上的其他程序,但由于用户并没有Clientsecret,而只有授权码是无法换取到令牌的,所以避免了令牌在传输转向过程中被泄
漏的风险。
0x05 令牌模式-攻击面
(1)授权码模式下的安全问题常出现在CSRF攻击:
(A)步骤当中,有一个参数是可选的 state,state并放在session中,这个是服务端生成的一个随机字符串,
然后再在(A)步骤中的请求中带上state,Google返回url带有授权码和state的我们的网站
这个时候需要在在服务器后端会去对比这个state是否一致,用来防止csrf攻击
如果没有state,就会存在一种攻击手法。
1、hacker先获取自己的code
2、制作一个CSRF页面,去做C步骤,去让受害者用过自己的cookie去做绑定
3、那么最终就会,把受害者的cookie绑定到hacker的账户上
(2) 回调URL校验问题
如果回调校验有问题 like
利用一下绕过的正则的技巧,可以把跳转到 hacker.com 这样你的code也一起带过去
就可以利用这个code来做后续的问题
https://www.google.com/v1/oauth/authorize?response_type=code&client_id=888888&redirect_uri=www.zeo.cool@www.hacker.com?call_back&scope=read&state=dslakf54jlk5li54j
0x06 简化模式(隐式授权模式)
简化模式(implicit grant type)不通过第三方应用程序的服务器,
直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。
所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

(A)客户端将用户导向认证服务器。
A步骤中,客户端发出的HTTP请求,包含以下参数:
response_type:表示授权类型,此处的值固定为"token",必选项。
client_id:表示客户端的ID,必选项。
redirect_uri:表示重定向的URI,可选项。
scope:表示权限范围,可选项。
state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
https://www.Google.com/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read&state=xxx
(B)用户决定是否给予客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。
C步骤中,认证服务器回应客户端的URI,包含以下参数:
access_token:表示访问令牌,必选项。
token_type:表示令牌类型,该值大小写不敏感,必选项。
expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
https://www.example.com/callback#access_token =ACCESS_TOKEN&state=xyz&token_type=example&expires_in=3600&state=xxx
使用场景
-
适用于所有无Server端配合的应用
-
如手机/桌面客户端程序、浏览器插件。
-
基于JavaScript等脚本客户端脚本语言实现的应用。
0x07 简化模式攻击面
简化授权模式下的账户劫持
(1)那么实际场景就是当state参数不存在的时候可以进行csrf攻击
(2)伪造redirect_uri,提供商没有做好redirect_uri的校验
那我们需要做的是找到受信任的网站下的xss漏洞,然后重定向获取劫持access_token,在获取到access_token后完整攻击
0x08 密码模式
密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。
这种直接使用账号密码的情况极少,因为有违背最初的设计。

(A)用户向客户端提供用户名和密码。
(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。
B步骤中,客户端发出的HTTP请求,包含以下参数:
grant_type:表示授权类型,此处的值固定为"password",必选项。
username:表示用户名,必选项。
password:表示用户的密码,必选项。
scope:表示权限范围,可选项。
https://www.google.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID
(C)认证服务器确认无误后,向客户端提供访问令牌。
{"access_token":"df908f890sdf09asd890","token_type":"example","expires_in":3600,"refresh_token":"saf43r243fd34f4fg32g","example_parameter":"example_value"}
0x09 客户端模式
客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在此不做过多解释,只了解过程。
这个大多数在微服务的情况下,都是后端在自己做授权任务

该模式过程如下:
(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。
granttype:表示授权类型,此处的值固定为"client_credentials",必选项。
scope:表示权限范围,可选项。
https://www.example.com/token?grant_type=client_credentials
(B)认证服务器确认无误后,向客户端提供访问令牌。
{"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"example_parameter":"example_value"}
0x10 总结
攻击面主要是,CSRF绑定劫持漏洞,还有就是回调URL未校验,绕过校验,或者配合url跳转绕过啥的
相关文章:
OAuth 2.0 认证和攻击面
0x00 前提 最近在测试公司的 oauth 认证方面的问题,要再去熟悉一下这块,所以把这块写一下。 0x01 OAuth2.0 概念 OAuth是一个关于授权(authorization)的开放网络标准,目前是最常见最通用的一个授权协议。 什么地方…...
论文写作模板
1 引言 第一段 研究意义拟解决的关键问题研究目标 第二段 国内外研究现状总结 第三段 研究方法总结:图1(某一输入形式的结果数据 例子1) 第四段 研究方法分述 第五段 本文的创新点 2 相关工作 第一段 基于xx场景,存在xx问题…...
(五)物质导数与空间时间导数
本文内容主要包括:1. 物质导数与空间时间导数及二者的联系2. 空间坐标系相关量的物质导数2.1. 空间坐标系基矢的物质导数2.2. 空间坐标系协变基矢混合积的 g\sqrt{g}g 的物质导数3. 随体坐标系 {XA,t}\{X^A,t\}{XA,t} 相关量的物质导数3.1. 随体坐标系 {XA,t}\{X^…...
python实战应用讲解-【语法基础篇】流程控制-运算符(附示例代码)
目录 比较运算符 相等运算符 is:相同运算符 in:成员资格运算符 字符串和序列的比较...
MXNet中使用双向循环神经网络BiRNN对文本进行情感分类
文本分类类似于图片分类,也是很常见的一种分类任务,将一段不定长的文本序列变换为文本的类别。这节主要就是关注文本的情感分析(sentiment analysis),对电影的评论进行一个正面情绪与负面情绪的分类。整理数据集第一步都是将数据集整理好&…...
SpringBoot 整合 MongoDB 6 以上版本副本集及配置 SSL / TLS 协议
续上一篇 Linux 中使用 docker-compose 部署 MongoDB 6 以上版本副本集及配置 SSL / TLS 协议 前提:此篇文章是对上一篇文章的实战和项目中相关配置的使用,我这边针对 MongoDB 原有基础上做了增强,简化了 MongoDB 配置 SSL / TLS 协议上的支…...
C语言static关键字
目录static修饰局部变量static修饰全局变量static修饰函数static是C语言的关键字,它有静态的意思static的三种用法:修饰局部变量修饰全局变量修饰函数 static修饰局部变量 我们先看一个程序: void print() {int a 0;a;printf("%d\n&…...
【华为OD机试模拟题】用 C++ 实现 - 单词接龙(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…...
PHP基础(2)
PHP基础常用函数数组及多维数组数组遍历强制类型转换运算符赋值与基本运算字符串运算逻辑运算符常用函数 substr的用法是:substr(目标字符串,从字符串的哪个位置开始,然后返回往后的几个字符)strchr的用法是࿱…...
Java8(JDK1.8)新特性
一、Java8(JDK1.8)新特性 1、Lamdba表达式 2、函数式接口 3、方法引用和构造引用 4、Stream API 5、接口中的默认方法和静态方法 6、新时间日期API 7、OPtional 8、其他特性 二、java8(JDK1.8)新特性简介 1、速度快; 2、代码少、简…...
【C语言】指针的定义和使用
指针一、什么是指针二、指针类型三、指针和数组的关系四、空指针五、野指针一、什么是指针 指针(Pointer)是编程语言中的一个对象,通过地址直接指向内存中该地址的值。由于通过地址能够找到所需的变量存储单元,可以说地址指向该变…...
Parameter ‘zpspid‘ not found
异常:nested exception is org.apache.ibatis.binding.BindingException: Parameter testypid not found. Available parameters are [ztpsXmjcxx, pageable, param1, param2]分析:以为是xml文件中没有对应的字段,一细看了几遍是有这个字段的…...
23、高自由度下的E类波形理论计算(附Matlab代码)
23、高自由度下的E类波形理论计算(附Matlab代码) 0、代码 任意占空比、电压导数条件下的E类波形与阻抗条件计算Matlab 注意修改路径,我这边是:!!!!!!&#…...
软件测试:用“bug”来表示“在电脑程序里的错误”
计算机基础知识计算机(personal computer)俗称电脑(pc),是现代一种用于高速计算的电子机器,可以进行数值计算,又可以进行逻辑判断,还具有存储记忆功能,且能够按照程序的运…...
Git命令
git init # 初始化本地git仓库(创建新仓库)git config --global user.name "xxx" # 配置用户名git config --global user.email "xxxxxx.com" # 配置邮件git config --global color.ui true # git status等命令自动着色git config -…...
Java的异常概念和类型
Java是一种流行的编程语言,拥有强大的异常处理机制,以帮助开发人员在程序出现异常时更好地处理错误情况。本文将介绍Java异常的概念和类型。异常的概念在Java中,异常是指在程序运行时发生的错误或异常情况。例如,当程序试图打开不…...
【Leedcode】环形链表必备的面试题和证明题(附图解)
环形链表必备的面试题和证明题(附图解) 文章目录环形链表必备的面试题和证明题(附图解)前言一、第一题1.题目2.思路3.代码4.延伸问题(1)证明题一:(2)证明题二:二、第二题1.题目2.思路延伸的证明题总结前言 …...
Vulnhub靶场----7、DC-7
文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-7下载地址:https://download.vulnhub.com/dc/DC-7.zip kali:192.168.144.148 DC-7:192.168.144.155 二、渗透流程 nmap -T5 -A -p- -sV -sT 192.168.144.155思路: …...
【Unity VR开发】结合VRTK4.0:创建滑块
语录: 只有经历地狱般的磨练,才能炼出创造天堂的力量。 前言: 滑块是一个非常简单的控件,它允许通过沿有限的驱动轴滑动 Interactable 来选择不同的值。我们将使用线性驱动器创建一个滑块控件,该控件允许我们根据与滑…...
Latex中的表格(2)
Latex中的表格一、一个加脚注的三线表的例子二、表格中加注释三、并排的表格3.1 使用小页环境并排表格3.2 使用子表格并排表格四、一个复杂的表格五、一个长表格这篇文章主要罗列一些特殊的表格例子。内容来自:一篇北师大学位论文模板,详见https://githu…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
