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

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...