Extraction de champs inconnus avec des opérateurs NoSQL

Exploiting NoSQL operator injection to extract unknown fields

La fonctionnalité de recherche d’utilisateur de ce laboratoire repose sur une base de données NoSQL MongoDB. Elle est vulnérable à une injection NoSQL. L’objectif est de se connecter en tant que carlos.

Contexte initial

On dispose d’une fonctionnalité Forgot password.

La requête envoyée en POST vers /forgot-password ressemble à ceci :

Test d’injection NoSQL sur le login

Lors d’une tentative d’injection NoSQL sur le formulaire de connexion :

Le compte est bloqué et le message suivant apparaît :

Account locked: please reset your password

Contournement du blocage avec $where

On observe que l’ajout du champ $where est interprété par le serveur :

  • Si $where vaut 1 → le compte reste bloqué

  • Si $where vaut 0 → le blocage disparaît

Exemple :

Cela confirme que l’opérateur $where est exécutable.

Limitation et changement de stratégie

L’idée initiale serait d’utiliser $where pour vérifier directement le mot de passe, par exemple :

Cependant, le compte étant verrouillé, cette approche n’est pas exploitable. Il faut donc passer par une réinitialisation de mot de passe.

Énumération des champs de l’objet utilisateur

On utilise $where pour énumérer les clés de l’objet utilisateur avec :

Requête complète :

  • X : position du caractère (0 à 20)

  • Y : caractères testés (a-z, A-Z, 0-9)

Attaque envoyée via Intruder avec Cluster Bomb

Résultats de l’énumération des champs

En se basant sur la longueur de la réponse (Content-Length) :

  • Object.keys(this)[0]id

  • Object.keys(this)[1]username

  • Object.keys(this)[2]password

  • Object.keys(this)[3]email

  • Object.keys(this)[4]passwordReset

Le champ passwordReset n’apparaît que si une réinitialisation de mot de passe a été déclenchée pour carlos.

Confirmation du champ passwordReset

Accès à l’endpoint :

Réponse :

Invalid token

Le champ existe bien

Énumération du token passwordReset

On passe ensuite à l’extraction de la valeur du token :

  • X : position du caractère

  • Y : caractères possibles

  • Envoi via Intruder (Cluster Bomb)

Résultat

Le token de réinitialisation de carlos est récupéré :

Exploitation finale

Avec ce token, il est possible d’accéder à la fonctionnalité de réinitialisation du mot de passe et de définir un nouveau mot de passe pour carlos, permettant ainsi de se connecter à son compte et de valider le laboratoire.

Mis à jour