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