「 典型安全漏洞系列 」12.OAuth 2.0身份验证漏洞

news2024/11/19 10:44:53

在浏览网页时,你肯定会遇到允许你使用社交媒体帐户登录的网站。此功能一般是使用流行的OAuth 2.0框架构建的。本文主要介绍如何识别和利用OAuth 2.0身份验证机制中发现的一些关键漏洞。

在这里插入图片描述

1. OAuth产生背景

为了更好的理解OAuth,我们假设有如下场景:有一个提供云冲印的网站,该网站可以将用户储存在百度网盘的照片冲印出来。用户为了使用该服务,必须让云冲印网站读取自己存储在百度网盘上的照片。

传统方式需要用户将自己的百度网盘用户名和密码告诉云冲印服务提供者,后者就可以读取用户的照片了。然而这种做法有着严重的缺点

  • 云冲印为了后续持续提供服务就会保存用户的密码,这样很不安全
  • 云冲印拥有了获取用户存储在百度网盘所有资源的权力,用户无法限制云冲印获得授权的范围和有效期
  • 用户只有修改密码,才能收回赋予云冲印的权力。但这样做又会使得其他所有获得用户授权的第三方应用程序全部访问失效
  • 只要有一个第三方应用程序被攻破,就会导致用户密码泄露,最终导致此密码保护的所有数据泄露

为了解决以上问题就引入本文的主角OAuth。

2. 什么是OAuth?

OAuth是一种常用的授权框架,使网站和web应用程序能够请求对另一个应用程序上的用户帐户的有限访问。OAuth允许用户在不向请求的应用程序公开其登录凭据的情况下授予此访问权限。这意味着用户可以调整他们想要共享的数据,而不必将其帐户的完全控制权交给第三方。

基本的OAuth过程有两种应用场景:

  • 集成需要从用户帐户访问某些数据的第三方功能(设计之初的场景)。例如,应用程序可能会使用OAuth请求访问您的电子邮件联系人列表,以便建议与之联系的人员。
  • 提供第三方身份验证服务(广泛使用的场景),允许用户使用他们在不同网站上的帐户登录。

3. OAuth 2.0是如何工作的?

OAuth 2.0最初是作为一种在应用程序之间共享对特定数据的访问的方式而开发的。它通过定义三个不同方(即客户端应用程序、资源所有者和OAuth服务提供商)之间的一系列交互来工作。

  • 客户端应用程序:希望访问用户数据的网站或web应用程序。
  • 资源所有者:客户端应用程序要访问其数据的用户。
  • OAuth服务提供商:控制用户数据和访问数据的网站或应用程序。他们通过提供API与授权服务器和资源服务器交互来支持OAuth。

3.1. 工作流程

有许多不同的方式可以实现实际的OAuth流程,这些被称为OAuth“流”或“授予类型”,但总的来说,这两种类型都涉及以下阶段:

  • 客户端应用程序请求访问用户数据的一个子集,指定他们想要使用的授权类型以及他们想要的访问类型。
  • 系统会提示用户登录到OAuth服务,并明确表示同意请求的访问。
  • 客户端应用程序接收一个唯一的访问令牌,该令牌证明他们拥有来自用户的访问请求数据的权限。具体发生方式因拨款类型而异。
  • 客户端应用程序使用此访问令牌进行API调用,从资源服务器获取相关数据。

在这里插入图片描述

4. OAuth身份验证

虽然OAuth最初并非用于此目的,但它也已发展成为一种对用户进行身份验证的手段。例如,你可能熟悉许多网站提供的使用现有社交媒体帐户登录的选项,而不必在相关网站注册。无论何时看到此选项,都很有可能是基于OAuth 2.0构建的。

