账号被盗?!我居然试了IDOR [HackTheBox Armaxis 评测]

账号被盗?!我居然试了IDOR [HackTheBox Armaxis 评测]

人们通常认为,只要实施身份验证和令牌等机制,Web应用程序就一定“安全”。
然而,实际上,决定哪些用户数据可以被访问),都可能直接导致账户被劫持。

具体来说,IDOR(不安全直接对象引用)漏洞是指当用户输入直接用于引用内部对象时发生的漏洞,即使存在身份验证和令牌,该漏洞也可能发生。
因此,攻击者可能利用该漏洞操纵他人的帐户或窃取其权限。

在本文中,我们将以 Hack The Box 的 CTF 挑战Armaxis为例,实际重现潜伏在密码重置功能中的 IDOR 恶意软件,并研究如何实现帐户劫持。

目录

关于 HackTheBox

这次我们其实是HackTheBox(HTB)来验证漏洞。

HackTheBox 是一个实践型 CTF 平台,参赛者可以在各种安全领域进行练习,包括 Web 应用程序、服务器和网络。
其最大的特点是参赛者可以通过实际访问将被攻击的设备和应用程序并亲自动手来学习。

这次我们要介绍的ArmaxisHackTheBox 之前提供的挑战类别目前VIP 或更高级别(请注意,免费计划用户只能访问活跃的挑战)。

还有各种类别的机器和挑战,包括 Web、逆向、Pwn 和取证,因此您可以根据自己的水平来应对它们。

如果您想认真磨练使用 HackTheBox 的技能,请务必VIP 计划并充分利用过去的机器和挑战。

👉 点击此处访问 HackTheBox 官方网站

只有从攻击者的角度练习才能掌握安全性

仅仅阅读参考资料是不够的。真正进行攻击,才能真正理解为什么某些东西容易受到攻击以及如何保护它。

HackTheBox提供了一个训练环境,您可以在虚拟机上安全地体验漏洞。
即使是初学者,也可以逐步学习如何像攻击者一样思考。

  • 基于现实攻击场景的虚拟机演习
  • 解决各种漏洞,包括 RCE、SQLi 和 XSS
  • VIP 计划可让您使用旧机器

*HackTheBox学院(教学材料)和实验室(练习环境),两者的计费结构有所不同。
对于希望专注于练习的用户,我们强烈推荐实验室 VIP 或更高级别的方案。

👉 有关如何注册 HackTheBox 以及各个计划之间的差异的详细信息,请单击此处。

挑战总结: Armaxis

是一个基于Web应用程序的CTF任务,其背景设定为
虚构的武器控制系统“Armaxis”。参赛者以普通用户的身份访问该系统,探索其功能并利用漏洞。

除了用户注册和登录功能外,Armaxis 还提供密码重置功能仅限管理员使用的武器派发功能
派发武器时,用户可以在备注栏输入 Markdown 格式的文本,内容会在服务器端进行处理后保存并显示。

乍看之下,这似乎是一个典型的Web应用程序,但密码重置过程中的用户授权检查实现得不够完善在某些情况下不安全的直接对象引用(IDOR)
利用此漏洞,攻击者可以操作其他用户,甚至是管理员帐户,而这本不应该发生。

获得管理员权限可以解锁新的功能和额外的攻击面,最终
使玩家能够利用多个设计缺陷的连锁反应来获取有关服务器的信息。

观点

  • 挑战类型:Web应用程序
  • 漏洞:IDOR、LFI
  • 攻击序列:
    • 以普通用户身份调查各项功能
    • 利用密码重置流程中的漏洞获取权限(IDOR)
    • 访问管理员功能并发现更多攻击面
    • 窃取内部服务器信息 (LFI)
  • 你能学到什么
    • 身份验证和授权之间的区别
    • IDOR是如何建立的

什么是IDOR?

