Server-Side JavaScript Injection

Injection JavaScript côté serveur (Server-Side JavaScript Injection)

Théorie

DĂ©finition

L'injection JavaScript côté serveur est une forme spécifique d'injection liée aux bases de données NoSQL. Elle se produit lorsqu'un attaquant parvient à faire exécuter du code JavaScript arbitraire par le serveur dans le contexte de la base de données.


Scénarios d'injection

  • Injection en bande (in-band) : L'attaquant voit immĂ©diatement les rĂ©sultats de son injection.

  • Injection aveugle (blind) : L'attaquant ne voit pas directement les rĂ©sultats mais peut effectuer des dĂ©ductions.

  • Injection hors bande (out-of-band) : Exploitation indirecte, souvent en envoyant les rĂ©sultats de l’injection vers un canal externe.


Exemple concret

Un serveur utilise une requête avec $where pour vérifier un couple username/password :

.find({
  $where: "this.username == \"" + req.body['username'] + "\" && this.password == \"" + req.body['password'] + "\""
});

La méthode find()

db.users.find({...}) : Cette méthode permet de rechercher des documents dans la collection users. Elle renvoie tous les documents correspondant aux critères spécifiés dans l'objet passé en argument.

2. L'opérateur $where

L'opérateur $where permet d'écrire des conditions JavaScript qui sont évaluées pour chaque document dans la base de données.

Dans ce cas, l'expression JavaScript suivante est utilisée pour filtrer les documents :

'this.username == "" || ""=="" && this.password == "" || ""==""'

3. Explication de la condition JavaScript

La condition est divisée en plusieurs parties :

this.username == "" : Cette condition vérifie si le champ username du document est une chaîne vide.

"" == "" : Cette condition est toujours vraie. Elle compare deux chaînes vides, ce qui renverra toujours true.

this.password == "" : Cette condition vérifie si le champ password du document est une chaîne vide.

"" == "" : Encore une fois, cette condition est toujours vraie, comme la précédente.

4. L'ordre des opérations

La condition JavaScript est évaluée en respectant la priorité des opérateurs :
    || (opérateur logique "OU") a une priorité inférieure à && (opérateur logique "ET").

L'expression complète devient :

this.username == "" || true && this.password == "" || true

true && this.password == "" : Cela Ă©value Ă  this.password == "", car true && n'affecte pas la condition qui suit.

this.username == "" || this.password == "" || true : Le tout devient une expression qui est toujours vraie en raison de l'opérateur || true.

5. Effet de la condition

La condition est toujours vraie car le || true final rend l'ensemble de l'expression toujours évaluée à true.
Par conséquent, la requête retourne tous les documents de la collection users, indépendamment des valeurs de username ou password.

Last updated