MongoDB NoSQL 注入 - Node.js
MongoDB NoSQL Injection - Node.js
我正在使用 MongoDB 4.2 和 Express > 4。
我正在尝试使用 node.js 执行 NoSQL 注入。这是带有用户名和密码的表单的 .ejs 代码:
<body>
<form action="/login_db/login_db" method="POST" >
<input placeholder="name" name="name"> </br>
<input placeholder="password" name="password"> </br>
<input type="submit" value="submit" id="submit">
</form>
</body>
我有一个本地 MongoDB 数据库,用户可以通过数据库访问。这是 .js 代码:
const MongoClient = require("mongodb").MongoClient;
const ObjectID = require('mongodb').ObjectID;
const dbname = "mydb";
const url = "mongodb://localhost:27017";
const mongoOptions = {useNewUrlParser : true};
const state = {
db : null
};
const connect = (cb) =>{
if(state.db)
cb();
else{
MongoClient.connect(url,mongoOptions,(err,client)=>{
if(err)
cb(err);
else{
state.db = client.db(dbname);
cb();
}
});
}
}
const getPrimaryKey = (_id)=>{
return ObjectID(_id);
}
const getDB = ()=>{
return state.db;
}
module.exports = {getDB,connect,getPrimaryKey};
这是 .js login_db-route.js:
"use strict"
const router = require('express').Router();
const db = require("../db");
const mongoose = require('mongoose');
const passport = require('passport');
const express = require('express');
const collection = "amministrazione";
const app = express()
const path = require('path');
var bodyParser = require('body-parser')
router.get('/login_db', function(req,res){
console.log('login request');
var cursor = db.getDB().collection(collection).find().toArray(function(err, results) {
res.render('login_db.ejs', {quotes: results, user: req.user});
});
});
router.post('/login_db', function (req, res) {
console.log('login post request');
var name = req.body.name;
var password = req.body.password;
db.getDB().collection(collection).findOne({"name" : name, "password" : password}, (err, result) =>{
if(result == null || result.length == 0){
console.log('user not found '+ err);
return res.render('login_db.ejs',{user: req.user});
}
console.log('User found' + result);
db.getDB().collection(collection).find().toArray((err, result)=>{
if(err) return console.log(err)
res.render('book.ejs', {quotes:result,user: req.user, flag: true});
})
})
});
module.exports = router;
我写的代码容易受到nosql注入的影响,但是当我尝试向表单中插入一个MongoDB Payload时,例如:
{ $gt : "a" }
{ $gt : "a" }
我无法登录成功。问题出在哪里?有没有办法不考虑 " ?
感谢所有帮助过我的人。
这是您的代码。
var name = req.body.name;
var password = req.body.password;
db.getDB().collection(collection).findOne({"name" : name, "password" : password});
如果传递这些参数,mongodb 查询将是这样的。
db.getDB().collection(collection).findOne({"name" : "{ $gt : \"a\" }", "password" : "{ $gt : \"a\" }"});
如果您想将这些参数作为查询而不是字符串传递,您可以像这样添加一些代码。
var name = req.body.name;
var password = req.body.password;
try {
name = JSON.parse(name);
} catch (e){}
try {
password = JSON.parse(password);
} catch (e){}
db.getDB().collection(collection).findOne({"name" : name, "password" : password });
我正在使用 MongoDB 4.2 和 Express > 4。
我正在尝试使用 node.js 执行 NoSQL 注入。这是带有用户名和密码的表单的 .ejs 代码:
<body>
<form action="/login_db/login_db" method="POST" >
<input placeholder="name" name="name"> </br>
<input placeholder="password" name="password"> </br>
<input type="submit" value="submit" id="submit">
</form>
</body>
我有一个本地 MongoDB 数据库,用户可以通过数据库访问。这是 .js 代码:
const MongoClient = require("mongodb").MongoClient;
const ObjectID = require('mongodb').ObjectID;
const dbname = "mydb";
const url = "mongodb://localhost:27017";
const mongoOptions = {useNewUrlParser : true};
const state = {
db : null
};
const connect = (cb) =>{
if(state.db)
cb();
else{
MongoClient.connect(url,mongoOptions,(err,client)=>{
if(err)
cb(err);
else{
state.db = client.db(dbname);
cb();
}
});
}
}
const getPrimaryKey = (_id)=>{
return ObjectID(_id);
}
const getDB = ()=>{
return state.db;
}
module.exports = {getDB,connect,getPrimaryKey};
这是 .js login_db-route.js:
"use strict"
const router = require('express').Router();
const db = require("../db");
const mongoose = require('mongoose');
const passport = require('passport');
const express = require('express');
const collection = "amministrazione";
const app = express()
const path = require('path');
var bodyParser = require('body-parser')
router.get('/login_db', function(req,res){
console.log('login request');
var cursor = db.getDB().collection(collection).find().toArray(function(err, results) {
res.render('login_db.ejs', {quotes: results, user: req.user});
});
});
router.post('/login_db', function (req, res) {
console.log('login post request');
var name = req.body.name;
var password = req.body.password;
db.getDB().collection(collection).findOne({"name" : name, "password" : password}, (err, result) =>{
if(result == null || result.length == 0){
console.log('user not found '+ err);
return res.render('login_db.ejs',{user: req.user});
}
console.log('User found' + result);
db.getDB().collection(collection).find().toArray((err, result)=>{
if(err) return console.log(err)
res.render('book.ejs', {quotes:result,user: req.user, flag: true});
})
})
});
module.exports = router;
我写的代码容易受到nosql注入的影响,但是当我尝试向表单中插入一个MongoDB Payload时,例如:
{ $gt : "a" }
{ $gt : "a" }
我无法登录成功。问题出在哪里?有没有办法不考虑 " ?
感谢所有帮助过我的人。
这是您的代码。
var name = req.body.name;
var password = req.body.password;
db.getDB().collection(collection).findOne({"name" : name, "password" : password});
如果传递这些参数,mongodb 查询将是这样的。
db.getDB().collection(collection).findOne({"name" : "{ $gt : \"a\" }", "password" : "{ $gt : \"a\" }"});
如果您想将这些参数作为查询而不是字符串传递,您可以像这样添加一些代码。
var name = req.body.name;
var password = req.body.password;
try {
name = JSON.parse(name);
} catch (e){}
try {
password = JSON.parse(password);
} catch (e){}
db.getDB().collection(collection).findOne({"name" : name, "password" : password });