对于OAuth身份验证机制,基本的OAuth流在很大程度上保持不变;主要区别在于客户端应用程序如何使用它接收的数据。从最终用户的角度来看,OAuth身份验证的结果大致类似于基于SAML的单点登录(SSO)。OAuth身份验证通常实现如下:

  1. 用户选择使用其社交媒体帐户登录的选项。然后,客户端应用程序使用社交媒体网站的OAuth服务来请求访问它可以用来识别用户的一些数据。例如,这可能是用他们的帐户注册的电子邮件地址。
  2. 在接收到访问令牌之后,客户端应用程序通常从专用 /userinfo 端点向资源服务器请求该数据。
  3. 一旦收到数据,客户端应用程序就会使用它来代替用户名登录用户。通常使用从授权服务器收到的访问令牌,而不是传统的密码。

5. 漏洞产生原因

  • OAuth身份验证漏洞的出现部分是因为OAuth规范在设计上相对模糊和灵活。尽管每种授权类型的基本功能都需要一些强制性组件,但绝大多数实现都是完全可选的。这包括许多保持用户数据安全所必需的配置设置。
  • OAuth的另一个关键问题是普遍缺乏内置的安全功能。安全性几乎完全依赖于开发人员使用正确的配置选项组合,并在上面实现他们自己的附加安全措施,例如稳健的输入验证。正如您可能已经收集到的,有很多东西需要接受,如果您对OAuth缺乏经验,这很容易出错。
  • 根据授权类型的不同,高度敏感的数据也会通过浏览器发送,这为攻击者拦截数据提供了各种机会。

6. 如何识别OAuth身份验证

识别应用程序何时使用OAuth身份验证相对简单。如果你有看到使用其他网站的帐户登录的选项,这强烈表明正在使用OAuth。识别OAuth身份验证的最可靠方法是通过Burp代理流量,并在使用该登录选项时检查相应的HTTP消息。无论使用哪种OAuth授权类型,流的第一个请求都将始终是对 /authorization 端点的请求,其中包含许多专门用于OAuth的查询参数。特别要注意 client_idredirect_uriresponse_type 参数。例如,授权请求通常如下所示:

GET /authorization?client_id=12345&redirect_uri=https://client-app.com/callback&response_type=token&scope=openid%20profile&state=ae13d489bd00e3c24 HTTP/1.1
Host: oauth-authorization-server.com

7. 如何利用OAuth身份验证

7.1. OAuth客户端应用程序中存在漏洞

正如前面已经提到的,OAuth规范的定义相对松散。对于客户端应用程序的实现来说尤其如此。OAuth流中有很多活动部分,每个授予类型中都有许多可选参数和配置设置,这意味着存在大量错误配置的空间。

7.2. 隐式授予类型的实现不正确

由于通过浏览器发送访问令牌会带来危险,因此主要建议单页应用程序使用隐式授予类型。然而,由于其相对简单,它也经常用于经典的客户端-服务器web应用程序。

在这个流中,访问令牌作为URL片段通过用户的浏览器从OAuth服务发送到客户端应用程序。然后,客户端应用程序使用JavaScript访问令牌。问题是,如果应用程序想在用户关闭页面后维护会话,它需要将当前用户数据(通常是用户ID和访问令牌)存储在某个地方。

为了解决这个问题,客户端应用程序通常会在 POST 请求中将这些数据提交给服务器,然后为用户分配一个会话cookie,从而有效地将他们登录。这个请求大致相当于表单提交请求,该请求可能会作为经典的基于密码的登录的一部分发送。然而,在这种情况下,服务器没有任何机密或密码可以与提交的数据进行比较,这意味着它是隐式信任的。

在隐式流中,此 POST 请求通过浏览器暴露给攻击者。因此,如果客户端应用程序没有正确检查访问令牌是否与请求中的其他数据匹配,这种行为可能会导致严重的漏洞。在这种情况下,攻击者可以简单地更改发送到服务器的参数以模拟任何用户。

7.3. CSRF保护有缺陷

尽管OAuth流的许多组件都是可选的,但强烈建议使用其中一些组件,除非有重要原因不使用它们。一个这样的例子是 state 参数。

