Les injections NoSQL avec MongoDB
Les injections NoSQL
Une injection SQL est une forme d'attaque qui consiste à injecter dans la requête SQL en cours un morceau de requête non prévu par le système et pouvant en compromettre la sécurité.
Les injection NoSQL sont exactement la même chose, sauf qu'ils agissent sur une base NoSQL. Or, il existe beaucoup de développeurs qui oublient cela et qui ne valident donc pas les données qu'il reçoivent. Montrons à quel point il est facile de faire une injection Nosql avec MongoDB.
MongoDB permet de définir les requêtes comme des objets javascript, imaginons que nous traitons une requête http de la manière suivante :
app.get('user/find', (requete, resultat) =>
const query = { }
query.username = requete.body.username
Users.find(query).exec().then(r => res.json(r));
);
app.get('user/find', (requete, resultat) => const query = { } query.username = requete.body.username Users.find(query).exec().then(r => res.json(r)); );
Avec ce code, si l'utilisateur rentre le nom 'camille' il trouvera effectivement l'utilisateur ayant pour username camille car la requête sera la suivante :
Cependant, si l'utilisateur entre la chaine de caractère '{$ne :""}' alors cela nous donne la requête suivante :
cette requête demande à afficher tous les utilisateurs ayant un nom d'utilisateur différent de la chaîne de caractère vide, donc l'utilisateur aura accès aux informations de TOUS les utilisateurs.
Pire encore, avant MongoDB 2.4, l'objet $db était accessible par n'importe quel requête, ce qui veut dire qu'il était possible de supprimer complètement une base de données grâce à une injection NoSQL.