在讨论 Web 应用程序安全时,身份验证授权经常被混淆
但正确区分它们对于理解 IDOR 至关重要。

你是谁的机制,登录处理和令牌验证都发挥着这一作用。
另一方面,授权是一种确定你被允许做什么

IDOR(不安全直接对象引用)漏洞是缺少授权检查时发生的漏洞
当用户指定的值(例如 ID、电子邮件地址或文件名)被用于直接引用服务器中的对象,但未验证该对象是否真正属于该用户时,就会发生 IDOR 漏洞。

值得注意的是,即使存在身份验证,IDOR 仍然有效
如果未对引用的对象执行授权检查,则登录或拥有有效令牌毫无意义。

例如,如果某个实现方式在搜索或更新用户信息的请求中使用电子邮件地址,
那么只需替换输入值,就有可能篡改他人的帐户。
这是典型的IDOR攻击。

本文讨论的 CTF 挑战“Armaxis”的密码重置功能也缺少这种授权检查,
最终导致了账户劫持。

我真的试过IDOR!

在发起攻击之前,我们先来检查一下屏幕。

第一个是名为 Armaxis 的系统的登录界面。
管理员用户和普通用户似乎都使用同一个登录界面。

第二个是邮箱。这里准备的是攻击者的电子邮件地址。test
@email.htb 是我们的电子邮件地址,我们来检查一下。

侦察阶段:在 test@email.htb 创建帐户

首先,我们使用提供的邮箱地址 test@email.htb 创建一个账户。
注册很简单,只需输入您的邮箱地址和密码,然后点击“注册”按钮即可。

如果您注册成功,您将看到“注册成功”的消息。

注册完成后,请尝试登录。

此时应该显示“尚未派遣任何武器”。
之后,您可能会获得管理员权限,并开始向此帐户派遣武器。

侦察阶段:源代码审查

侦察阶段仍在继续,让我们来看看源代码。

我四处查看时,发现“/reset-password”中的实现引起了我的注意。

