浅谈IAM——OAuth2.0攻击方法总结

news2024/11/23 8:22:21

一、OAuth协议介绍

OAuth是一种标准授权协议,它允许用户在不需要向第三方网站或应用提供密码的情况下向第三方网站或应用授予对存储于其他网站或应用上的信息的委托访问权限。OAuth通过访问令牌来实现这一功能。

1.发展历史

OAuth协议始于2006年Twitter公司OpenID项目,该公司的一位合作伙伴希望通过OpenID来实现委派认证,在经过研究后他们发现还没有一项关于API委派访问的开放标准,于是他们在2006年成立了OAuth讨论组,并且在当年的12月就发布了OAuth1.0协议。2010年4月,IETF将OAuth1.0纳入标准协议,编号为rfc5849,2012年OAuth2.0发布。

2.OAuth角色

OAuth协议中定义了4个角色:

  • 资源所有者

拥有向受保护资源授权能力的实体,我们可以理解为用户。

  • 资源服务器

存储受保护资源的服务器,可以接收带access_token的请求并返回受保护的资源。

  • 客户端

代表资源所有者请求受保护资源的应用即第三方的应用。

  • 授权服务器

在资源所有者通过认证后向客户端签发access_token的服务器。

3.抽象流程

下面这张图描述了OAuth协议中四个角色的交互过程。

A.客户端向资源所有者请求授权。

B.客户端接收到授权凭证,这里的授权凭证是一个代表资源所有者授权的凭证。

C.客户端与授权服务器交互并提交授权凭证。

D.授权服务器对客户端进行认证并验证授权凭证,如果有效,则颁发访问令牌。E.客户端使用访问令牌向资源服务器请求受保护资源。

F.资源服务器验证访问令牌,如果有效,向客户端返回受保护的资源。

4.相关概念

授权模式

授权模式指的是客户端向授权服务器获取访问令牌(Access Token)的方式,RFC6749中定义了四种授权模式及一种拓展机制。

授权码模式

授权码是客户端获取访问令牌的一个临时凭据,授权码模式也是四种授权模式中最安全的一种。在授权码模式中,用户授权后,认证服务器向客户端生成授权码,客户端再利用授权码向认证服务器请求访问令牌。

隐式授权模式

隐式授权是一种简化的授权码模式,在隐式授权模式中,认证服务器没有向客户端签发授权码这一步骤,直接向客户端颁发访问令牌。

密码授权模式

密码模式主要应用于高度可信的客户端中,用户需要向客户端提供自己的用户名和密码,客户端再利用用户名和密码向认证服务器请求访问令牌。

客户端凭据

客户端凭据的主要应用场景是其访问的资源为相对固定的受保护资源,客户端仅代表自身去向资源服务器请求资源。

访问令牌

访问令牌是用于访问受保护资源的凭据,访问令牌一般都会包含用户身份、访问范围、有效时间等信息。

刷新令牌

刷新令牌是用于获取访问令牌的凭据,主要是在访问令牌过期后用来向认证服务器请求新的访问令牌。

5.OAuth客户端

客户端也是OAuth协议中非常重要的一个概念,客户端代表第三方应用身份,在OAuth协议中规定客户端需要向认证服务器进行注册,协议没有规定注册的具体方法,但是规定了客户端需要提供的一些参数。

  • 客户端标识符(client_id),每个客户端都应该有一个唯一标识符,用于识别该客户端并与其他客户端区分开来。
  • 客户端密钥(client_secret),每个客户端还应该有一个密钥,用于与 OAuth 服务端进行身份验证和通信。
  • 授权类型(grant_type),客户端应该指定它所使用的授权类型,例如授权码、隐式授权、密码授权或客户端凭证授权。
  • 回调URL(redirect_uri),客户端应该指定一个回调 URL,OAuth 服务端将在用户授权后将授权码或令牌发送到该 URL。
  • 可接受的响应类型(response_type),客户端应该指定它所接受的响应类型,例如code、token或其他拓展响应类型。
  • 可接受的范围(scope),客户端应该指定它所接受的范围,即客户端所请求的访问权限。
  • 其他元数据,客户端还可以指定其他元数据,例如客户端名称、描述、图标等。

6.授权码模式

授权码模式是应用最多的OAuth授权模式,下图描述了授权码模式中各个角色之间的交互流程。

A.客户端通过指示资源所有者的用户代理到授权端点。客户端包括它的客户端标识符、请求的范围、本地状态和授权服务器将向其发送的重定向 URI一旦授予(或拒绝)访问权限,用户代理就会返回。

B.授权服务器验证资源所有者(通过用户代理)并确定资源所有者是否授予或拒绝客户端的访问请求。

C.如果资源所有者授予访问权限,则授权服务器使用之前提供的重定向 URI。

