挖掘web程序中的OAuth漏洞:利用redirect_uri和state参数接管账户

本文探讨了攻击者如何利用OAuth漏洞,重点是滥用redirect_uri和state参数以接管用户账户。如果redirect_uri参数验证不严,可能会导致未经授权的重定向到恶意服务器,从而使攻击者能够捕获敏感信息。同样,state参数的错误实现可能使OAuth流程容易受到跨站请求伪造(CSRF)攻击。

Web应用程序开发人员可以通过了解这些漏洞并实施推荐的预防策略,来保护其OAuth实现免受这些常见攻击向量的影响。本文将介绍这些账户接管的方法,因为这两种漏洞在基于OAuth的身份验证中最为常见。让我们开始吧。

1. 通过Open redirection进行OAuth账户接管

通过OAuth 2.0中的redirect_uri参数进行账户劫持是最常见的安全漏洞之一,攻击者可以窃取有效的授权代码或访问令牌,从而获得对受害者数据的未经授权访问。这种攻击利用了redirect_uri参数的错误配置或验证不当,使攻击者能够将用户重定向到恶意服务器。

图片

img

1.1 攻击工作原理

在此攻击中,攻击者的目标是授权代码和访问令牌。通过捕获这些元素,攻击者可以冒充受害者并访问与OAuth服务注册的任何应用程序。理解浏览器在HTTP重定向(301/302响应)中如何处理#后面的URI片段,对于理解此攻击至关重要。

1.2 攻击场景

考虑一个测试网站,允许用户使用社交媒体帐户登录。由于OAuth提供商的配置错误,攻击者可以窃取与其他用户账户关联的授权代码。

