当前位置: 首页 > news >正文

OAuth 2.0 认证和攻击面

0x00 前提

最近在测试公司的 oauth 认证方面的问题,要再去熟悉一下这块,所以把这块写一下。

0x01 OAuth2.0 概念

OAuth是一个关于授权(authorization)的开放网络标准,目前是最常见最通用的一个授权协议。

什么地方是OAuth2.0,其实这个东西非常的常见,

我们的快捷登录其实都是这个,拿这个举例子

image-20230223164744000

那么为什么要用这个呢这个?

其实道理很简单,我们的网站首先使用这个快捷登录肯定是很方便,那么第三方网站和我们网站肯定是不能互相相信对方的,不可能将用户信息交给对方保存,所以一般情况下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)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。

image-20230223173520189

注意:说明步骤(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)不通过第三方应用程序的服务器,

直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。

所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

image-20230223221553082

(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)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。

这种直接使用账号密码的情况极少,因为有违背最初的设计。

image-20230223221624810

(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框架所要解决的问题。在此不做过多解释,只了解过程。

这个大多数在微服务的情况下,都是后端在自己做授权任务

image-20230223232216494

该模式过程如下:

(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的用法是&#xff1…...

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…...

(七)输运定理

本文主要内容包括:1. 物质积分2. 曲线上物质积分的时间变化率3. 曲面上物质积分的时间变化率4. 体积域上物质积分的时间变化率 (Reynolds 输运定理)1. 物质积分 考虑 t0t_0t0​ 时刻参考构型中由物质点 X⃗\vec{X}X所形成的 物质曲线 ct0c_{t_0}ct0​​、物质曲面 …...

ABBYYFineReader15免费电脑pdf文档文字识别软件

ABBYYFineReader是一款OCR文字识别软件,它可以对图片、文档等进行扫描识别,并将其转换为可编辑的格式,比如Word、Excel等,操作也是挺方便的。 我们在官网找到该软件并进行下载,打开软件后,选择转换为“Mic…...

顺序表(超详解哦)

全文目录引言顺序表定义静态顺序表动态顺序表动态顺序表的接口实现顺序表的初始化与销毁顺序表尾插/尾删顺序表头插/头删顺序表在pos位置插入/删除顺序表的打印顺序表中的查找总结引言 在生产中,为了方便管理数据,我们经常会需要将一些数据连续的存储起…...

Compose-Animation高级别动画

目录前言AnimatedVisibilityisScrollingUpFABscaffoldanimateContentSizeCrossfade顶部气泡下弹前言 AnimatedVisibility 驱动可视性相关动画,即布局显隐 animateContentSize 内容变换动画相关 Crossfade 布局(或者页面)切换过渡动画 Animat…...

c++11 标准模板(STL)(std::unordered_set)(八)

定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...

Python每日一练(20230225)

目录 1. 整数反转 2. 求最大公约数和最小公倍数 最大公约数 最小公倍数 3. 单词搜索 II 附录&#xff1a; DFS 深度优先搜索算法 BFS 广度优先搜索算法 BFS 和 DFS 的区别 1. 整数反转 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。…...

基于博客系统的测试用例

登陆界面博客预览页博客详情页博客编辑页...

C语言运算符算术运算符关系运算符

C 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运…...

C语言 深度剖析数据在内存中的存储

目录数据类型详细介绍整形在内存中的存储&#xff1a;原码&#xff0c;反码&#xff0c;补码大小端字节序介绍及判断浮点型在内存中的存储解析数据类型详细介绍整形&#xff1a;1.为什么char类型也会归类到整形家族当中去呢&#xff1f;字符存储和表示的时候本质上使用的是ASCI…...

MyBatis快速开发

查询user表中的所有数据 步骤&#xff1a; 创建user表 打开Navicat&#xff0c;新建查询&#xff0c;将下面SQL代码复制粘贴并执行&#xff1a; create database mybatis; use mybatis;drop table if exists tb_user;create table tb_user(id int primary key auto_incremen…...