D.客户端利用上一步接收到的授权码向认证服务器请求访问令牌,并且客户端需要向认证服务器进行身份验证。

E.认证服务器验证客户端,验证授权代码,并确保重定向 URI接收到的与用于重定向客户端的 URI 相匹配。如果验证通过,授权服务器响应访问令牌和刷新令牌。

二、OAuth攻击面

身份基础设施的底层均绕不开身份认证协议这一关键技术,但是在OAuth协议实际应用中也暴露了许多安全风险,主要包括以下几个攻击面。

1.认证绕过

第三方应用登录是OAuth的一个典型应用案例,但是如果使用了错误的实现方式就会造成认证绕过的后果。以下是某个应用的第三方登录实现逻辑。

首先APP通过OAuth拿到用户的OpenId,拿到OpenId之后APP再调用登录接口并以OpenID为参数,服务端在数据库中查询到OpenId对应的用户随即返回该用户的session。

整个过程中应用仅仅使用了OpenId作为鉴权的参数,但是由于OpenId是一个相对固定的参数,一旦泄露出去,这里就会产生认证绕过的风险。

2.开放重定向

开放重定向是只攻击者可以通过控制请求参数使用户重定向到任意地址的攻击,在OAuth中导致开放重定向的罪魁祸首是对redirect_uri参数没有经过校验,由于认证服务器会通过重定向将用户授权凭据传递给客户端,攻击者通常会利用这种攻击手法来窃取用户授权凭据。

3.SSRF

导致SSRF的一个重要原因是OAuth客户端的注册过程,OAuth客户端注册通常会向认证服务器提供一些包含客户端信息的元数据,其中一些参数以url的形式提供给认证服务器,包括重定向地址、log地址、jwks等,如果服务器在服务端对这些地址发起web请求,这里就会出现SSRF漏洞。

4.参数注入

参数注入主要包括SQL注入和XSS,OAuth协议交互和客户端注册中涉及到多种参数传递过程,如果在服务端没有进行恰当的过滤和验证,很有可能就会出现参数注入漏洞,比如在一些OAuth实现中直接将客户端注册填写的redirect_url渲染到html页面,或者是将code参数直接用字符串拼接的方式带入到SQL查询语句中,这些不安全的实现都会导致意外的事故。

5.会话投毒

会话投毒攻击一般出现在授权访问的过程中,主流的OAuth服务实现一般有以下几个流程:

1.客户端校验,对传递过来的客户端参数包括client_id、redirect_uri、scpoe等参数进行合法性校验。

2.用户认证,认证服务器向资源所有者进行身份验证,主要是利用表单等方式对用户身份进行验证。

3.向用户询问是或否授权,在这个步骤中会向用户展示客户端信息及授权范围,并向用户展示授权按钮。

4.将用户授权凭据通过重定向传递给第三方客户端。

以上几个步骤中客户端校验、用户认证、授权逻辑通常都是在三个接口中独立实现,三个接口需要维持的一些状态参数会存储到session中。

比如在第一步客户端校验通过后将redirect_uri存储在session中,在通过验证后并授权之后再从session中取出redirect_uri并将用户重定向到这个地址。

在这个过程中,如果攻击者在自己的页面制作一个合法的客户端授权请求、但是在后台偷偷发送自己注册的恶意客户端授权请求,session里面的内容就会被刷新,用户再授权之后就会将授权凭据重定向到攻击者的客户端地址。

三、OAuth攻击案例

针对OAuth的攻击案例在现实中也是层出不穷,以下是一些漏洞和攻击的典型案例。

1.CVE-2021-26715

CVE-2021-26715是OAuth的开源实现MITREid Connect中存在的一个SSRF漏洞、该漏洞的主要原因是其在服务端通过http请求客户端logo地址展示给用户。

首先注册客户端,向客户端传递一个恶意的logo地址

再通过接口获取客户端logo

接收到的是恶意地址的内容。根据api地址定位到相关代码内容

api对应的方法是

org.mitre.openid.connect.web.ClientAPI#getClientLogo

getClientLogo方法中通过

InMemoryClientLogoLoadingService#getLogo

方法,传入客户端实体类获取客户端logo图像

最终在

org.mitre.openid.connect.service.impl.InMemoryClientLogoLoadingService类中可以看到构造http请求向logo地址发起的http请求。

2.redirect_uri

这是一个通过redirect_uri地址绕过防护进行开放重定向攻击的案例,白帽黑客kuzu7shiki在hackerone上披露的一份报告显示,kuzu7shiki发现了pixiv提供的OAuth服务中的一个漏洞,正常的OAuth认证参数构造如下:

https://oauth.secure.pixiv.net/v2/auth/authorize?client_id=a1Z7w6JssUQkw5Hid0uIDeuesue9&redirect_uri=https%3A%2F%2Fbooth.pm%2Fusers%2Fauth%2Fpixiv%2Fcallback&response_type=code&scope=read-works+read-favorite-users+read-friends+read-profile+read-email+write-profile&state=%3A1a38b53563599621ce25094661b1c4458ddb52d79d771149

kuzu7shiki将redirect_uri改成以下这种形式:

redirect_uri=https%3A%2F%2Fbooth.pm%2Fusers%2Fauth%2Fpixiv%2Fcallback/../../../../ja/items/4503924

在用户授权后认证服务器将用户重定向到地址:

https%3A%2F%2Fbooth.pm/ja/items/4503924

booth.pm是一个购物平台、items/4503924为商品详情页面,这个页面的内容是商家可以控制的,这个漏洞的关键点在于pixiv没有对重定向地址进行严格校验,如果攻击者注册一个商家账户并在商品页面植入类似Google Analytics的访问统计插件,用户在授权之后,授权凭据就会暴露在攻击者的统计数据中。

3.OAuth钓鱼

这是国外安全公司fortra发布的一篇关于利用OAuth钓鱼对Office365应用进行钓鱼的攻击案例。

Office365可以理解为一个在线版的office应用,主要包含文档、表格、邮件等功能,并且其API支持OAuth委托认证。攻击者钓鱼的主要手法是向用户发送一个假冒的内部文档。

实际上链接是

httpps://http://login.microsoftonline.com/common/oauth2/v2.0/authorize?%20client_id=fc5d3843-d0e8-4c3f-b0ee-6d407f667751&response_type=id_token+code&redirect_uri=https%3A%2F%2Fofficemtr.com%3A8081%2Foffice&scope=offline_access%20contacts.read%20user.read%20mail.read%20notes.read.all%20mailboxsettings.readwrite%20Files.ReadWrite.All%20openid%20profile&state=12345Ajtwmd&response_mode=%20form_post&nonce=YWxsYWh1IGFrYmFy

这里可以很明显看出来是一个OAuth认证链接,受害者在点击该链接后会跳出登录界面

受害者输入用户密码后进行授权

一旦用户点击授权,用户凭据将会被发送到攻击者的恶意客户端地址,并且攻击者拥有授权范围的所有能力,包括读取联系人、操作邮件、文档等等。

4.o365-attack-toolkit

o365-attack-toolkit是github上一个针对office365进行攻击的开源工具,这个工具主要也是利用了Office365服务api支持OAuth认证的特性。

工具主要包含了钓鱼页面、后端服务、以及管理接口三个部分,钓鱼页面负责对受害者进行钓鱼攻击,后端服务利用Microsoft Graph API请求用户存储在office365服务中的数据,管理界面为攻击者提供用户及资产的可视化管理的功能。以下是这款工具的一些主要功能界面:

①用户管理

②邮件搜索

③文件搜索

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/565870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车载以太网 - SomeIP - 协议用例 - BehaviorBasic

目录 Service Discovery Communication Behavior 1、验证DUT启动后的重复报文阶段,2帧offer报文之间的时间间隔为上次的2倍<

【模型预测】A-4D战斗机姿态控制的模型预测控制方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java中的类加载机制

Java中的类加载机制 类的生命周期 ​ 一个类型从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期将会经历加载&#xff08;Loading&#xff09;、验证&#xff08;Verification&#xff09;、准备&#xff08;Preparation&#xff09;、解…

C++ thread编程(Linux系统为例)—thread成员函数与thread的创建方法

c 11 之后有了标准的线程库&#xff1a;std::thread。 参考thread库的使用 成员函数 构造函数 thread的构造函数有下面四个重载 默认构造函数 thread() noexcept初始化构造函数 template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&a…

Linux命令(21)之usermod

Linux命令之usermod 1.usermod介绍 usermod命令用来更改/etc/passwd或/etc/shadow文件下用户属性&#xff0c;包括但不限于shell类型、用户id&#xff0c;用户gid、家目录、锁定及解锁用户等等。 2.usermod用法 usermod [参数] [用户名] usermod常用参数 参数说明-u修改UID…

淘宝/天猫商品评论数据采集

淘宝商品评论API接口是指允许开发者通过API接口获取淘宝商品的评价信息的一种技术手段。通过使用这个接口&#xff0c;开发者可以快速获取淘宝商品的评价信息&#xff0c;以实现自己的商业用途。 淘宝商品评论API接口需要开发者提供相应的数据访问权限&#xff0c;包括授权和Ap…

Linux命令(22)之chage