理想情况下, state 参数应该包含一个不可访问的值,例如在用户会话首次启动OAuth流时绑定到该会话的某个值的哈希。然后,该值作为客户端应用程序的CSRF令牌的形式在客户端应用程序和OAuth服务之间来回传递。因此,如果您注意到授权请求没有发送 state 参数,那么从攻击者的角度来看,这是非常有趣的。这可能意味着他们可以在诱骗用户的浏览器完成OAuth流之前自己启动OAuth,类似于传统的CSRF攻击。这可能会产生严重后果,具体取决于客户端应用程序使用OAuth的方式。

考虑一个允许用户使用经典的基于密码的机制登录的网站,或者使用OAuth将其帐户链接到社交媒体档案。在这种情况下,如果应用程序未能使用 state 参数,攻击者可能会将受害者用户在客户端应用程序上的帐户绑定到他们自己的社交媒体帐户,从而劫持受害者用户的帐户。

请注意,如果站点允许用户以独占方式通过OAuth登录,那么 state 参数可能不那么重要。然而,不使用 state 参数仍然可以允许攻击者构建登录CSRF攻击,从而诱使用户登录到攻击者的帐户。

7.4. 泄露授权码和访问令牌

最臭名昭著的基于OAuth的漏洞可能是OAuth服务本身的配置使攻击者能够窃取授权码或访问与其他用户帐户相关的令牌。通过窃取有效的代码或令牌,攻击者可能能够访问受害者的数据。

根据授权类型,通过受害者的浏览器将代码或令牌发送到授权请求的 redirect_uri 参数中指定的 /callback 端点。如果OAuth服务未能正确验证此URI,攻击者可能能够构建类似CSRF的攻击,诱使受害者的浏览器启动OAuth流,该流将代码或令牌发送给攻击者控制的站点。

请注意,使用 statenonce 保护并不一定能防止这些攻击,因为攻击者可以从自己的浏览器生成新值。

8. 如何防止OAuth身份验证漏洞

为了防止OAuth身份验证漏洞,OAuth提供程序和客户端应用程序都必须对密钥输入(尤其是 redirect_uri 参数)进行稳健的验证。OAuth规范中几乎没有内置的保护,因此由开发人员自己来确保OAuth流尽可能安全。

8.1. 对于OAuth服务提供商

  • 要求客户端应用程序注册有效 redirect_uris 的白名单。只要可能,请使用严格的逐字节比较来验证任何传入请求中的URI。只允许完全和精确的匹配,而不是使用模式匹配。这可以防止攻击者访问白名单域上的其他页面。
  • 强制使用 state 参数。它的值还应该通过包括一些不可访问的、特定于会话的数据(例如包含会话cookie的哈希)来绑定到用户的会话。这有助于保护用户免受类似CSRF的攻击。这也使攻击者更难使用任何被盗的授权码。
  • 资源服务器上,确保验证访问令牌是否已颁发给发出请求的 client_id 。此外,还应该检查请求的作用域,以确保它与最初授予令牌的作用域相匹配。

8.2. 对于OAuth客户端应用程序

  • 在实现OAuth之前,请确保您完全了解其工作原理的细节。许多漏洞都是由于对每个阶段到底发生了什么以及如何利用这些漏洞缺乏了解而导致的。
  • 使用 state 参数,即使它不是强制性的。
  • redirect_uri 参数不仅发送到 /authorization 端点,还发送到 /token 端点。
  • 在开发移动或本机桌面OAuth客户端应用程序时,通常不可能将 client_secret 保持为私有。在这些情况下, PKCE ( RFC 7636 )机制可以用于提供针对访问代码拦截或泄漏的额外保护。
  • 如果使用OpenID Connect id_token ,请确保根据JSON Web签名、JSON Web加密和OpenID规范对其进行了正确验证。
  • 小心使用授权代码-当加载外部图像、脚本或CSS内容时,它们可能会通过 Referer 标头泄漏。同样重要的是不要将它们包含在动态生成的JavaScript文件中,因为它们可以通过 <script> 标签从外部域执行。

