简述
Rocket.Chat 是一个开源的完全可定制的通信平台,由 Javascript 开发,适用于具有高标准数据保护的组织。
2021年3月19日,该漏洞在 HackerOne 被提出,于2021年4月14日被官方修复。该漏洞主要是因为 Mongodb 的查询语句是类 JSON 形式的,如{"_id":“1”}。由于对用户的输入没有进行严格的检查,攻击者可以通过将查询语句从原来的字符串变为恶意的对象,例如{"_id":{"$ne":1}}即可查询 _id 值不等于 1 的数据。
影响版本
3.12.1<= Rocket.Chat <=3.13.2
漏洞影响面
通过ZoomEye网络空间搜索引擎,搜索ZoomEye dork数据挖掘语法查看漏洞公网资产影响面。
zoomeye dork 关键词:app:“Rocket.Chat”
输入CVE编号:CVE-2021-22911也可以关联出ZoomEye dork
漏洞影响面全球视角可视化
复现
复现环境为 Rocket.Chat 3.12.1。
使用 pocsuite3 编写 PoC,利用 verify 模式验证。
漏洞分析
该漏洞包含了两处不同的注入,漏洞细节可以在这篇文章中找到,同时还可以找到文章作者给出的 exp。第一处在server/methods/getPasswordPolicy.js,通过 NoSQL 注入来泄露重置密码的 token。
getPasswordPolicy(params) {
const user = Users.findOne({
'services.password.reset.token': params.token });
if (!user && !Meteor.userId()) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', {
method: 'getPasswordPolicy',
});
}
return passwordPolicy.getPasswordPolicy();
}
这里的 params 是用户传入的参数,正常来说,params.token 是一串随机字符串,但在这里可以传一个包含正则表达式的查询语句 {’$regex’:’^A’},例如下面这个例子意为查找一处 token 是以大写字母 A 为开头的数据。通过这个漏洞就可以逐字符的爆破修改密码所需的 token。
Users.findOne({
'services.password.reset.token': {
'$regex': '^A'
}
})
第二处漏洞在 app/api/server/v1/users.js,需要登陆后的用户才能访问,通过这处注入攻击者可以获得包括 admin 在内的所有用户的信息。注入点代码如下:
API.v1.addRoute('users.list', {
authRequired: true }, {