Verifique que la entrada sea una cadena, ¿es segura?

1

Estaba intentando descubrir cómo prevenir las inyecciones de MongoDB, y encontré this . Por lo tanto, el código vulnerable aquí es

app.post('/', function (req, res) {
        db.users.find({username: req.body.username, password: req.body.password}, function (err, users) { // This line!
            // TODO: handle the rest
        });
});

¿Puedo protegerme contra una inyección de MongoDB al verificar que el nombre de usuario y la contraseña de POST body son cadenas y no objetos?

¿Hay otras formas de inyectar datos en una base de datos MongoDB?

    
pregunta Bennett 20.07.2017 - 22:18
fuente

1 respuesta

1

Sí, verificar que la entrada es una cadena la desinfectará.

MongoDB no analiza cadenas, solo JSON. Un ataque común en MongoDB es:

{"$gte":""}

Cuando se coloca en una consulta, esto devolverá todos los objetos. Un atacante puede pasar esto como un parámetro, y algunos analizadores lo expandirán automáticamente a un objeto, lo que hará que su JSON tenga este aspecto

{
    username: "root",
    password: { $gte: ""}
}

Cuando se ejecuta este comando de búsqueda, devolverá al usuario root aunque no se haya proporcionado una contraseña. (Nota: no verifique contraseñas como esta)

Este es un ejemplo donde nos aseguramos de que la entrada sea una cadena

{
    username: "root",
    password: "{\"$gte\":\"\"}"
}

Como puede ver, no hay inyección, y estamos literalmente buscando esa contraseña.

    
respondido por el zzarzzur 21.07.2017 - 00:03
fuente

Lea otras preguntas en las etiquetas