9. 参考

[1] https://portswigger.net/web-security/oauth
[2] https://portswigger.net/research/hidden-oauth-attack-vectors
[3] https://portswigger.net/web-security/oauth/grant-types
[4] https://portswigger.net/web-security/oauth/preventing

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

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

相关文章

分享一个基于Multi-SLAM+3DGS的新一代三维内容生产技术

基于智能空间计算&#xff0c;新一代超逼真三维内容生成技术。 可自动化生成超逼真的大场景三维模型&#xff0c;并在各类终端和空间计算设备中&#xff0c;实现前所未有的沉浸式体验。 更可接入专业三维软件和应用平台&#xff0c;进行深度的模型开发与场景落地。 支持超大复杂…

【前端Vue】Vue0基础完整教程第5篇:vue指令(下),成绩案例【附代码文档】

Vue从0基础到大神学习完整教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vue基本概念&#xff0c;vue-cli的使用&#xff0c;vue的插值表达式&#xff0c;{{ gaga }}&#xff0c;{{ if (obj.age > 18 ) { } }}&#xff0c;vue指令&#xff0c;综合…

C++【适配器模式】

简单介绍 适配器模式是一种结构型设计模式 | 它能使接口不兼容的对象能够相互合作。&#xff08;是适配各种不同接口的一个中间件&#xff09; 基础理解 举个例子&#xff1a;当你引用了一个第三方数据分析库&#xff0c;但这个库的接口只能兼容JSON 格式的数据。但你需要它…

Jenkins (五) - Docker SonarQube

Jenkins (五) - Docker SonarQube Jenkins 集成 SonarQube&#xff0c;编译项目并通过SonarQube分析项目 前提 基于已有的环境 Jenkins (四) - Docker SonarQube 基于 Jenkins (三) - 拉取编译 上的mockito-demo工程 配置工程 Administration -> Projects -> Manage…

axios快速入门

一、环境配置 1.1概述 上古浏览器页面在向服务器请求数据时&#xff0c;因为返回的是整个页面的数据&#xff0c;页面都会强制刷新一下&#xff0c;这对于用户来讲并不是很友好。并且我们只是需要修改页面的部分数据&#xff0c;但是从服务器端发送的却是整个页面的数据&#…

C++设计模式:装饰器模式(四)

1、定义与动机 装饰器模式定义&#xff1a;动态&#xff08;组合&#xff09;地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码 & 减少子类个数&#xff09;。 在某些情…

Python+Django+Html河道垃圾识别网页系统

程序示例精选 PythonDjangoHtml河道垃圾识别网页系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoHtml河道垃圾识别网页系统》编写代码&#xff0c;代码整洁&#xff0c;规…

【多模态融合】MetaBEV 解决传感器故障 3D检测、BEV分割任务

前言 本文介绍多模态融合中&#xff0c;如何解决传感器故障问题&#xff1b;基于激光雷达和相机&#xff0c;融合为BEV特征&#xff0c;实现3D检测和BEV分割&#xff0c;提高系统容错性和稳定性。 会讲解论文整体思路、模型框架、论文核心点、损失函数、实验与测试效果等。 …

961: 进制转换问

【学习版】 【C语言】 #include<iostream>struct SeqList {int top;int len;int* s; };void initStack(SeqList* stack, int len) {stack->s new int[len];stack->top -1;stack->len len; }void push(SeqList* stack, int x) {stack->s[stack->top] …

调用阿里云API接口实现电商领域命名实体识别NER

文章目录 阿里云简介命名实体识别NER阿里云API注册调用代码阿里云简介 阿里云是全球领先的云计算及人工智能科技公司,成立于2009年,为200多个国家和地区的企业、开发者和政府机构提供服务。阿里云提供了一系列的云计算服务,包括服务器租赁、云数据库、云存储、人工智能等,…