Linux命令之chage 1.chage介绍 usermod命令用来更改linux用户密码到期信息&#xff0c;包括密码修改间隔最短、最长日期、密码失效时间等等。 2.chage用法 chage常用参数 参数说明-m密码可更改的最小天数&#xff0c;为0表示可以随时更改-M密码有效期最大天数-W密码到期前提…

代理模式 静态代理 JDK动态代理 Cglib动态代理

1.静态代理 总共只有两个类&#xff0c;代理类和被代理类。其中代理类是被代理类的增强和扩展 被代理的类C和代理类B都要实现同一个接口 代理类B中调用代理类C中相同的方法 interface D {public void function1(); }class C implements D {Overridepublic void function1(…

PyQt5桌面应用开发(18):自定义控件界面设计与实现

本文目录 PyQt5桌面应用系列定制控件-界面设计本文目标功能分析 功能设计绘制方形图案鼠标交互事件和属性 完整代码总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循环 …

chatgpt赋能python:PythonTile:一种强大的界面构建工具

Python Tile&#xff1a;一种强大的界面构建工具 Python Tile是一种基于Python编程语言的界面构建工具&#xff0c;其目的是帮助开发者快速创建精美的用户界面&#xff0c;从而提高应用程序的用户体验。本文将介绍Python Tile的功能和优势&#xff0c;并讨论其在实际开发中的应…

Doris数据库BE——LoadChannelMgr原理解析

数据在经过清洗过滤后&#xff0c;会通过Open/AddBatch请求分批量将数据发送给存储层的BE节点上。在一个BE上支持多个LoadJob任务同时并发写入执行。LoadChannelMgr负责管理这些任务&#xff0c;并对数据进行分发。 internal service Open/AddBatch请求接口使用BRPC&#xff…

STP 生成树协议

STP&#xff08;Spanning-Tree Protocol&#xff09;的来源 在网络三层架构中&#xff0c;我们会使用冗余这一技术&#xff0c;也就是对三层架构中的这些东西进行备份。冗余包含了设备冗余、网关冗余、线路冗余、电源冗余。 在二层交换网络中进行线路冗余&#xff0c;如图&am…

Linux :: 【基础指令篇 :: 用户管理:(2)】::设置用户密码(及本地Xshell 登录云服务器操作演示) :: passwd

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 目录索引&#xff1a; 1. 基本语法 2. 基本用法 3. 注意点 4. 补充&#xff1a;指定用户设置密码操作实例测试及登录本地 Xshell 登录演…

Linux命令(18)之file

Linux命令之file 1.file介绍 file命令用来识别文件类型。 2.file用法 file [参数] [文件或目录] file常用参数 参数说明-L显示符号廉洁所指向文件的类别-i显示MIME类别-b显示结果时&#xff0c;不显示文件名称 3.实例 3.1显示ztj.sh文件类型 3.2显示ztj.sh文件类型(不显示…

记一次docker中的oracle连接问题

起因是客户登陆时报错TNS-12537 登陆上上服务器后&#xff0c;发现了几个特点。 1、没有oracle用户 2、数据文件的位置和spfile里面写的不一样 3、pmon进程存在&#xff0c;但是父进程ID不是1 4、配置oracle用户及环境变量&#xff0c;但是as sysdba无法登录到数据库 查看…

Linux命令(19)之userdel

Linux命令之userdel 1.userdel介绍 userdel命令用来说删除useradd命令创建的Linux账户。 useradd创建用户&#xff1a; Linux命令(15)之useradd_小黑要上天的博客-CSDN博客 2.userdel用法 userdel [参数] [用户账户名称] userdel常用参数 参数说明-r递归删除&#xff0c;…

【网络编程】协议定制+Json序列化与反序列化

目录 一、序列化与反序列化的概念 二、自定义协议设计一个网络计算器 2.1TCP协议&#xff0c;如何保证接收方收到了完整的报文呢&#xff1f; 2.2自定义协议的实现 2.3自定义协议在客户端与服务器中的实现 三、使用Json进行序列化和反序列化 3.1jsoncpp库的安装 3.2改造…

学系统集成项目管理工程师(中项)系列26_新兴信息技术

1. 云计算 1.1. 基于互联网的超级计算模式&#xff0c;通过互联网来提供大型计算能力和动态易扩展的虚拟化资源 1.2. 通过网络提供可动态伸缩的廉价计算能力 1.3. 特点 1.3.1. 【19上选23】 1.3.2. 超大规模 1.3.3. 虚拟化 1.3.4. 高可靠性 1.3.5. 通用性 1.3.6. 高可…

linux共享内存总结

共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成 头文件&#xff1a; #include <sys/ipc..h> #include<sys/shm.h> // 创建或获取一个共享内存: 成功返回共享内存ID&#xff0c;失败返回-1 int shmget (key_t key, size_t_size, int flag); // 连接共享内…