# Web Cache Poisoning

Para economizar largura de banda e melhorar a velocidade, aplicações web usam **caches** (como Cloudflare, Varnish ou Akamai). O cache armazena cópias de respostas do servidor para que não precisem ser processadas novamente. Os ataques de cache exploram falhas na forma como o cache decide o que armazenar e o que servir para outros usuários.

## Web Cache Poisoning (Envenenamento de Cache)

O objetivo é fazer o cache armazenar uma resposta maliciosa que será servida para outros usuários legítimos que acessarem a mesma URL.

### Mecanismo: Keyed vs Unkeyed Inputs

* **Keyed Input:** Partes da requisição que o cache usa para identificar um recurso (geralmente o Host e a URL).
* **Unkeyed Input:** Cabeçalhos ignorados pelo cache (ex: `X-Forwarded-Host`, `User-Agent`, `Cookie`).

### O ataque

{% stepper %}
{% step %}

### O atacante envia uma requisição com um cabeçalho "Unkeyed" malicioso

```http
GET /home HTTP/1.1
Host: site-real.com
X-Forwarded-Host: static.malicioso.com
```

{% endstep %}

{% step %}

### O servidor usa esses dados para gerar o HTML

Ex: carregar um script:

```html
<script src="https://static.malicioso.com/js.js">
```

{% endstep %}

{% step %}

### O cache armazena a resposta maliciosa

O cache vê o request para `/home` (Keyed input), nota que não tem no cache, e salva a resposta maliciosa.
{% endstep %}

{% step %}

### Usuários legítimos recebem a versão contaminada

Qualquer usuário que acessar `site-real.com/home` receberá a versão com o script do atacante.
{% endstep %}
{% endstepper %}

## Web Cache Deception (Engano de Cache)

O objetivo é enganar o cache para que ele armazene dados **sensíveis e privados** de uma vítima em uma URL pública acessível ao atacante.

### O ataque

{% stepper %}
{% step %}

### O atacante induz a vítima a acessar uma URL inexistente com extensão estática

`https://site.com/api/user/private/profile/test.jpg`
{% endstep %}

{% step %}

### O servidor retorna os dados privados

O servidor (se mal configurado) ignora o `.jpg` e retorna os dados privados do perfil do usuário.
{% endstep %}

{% step %}

### O cache interpreta como conteúdo estático

O cache vê a extensão `.jpg` e pensa: "Isso é uma imagem estática, vou cachear para todo mundo".
{% endstep %}

{% step %}

### O atacante acessa a mesma URL

O atacante acessa a mesma URL `.../profile/test.jpg` e o cache entrega os dados privados da vítima para ele.
{% endstep %}
{% endstepper %}

## Técnicas de Exploração

### 1. Descoberta de Cabeçalhos (Param Miner)

Use a extensão **Param Miner** do Burp Suite. Ela tenta "chutar" nomes de cabeçalhos ocultos que o servidor pode estar processando mas o cache ignora (Unkeyed).

### 2. Exploração de Cookies

Se o cache ignorar o cabeçalho `Cookie` no cálculo da chave, mas o servidor usá-lo para refletir dados na página:

```http
GET / HTTP/1.1
Cookie: theme=dark<script>alert(1)</script>
```

Se a resposta for cacheada, o XSS será servido para todos.

## Cenários de Exploração Prática

### Cenário A: Redirecionamento de JS via Host

Muitos proxies transmitem o `X-Forwarded-Host`. Ao injetar um domínio controlado por você, você pode forçar a página a carregar scripts, estilos ou redirecionar o login para o seu servidor.

### Cenário B: Roubo de API Key

Em muitos frameworks, se você adicionar um sufixo inexistente como `;css` ao final de uma rota de API, o servidor ainda processa a rota original mas o cache trata como arquivo estático e armazena o JSON contendo a Key da vítima.

## Detecção e Ferramentas

| Ferramenta                        | Função                                                                |
| --------------------------------- | --------------------------------------------------------------------- |
| **Param Miner**                   | Identificar parâmetros de cabeçalho "não chavados" (unkeyed) no Burp. |
| **Cache Warmer/Buster**           | Testar se o cache está servindo uma versão nova ou antiga da página.  |
| **Pura observação de cabeçalhos** | Procure por `X-Cache: HIT`, `CF-Cache-Status`, `Age`.                 |

## Mitigação e Prevenção

### 1. Para Cache Poisoning

* **Key Everything:** Inclua todos os cabeçalhos que influenciam a resposta na chave do cache (embora reduza a eficiência do cache).
* **Normalização de Cabeçalhos:** Configure o cache para remover ou ignorar cabeçalhos `X-Forwarded-*` não confiáveis.
* **Vary Header:** Use o cabeçalho `Vary` para informar ao cache quais campos da requisição devem ser considerados para a unicidade do conteúdo.

### 2. Para Cache Deception

* **Strict Extensions:** Garanta que o servidor retorne 404 se a extensão do arquivo não coincidir com o tipo de dado real.
* **Cache-Control: Private:** Sempre use o cabeçalho `Cache-Control: no-store, private` em endpoints que retornam dados sensíveis de usuários.

{% hint style="danger" %}
Ataques de cache são devastadores pois um único request bem sucedido pode afetar milhares de usuários simultaneamente, transformando uma falha de "uma vítima" em um ataque de "infraestrutura".
{% endhint %}


---

# Agent Instructions: 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:

```
GET https://0xmorte.gitbook.io/bibliadopentestbr/tecnicas/web/server-side-infraestrutura-web/web-cache-poisoning.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