router.post("/reset-password", async (req, res) => { const { token, newPassword, email } = req.body; // 添加 'email' 参数 if (!token || !newPassword || !email) return res.status(400).send("Token、email 和新密码是必需的。"); try { const reset = await getPasswordReset(token); if (!reset) return res.status(400).send("Token 无效或已过期。"); const user = await getUserByEmail(email); if (!user) return res.status(404).send("用户未找到。"); await updateUserPassword(user.id, newPassword); await deletePasswordReset(token); res.send("密码重置成功。"); } catch (err) { console.error("重置密码时出错:", err); res.status(500).send("重置密码出错。"); } });

看起来一切正常,直到我检查令牌,但似乎该令牌没有关联任何用户,所以我尝试通过电子邮件地址获取用户。
我们来检查一下 getUserByEmail 函数。

async function getUserByEmail(email) { const query = `SELECT * FROM users WHERE email = ?`; try { const user = await get(query, [email]); return user; } catch (error) { throw error; } }

我检查SQL语句时发现,它似乎只能通过电子邮件地址检索用户。

updateUserPassword 函数会使用从邮件中获取的用户 ID 和新密码进行调用。
我们也来验证一下。

async function updateUserPassword(id, newPassword) { const query = `UPDATE users SET password = ? WHERE id = ?`; try { await run(query, [newPassword, id]); } catch (error) { throw error; } }

由于对令牌没有特别的控制,我们发现可以使用电子邮件和 newPassword 参数更改其他用户的密码。

此外,源代码中包含管理员的电子邮件地址。
请记下“admin@armaxis.htb”,因为您将来需要使用它来登录管理员帐户。

侦察阶段:检查实际的密码更改请求

接下来,我们实际操作一下屏幕,确认密码更改请求。
登录屏幕上有一个“忘记密码?”的选项,点击它即可进入重置密码页面。

让我们尝试使用
提供的电子邮件地址“ test@email.htbtest@email.htb ”并单击“请求代码”按钮。

屏幕上将出现一个对话框,要求您输入令牌和新密码。

您可以通过重新加载邮箱来检查令牌。

当我尝试通过输入令牌和新密码来更新密码时,我发现发送了以下请求。

如果您能够按照如下所示设置每个参数,您应该能够更改管理员密码。

  • token:由 test@email.htb
  • 电子邮件:管理员的电子邮件地址
  • 新密码:任意密码

现在我们已经掌握了所有信息,让我们根据这些信息发起攻击吧。

攻击阶段:接管管理员帐户

让我们利用 IDOR 漏洞,使用 test@email.htb 颁发的令牌来更改管理员帐户的密码,并接管管理员帐户。

首先,使用“test@email.htb”获取令牌。

看到这个页面后,你应该已经在邮箱中收到令牌了。

它安全送达了。(我不小心按了两次按钮,所以有三封邮件。)

现在,让我们用以下信息修改JSON:

  • token:之前获取的 test@email.htb 的 token。
  • newPassword:任意密码(测试)
  • 电子邮件:admin@armaxis.htb(管理员电子邮件地址)

现在你应该能够使用来自 test@email.htb 的令牌发送更改另一个帐户密码的请求。

响应状态码是 200 OK,所以我觉得一切顺利。
我们来屏幕上确认一下。

输入电子邮件地址 admin@armaxis.htb,输入您在 newPassword 中设置的密码,然后单击“登录”按钮。

现在我们已经劫持了管理员账号!
既然我们已经拿到了派遣武器,就可以用它来夺取旗帜了。

奖励:使用 LFI 获取 Flag

由于本文重点讨论 IDOR,我将简要概述后续步骤。

首先,屏幕上有一个可以输入 Markdown 代码的字段。这次,我们将使用这个 Markdown 字段来加载服务器上一个通常无法通过本地文件包含 (LFI) 访问的文件。

命令“COPY flag.txt /flag.txt”告诉我们 flag.txt 位于根目录下。

# 使用基于 Alpine Linux 的 Node.js 基础镜像 FROM node:alpine # 安装 MailHog 和 supervisord 所需的依赖项 RUN apk add --no-cache \ wget \ supervisor \ apache2-utils \ curl \ build-base # 安装 MailHog 二进制文件 WORKDIR / RUN wget https://github.com/mailhog/MailHog/releases/download/v1.0.1/MailHog_linux_amd64 RUN chmod +x MailHog_linux_amd64 # 准备邮件目录并复制应用程序文件 RUN mkdir -p /email COPY email-app /email WORKDIR /email RUN npm install # 生成随机密码并为 MailHog 创建身份验证文件 RUN RANDOM_VALUE=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1) \ && htpasswd -nbBC 10 test "$RANDOM_VALUE" > /mailhog-auth \ && echo $RANDOM_VALUE > /email/password.txt # 设置主应用程序的工作目录 WORKDIR /app # 复制挑战文件并安装依赖项 COPY challenge . RUN npm install # 复制 supervisord 配置 COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 为应用程序和邮件客户端暴露端口 EXPOSE 8080 EXPOSE 1337 COPY flag.txt /flag.txt # 启动 supervisord CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

Markdown 可以使用“![](路径)”显示图像。
通常情况下,你会在这里放置图像路径,但我们不妨尝试在这里设置文本。

另外,请将路径设置为 file:// 而不是 image://。

![flag](file:///flag.txt)

创建 Dispatch Weapon 后,使用 test@email.htb 登录。

当然,图像不会显示,但您会在 Elements 中看到一些 Base64 编码的文本。

<img src="data:image/*;base64,SFRCe200cmtkMHduX2J1Z3NfMW5fdGgzX3cxbGQhfQo=" alt="嵌入式图像">

咱们来解码一下,你想用什么方法都行。
我用Cyber​​Chef。

我们成功获取了flag!这次获取的是flag.txt文件,但如果有人获取的是密码文件或其他类似文件,可能会导致严重问题,所以务必小心。

应对措施:如何防止IDOR?

Armaxis 遇到的 IDOR 问题并非令牌生成方法或随机性本身的问题,而是缺乏授权检查。因此,仅仅“加强令牌强度”是不够的。

下面我们将根据这个案例研究总结一些切实可行的措施。

不要依赖客户端输入来获取对象引用

最重要的不要将客户端输入(例如电子邮件地址或 ID)用作对象引用

在这个密码重置过程中,请求中包含的电子邮件地址被用于查找需要更新的用户。
这种设计使得任何人都可以通过替换输入值来篡改他人的帐户。

最初需要更新的用户包括:

  • 已登录用户信息
  • 与令牌关联的用户 ID

服务器端可确定的信息做出,例如

我亲眼见过很多应用程序实际上使用依赖于客户端输入的对象引用来运行,所以开发时一定要谨慎。

将令牌视为“操作许可”而非“身份验证”。

密码重置令牌的功能不仅限于检查密码是否有效。

  • 这枚代币发给谁的?
  • 该用户是否正在使用该功能?

必须在服务器端进行验证

在本问题中,虽然检查了令牌,但忽略了有关令牌被授权操作哪个用户的

不应被视为“身份证明”,而应“授权特定用户执行特定操作的密钥”。

当你抱着一种轻松随意的态度进行开发,认为只要发行代币就万事大吉时,往往会出现这种情况。我认为
很多工程师在开发时并没有真正理解代币的意义。

更严格地检查管理员功能和异常处理流程

密码重置和仅限管理员使用的功能等特殊流程往往比正常流程授权更宽松,
但实际上,这些特殊流程是攻击的起点

  • 密码重置
  • 账户恢复
  • 仅限管理员操作

这类功能需要明确设计和实施,规定谁可以操作谁的数据以及为什么。

此外,由于公众有时可能会比较松懈,因此将仅限管理员使用的功能放在单独的系统中可能是一个好主意。

摘要:IDOR与授权设计的陷阱

在此挑战中,,在密码重置功能中,如果仅依赖用户输入而没有进行充分的授权检查,会导致账户被盗用。即使使用了令牌和身份验证,也仅靠这些措施不足以确保安全。

问题的本质在于服务器没有确定“它有权操作哪些人的数据”。
直接使用电子邮件地址作为对象引用的设计就是导致IDOR的典型例子。

为防止IDOR攻击,必须在服务器端唯一确定操作目标,并显式检查每个进程的授权。
这并非特殊措施,而是一项基本设计原则。

通过实际参与 CTF 比赛,我才意识到授权失败的问题确实存在。
如果你感兴趣,我建议你Hack the Box

只有从攻击者的角度练习才能掌握安全性

仅仅阅读参考资料是不够的。真正进行攻击,才能真正理解为什么某些东西容易受到攻击以及如何保护它。

HackTheBox提供了一个训练环境,您可以在虚拟机上安全地体验漏洞。
即使是初学者,也可以逐步学习如何像攻击者一样思考。

  • 基于现实攻击场景的虚拟机演习
  • 解决各种漏洞,包括 RCE、SQLi 和 XSS
  • VIP 计划可让您使用旧机器

*HackTheBox学院(教学材料)和实验室(练习环境),两者的计费结构有所不同。
对于希望专注于练习的用户,我们强烈推荐实验室 VIP 或更高级别的方案。

👉 有关如何注册 HackTheBox 以及各个计划之间的差异的详细信息,请单击此处。

如果愿意,请分享!

谁写了这篇文章

这是我开始研究信息安全的博客。作为一名新员工,如果您能宽阔地看着,我会很高兴。
还有Teech Lab,这是一个学习编程乐趣的机会,因此,如果您对软件开发感兴趣,请务必看看!

目录