① 初始重定向: 当用户尝试访问一个需要登录的安全应用页面(例如,https://security.tecno.com)时,应用程序将其重定向到登录页面。

② 登录后重定向: 成功登录后,应用程序将用户重定向回 https://security.tecno.com。

1.3 漏洞利用

敏感数据(如访问令牌)通常通过 redirect_uri 参数附加到URL中。如果 redirect_uri 被操纵为重定向到攻击者的服务器,则攻击者可以拦截这些数据。

① 攻击者启动OAuth流程,并将 redirect_uri 参数修改为指向他们控制的服务器。

② 在用户登录并授权后,OAuth服务器将用户重定向到恶意 redirect_uri,例如 https://attackerdomain.com

③ 攻击者的服务器从重定向的URL中捕获授权代码或访问令牌。

④ 攻击者使用被窃取的授权代码或访问令牌完成OAuth流程,获得对受害者账户和数据的访问。

有时,重定向URL接受外部URL。如果redirect_uri接受外部URL,攻击者可以利用重定向获得未经授权的访问。例如,使用一个重定向器,如 https://accounts.google.com/signout/chrome/landing?continue=https://appengine.google.com/_ah/logout?continue%3Dhttp://attackerdomain.com,可以允许攻击者将流程引导到他们的服务器。

1.4 OAuth redirect_uri 的常见绕过方法

由于此漏洞源于与开放重定向类似的问题,因此其绕过方法也类似。您可以尝试在实际场景中使用的常见开放重定向绕过方法来规避修复。以下是一些常见的绕过方法:

图片

img

1.5 预防策略

① 严格验证: 确保对 redirect_uri 参数进行严格验证,使用授权URI的白名单。

② 精确匹配: 对 redirect_uri 验证使用精确匹配,避免使用通配符或部分匹配。

③ PKCE: 使用授权码交换的证明密钥(PKCE)为安全性增加一层,特别是针对公共客户端。

通过实施这些预防措施,供应商可以显著降低通过 redirect_uri 或在OAuth流程中不安全重定向导致的OAuth账户接管风险。

2. 通过state参数的CSRF攻击进行账户接管

跨站请求伪造(CSRF)是一种攻击,攻击者诱使用户的浏览器在用户已认证的Web应用程序上执行不必要的操作。在OAuth的上下文中,如果state参数未正确实现,这可能导致未经授权的操作,例如账户接管。

2.1 CSRF在OAuth中的工作原理

攻击者可以利用CSRF操纵OAuth流程,导致用户的浏览器发出执行未经授权操作的请求。对此的一种常见防御措施是使用state参数,它通过确保OAuth流程是由合法客户端发起的来帮助防止CSRF。

2.2 示例攻击场景

为了演示CSRF如何利用OAuth,考虑一个示例攻击,其中攻击者使用缺失或未正确验证的state参数来劫持OAuth过程。

① 攻击者开始与目标授权服务器的OAuth流程以获取授权代码,但在获取代码后停止该过程。

② 攻击者设置一个包含iframe的恶意网站,该iframe指向OAuth客户端的回调URL,并附上攻击者的授权代码:

图片

img

③ 受害者访问恶意网站,他们的浏览器会自动向OAuth客户端的回调URL发送请求,并附带攻击者的授权代码。

④ OAuth客户端错误地使用攻击者的授权代码,以为这是由受害者发起的合法OAuth流程。这使得攻击者能够获得对受害者账户的访问权限。

2.3 社交媒体集成攻击场景

想象一个测试网站,允许用户通过附加他们的社交媒体档案来登录OAuth。如果OAuth流程的实施不安全,攻击者可以利用这一点来劫持其他用户的账户。

① 附加社交媒体账户: 用户点击“附加社交账户”以将他们的社交媒体资料链接到他们的账户。

② 捕获OAuth代码: 攻击者使用自己的凭证登录并捕获包含授权代码的OAuth请求。

③ 丢弃请求: 攻击者生成授权代码,但丢弃请求以防止将他们的账户链接到该资料。

④ 恶意HTML文件: 攻击者创建一个简单的HTML文件,其中包含一个指向带有其授权代码的OAuth回调URL的iframe标签,并将该文件托管在一个服务器上。

⑤ 受害者访问恶意网站: 当受害者访问恶意网站时,他们的浏览器自动发送请求,攻击者的授权代码被链接到受害者的账户。

2.4 使用State参数缓解CSRF

为了缓解这种攻击,OAuth客户端应使用state参数。该参数应为客户端生成的唯一、不可猜测的值,并发送给授权服务器。授权服务器随后将该值返回给客户端,包含在重定向URI中。

① State参数生成: OAuth客户端生成一个唯一的state参数,并将其包含在初始授权请求中。

② State参数验证: 当授权服务器使用授权代码重定向回客户端时,它还包含state参数。

③ State参数检查: OAuth客户端检查返回的state参数是否与其最初生成的参数匹配。如果不匹配或缺失,客户端将以错误结束流程。

实施state参数是防止OAuth中CSRF攻击的关键防御机制。

通过确保state参数在整个OAuth流程中是唯一的并得到验证,客户端可以防止未经授权的操作,维护OAuth流程的完整性。

3. 通过其他OAuth攻击进行账户接管

3.1 令牌重放攻击

令牌重放攻击涉及攻击者截获并重用有效令牌以获得对系统或应用程序的未经授权访问。这种类型的攻击利用了OAuth令牌一旦发出,就可以在过期或被撤销之前访问资源的事实。

3.2 攻击原理

① 令牌拦截: 攻击者在令牌传输过程中捕获有效令牌。这可以通过多种方法实现,例如网络嗅探、中间人(MITM)攻击或利用不安全的通信渠道。

② 令牌重放: 攻击者重用拦截的令牌,以受害者的身份进行身份验证并获得对受保护资源的访问。

3.3 示例攻击场景

① 初始访问: 用户登录应用程序并获得访问令牌。

② 令牌捕获: 攻击者通过MITM攻击或其他手段拦截访问令牌。

③ 令牌使用: 攻击者使用拦截的令牌以受害者的身份发起API请求或访问资源。

④ 未经授权的访问: 攻击者可以执行合法用户能够执行的任何操作,可能访问敏感数据或执行未经授权的操作。

4. 针对“令牌重放攻击”的缓解策略

令牌过期和刷新令牌: 发放短生命周期的访问令牌(例如,5-10分钟);提供可用于在不要求用户重新身份验证的情况下获取新访问令牌的刷新令牌。

与PKCE的令牌绑定: 使用授权码交换的证明密钥(PKCE)将授权码与请求它的客户端绑定。这确保即使授权码被截获,攻击者也无法将其兑换为令牌。

使用安全Cookie: 将令牌存储在安全的HttpOnly Cookie中,以保护其不被在浏览器中运行的JavaScript访问。

5. 结论

OAuth账户接管是一项重大安全威胁。开发人员理解攻击向量并确保严格验证redirect_uri、正确使用state参数、会话管理以及对点击劫持的防御是保护用户账户免受未经授权访问的关键步骤。保护OAuth流程不仅保护用户数据,还维护Web应用程序的完整性和信誉。希望大家记住上述关键安全防御措施!

 

 无偿 获 取 网 安 资 料:

 申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关

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

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

相关文章

Python世界:力扣题解1712,将数组分成三个子数组的方案数,中等

Python世界:力扣题解1712:将数组分成三个子数组的方案数,中等 任务背景思路分析代码实现测试套件本文小结 任务背景 问题来自力扣题目1712. Ways to Split Array Into Three Subarrays,大意如下: A split of an intege…

Java集合基础——针对实习面试

目录 Java集合基础什么是Java集合?说说List,Set,Queue,Map的区别?说说List?说说Set?说说Map?说说Queue?为什么要用集合?如何选用集合? Java集合基础 什么是Java集合? Java集合(Java Collect…

基于单片机的客车载客状况自动检测系统(论文+源码)

1系统整体设计 本课题为客车载客状况自动检测系统,在此以STM32单片机为核心控制器,结合压力传感器、红外传感器、蜂鸣器、语音提示模块、继电器、液晶等构成整个客车载客状况自动检测系统,整个系统架构如图2.1所示,在此通过两个红…

渗透测试(socket,namp,scapy)

socket:可以用来实现不同虚拟机或者不同计算机之间的通信。 socket常用函数: sock.bind(host,port) //host可接受client范围,以及连接的端口 sock.listen()//sever开启监听连接 sock.accpet()//返回 sock,addr 用来接受和发送数据 addr…

【mongodb】数据库的安装及连接初始化简明手册

NoSQL(NoSQL Not Only SQL ),意即"不仅仅是SQL"。 在现代的计算系统上每天网络上都会产生庞大的数据量。这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 通过应用实践证明,关系模型是非常适合于客户服务器…

内网对抗-信息收集篇SPN扫描DC定位角色区域定性服务探针安全防护凭据获取

知识点: 1、信息收集篇-网络架构-出网&角色&服务&成员 2、信息收集篇-安全防护-杀毒&防火墙&流量监控 3、信息收集篇-密码凭据-系统&工具&网站&网络域渗透的信息收集: 在攻防演练中,当完成边界突破后进入内…

OpenWebUI,RAG+外部知识库+AI写文的开源应用

引言 自从去年AI火起来之后,很多人便热衷于寻找适合自用的AI开源项目,把各家大模型API接入到自己的AI程序里,便可以通过AI辅助完成一系列日常任务,比如内容翻译/润色/总结/撰写、格式转换、数据分类、代码分析、角色扮演等等。 …

qt QErrorMessage详解

1、概述 QErrorMessage是Qt框架中用于显示错误消息的一个对话框类。它提供了一个简单的模态对话框,用于向用户显示错误或警告消息。QErrorMessage通常用于应用程序中,当需要向用户报告错误但不希望中断当前操作时。它提供了一个标准的错误消息界面&…

一文了解Android的Doze模式

Android 的 Doze 模式是一项省电功能,主要用于减少设备的功耗,特别是在屏幕关闭且设备长时间未被使用的情况下。Doze 模式在 Android 6.0(API Level 23)首次引入,并在后续版本中不断改进,以便更智能地管理后…

美团代付微信小程序系统 read.php 任意文件读取漏洞复现

0x01 产品简介 美团代付微信小程序系统是美团点评旗下的一款基于微信小程序技术开发的应用程序功能之一,它允许用户方便快捷地请求他人为自己支付订单费用。随着移动支付的普及和微信小程序的广泛应用,美团作为中国领先的本地生活服务平台,推出了代付功能,以满足用户多样化…

SpringBoot-员工管理系统(1)

目录 一、首页配置 二、国际化 2.1 配置文件编写 2.2 使配置文件生效 2.3 配置页面国际化值 2.4 实现根据按钮自动切换中英文 三、登录拦截器 一、首页配置 1、所有页面的静态资源都需要用thymeleaf接管 2、url使用{}格式 二、国际化 2.1 配置文件编写 1、在resourc…

JavaSE:初识Java(学习笔记)

java是高级语言的面向对象语言 .[最贴近生活.最快速分析和设计程序] 一,计算机语言发展历史 二,Java体系结构 1,JavaSE(Java Standard Edition) 标准版,定位在个人计算机上的应用 这个版本是Jav…

Android——多线程、线程通信、handler机制

Android——多线程、线程通信、handler机制 模拟网络请求&#xff0c;会阻塞主线程 private String getStringForNet() {StringBuilder stringBuilder new StringBuilder();for (int i 0; i < 100; i) {stringBuilder.append("字符串" i);}try {Thread.sleep(…

Jumpserver

概述 一款开源的堡垒机&#xff0c;可使系统的管理员和开发人员安全的连接到企业内部服务器上执行操作&#xff0c;是一款非常安全的远程连接工具。 4A 身份验证授权控制账号管理安全审计 安装 [rootjumpserver project]# tar -xf jumpserver-offline-installer-v2.28.6-amd64…

【专题】2024年全球生物医药交易报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38191 在当今复杂多变的全球经济环境下&#xff0c;医药行业正面临着诸多挑战与机遇。2024 年&#xff0c;医药行业的发展态势备受关注。 一方面&#xff0c;全球生物医药交易活跃&#xff0c;2021 - 2023 年的交易中&#xff0c;已…

统信UOS开发环境支持rust

集成了Rust编译器和包管理工具,支持系统级编程、网络应用等多场景,为开发者提供丰富的库支持。 文章目录 一、环境部署1. rust开发环境安装2. rust开发环境配置二、代码示例三、常见问题1. 借用和所有权问题2. 编译器错误和警告一、环境部署 1. rust开发环境安装 rust是一门…

Addressables资源打包(AA包)代码中改变远程地址

接着上一篇“Unity资源打包Addressable AA包” 还是先贴代码 LoadPath.cs 中定义一个远程服务器的地址&#xff0c;这个地址将来在代码中会修改 namespace HFS {public class LoadPath{public static string Path "http://172.18.216.168:6565/HFS/1/";} } 远程服…

linux基础-完结(详讲补充)

linux基础-完结 一、Linux目录介绍 二、基础命令详细讲解 1. ls&#xff08;列出目录内容&#xff09; 2. cd&#xff08;更改目录&#xff09; 3. clear&#xff08;清除终端屏幕&#xff09; 4. pwd(显示你当前所在的目录) 5. vim(文本编辑器) 6. touch&#xff08;创…

开启鸿蒙开发之旅:准备篇

写在前面 Q:为什么要学习鸿蒙&#xff1f; A:没有特定的理由&#xff0c;有可能是因为大环境不好的原因&#xff0c;大家越来越卷&#xff0c;技术革新越来越快&#xff0c;如果手里多掌握一门技术&#xff0c;心里会更有底气一些。再一个自己只有前端开发经验&#xff0c;平时…

倒计时3天 | 2024 CCF中国开源大会仪式解读

点击蓝字 关注我们 CCF Opensource Development Committee CCF 大会简介 2024 CCF中国开源大会&#xff08;CCF ChinaOSC&#xff09;将于2024年11月9日至10日在深圳召开。本届大会由中国计算机学会主办&#xff0c;CCF开源发展委员会、鹏城实验室、新一代人工智能产业技术创新…