Jenkins (四) - 搭建 Docker SonarQube

Jenkins (四) - 搭建 Docker SonarQube 拉取 SonarQube $ docker pull sonarqube拉取 postgres $ $ docker pull postgres运行 postgres $ docker run -itd \ -e TZAsia/Shanghai -e POSTGRES_USERtester \ -e POSTGRES_PASSWORD123456 \ -p 5432:5432 \ -v /home/tester/d…

KK全域电商,全体系打造实操课,多平台打造电商逻辑体系

实操课详细指导分析流程 资深运营老师陪伴式答疑 课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89013409 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 1先导课(拍下请看).mp4 2为什么要做小..红营 .mp4 3小红营适合什么类目的产品,…

神经网络分类和回归任务实战

学习方法&#xff1a;torch 边用边学&#xff0c;边查边学 真正用查的过程才是学习的过程 直接上案例&#xff0c;先来跑&#xff0c;遇到什么解决什么 数据集Minist 数据集 做简单的任务 Minist 分类任务 总体代码&#xff08;可以跑通&#xff09; from pathlib import …

基于vue+node.js导师选择分配管理系统

开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode .设计一套导师选择管理系统&#xff0c;帮助学校进行导师选择管理等繁琐又重复的工作&#xff0c;提高工作效率的同时&#xff0c…

三、Jenkins相关操作

Jenkins操作 一、插件管理1.修改公共插件源2.下载中文汉化插件2.1 安装插件2.2 重启2.3 设置为中文 3.远程部署插件 二、用户权限管理1.安装权限插件2.开启权限3.创建角色3.1 Global roles3.2 Item roles 4.创建用户5.给用户分配角色 三、凭证管理四、Git管理1.账号密码方式1.1…

【智能排班系统】雪花算法生成分布式ID

文章目录 雪花算法介绍起源与命名基本原理与结构优势与特点应用场景 代码实现代码结构自定义机器标识RandomWorkIdChooseLocalRedisWorkIdChooselua脚本 实体类SnowflakeIdInfoWorkCenterInfo 雪花算法类配置类雪花算法工具类 说明 雪花算法介绍 在复杂而庞大的分布式系统中&a…

力控机器人原理及力控制实现

力控机器人原理及力控制实现 力控机器人是一种能够感知力量并具有实时控制能力的机器人系统。它们可以在与人类进行精准协作和合作时&#xff0c;将力传感技术&#xff08;Force Sensing Technology&#xff09;和控制算法&#xff08;Control Algorithm&#xff09;结合起来&a…

场景文本检测识别学习 day01(传统OCR的流程、常见的损失函数)

传统OCR的流程 传统OCR&#xff1a;传统光学字符识别常见的的模型主要包括以下几个步骤来识别文本 预处理&#xff1a;预处理是指对输入的图像进行处理&#xff0c;以提高文字识别的准确率。这可能包括调整图像大小、转换为灰度图像、二值化&#xff08;将图像转换为黑白两色&…

4.1.k8s的pod-创建,数据持久化,网络暴露,env环境变量

目录 一、Pod介绍 二、指令创建和管理Pod 三、资源清单创建pod 1.挂载hostPath存储卷 2.NFS存储卷 所有节点安装nfs k8s3编辑NFS配置文件 k8s1&#xff0c;k8s2节点开机挂载 编辑pod资源清单&#xff0c;挂载nfs 四、pod网络暴露 1.hostNetwork使用宿主机的网络 2.…

Struts2的入门:新建项目——》导入jar包——》jsp,action,struts.xml,web.xml——》在项目运行

文章目录 配置环境tomcat 新建项目导入jar包新建jsp界面新建action类新建struts.xml,用来配置action文件配置Struts2的核心过滤器&#xff1a;web.xml 启动测试给一个返回界面在struts.xml中配置以实现页面的跳转&#xff1a;result再写个success.jsp最后在项目运行 配置环境 …