Respuesta rápida
Web Cache Deception (Omer Gil, 2017) explota que CDNs cachean por extensión de archivo (.css, .js, .png) sin importar el Content-Type real de la respuesta. Atacante pide /account/me.css → la app responde con el HTML del perfil de la víctima → CloudFront ve .css y lo cachea → atacante anónimo pide la misma URL → recibe la página privada cacheada. Funciona contra CloudFront por defecto + apps con routing permisivo. Bounties recurrentes en SaaS Series B+.
1. El concepto en una imagen mental
[Víctima autenticada]
↓ GET /account/me.css
[App] → routing matchea /account/me → renderiza HTML privado con PII
↓ 200 OK, body = HTML del perfil
[CloudFront] → "ah, .css, cacheable" → guarda response en cache key (path)
↓ devuelve a víctima
[Atacante anónimo]
↓ GET /account/me.css
[CloudFront] → cache HIT → devuelve HTML privado SIN ir al origin
El fallo es la combinación de dos comportamientos sueltos benignos:
- La app hace routing permisivo:
/account/me.cssmatchea/account/mey devuelve HTML privado. - CloudFront cachea por extensión sin validar
Content-Typeni cookies.
Ninguna pieza por separado es vulnerable. Juntas → leak masivo.
2. Pre-requisitos para que funcione
| Componente | Condición |
|---|---|
| Routing app | /path/anything.css resuelve a /path o /path/anything (catch-all, optional segments) |
| CloudFront cache rules | Cachea *.css, *.js, *.png, *.jpg etc por extensión sin chequear cookies |
| Respuesta de la app | Devuelve 200 con body sensible (no 301 redirect a /login) |
| Vary header | Falta Vary: Cookie o Cache-Control: private |
La condición #1 es lo que más varía. Frameworks con router catch-all (Express con *, Flask con path:, Rails con globbing routes, Next dynamic routes) son candidatos top.
Sigue leyendo el chain completo
La parte que falta incluye el PoC paso a paso, código de explotación y la cadena completa que llevó al impacto. Disponible para suscriptores.
Practica esto en un lab
Cloudfront Cache Deception
Sigue aprendiendo · cuenta gratis
Guarda tu progreso, desbloquea payloads avanzados y rankea tus flags.
Artículos relacionados
Client-side admin bypass — boolean manipulation + BAC en SPA moderna
Report real Quora: SPA con isAdmin boolean en localStorage que controla UI + backend que no valida server-side. Cómo encadenar boolean flip con BAC para admin takeover.
Cloudflare WAF — payload size bypass, oversized body, plan-specific limits
Bypass de Cloudflare WAF mediante exploitation de body size limits por plan (Free 100kb, Pro 100kb, Business 500kb, Enterprise 1mb): oversize payload trick + chunked transfer encoding.
Headless browsers — SSRF y RCE en endpoints que renderizan URLs
Endpoints que aceptan URLs para screenshots/PDF (Puppeteer, Playwright, wkhtmltopdf) son SSRF goldmine: cloud metadata, file://, gopher://, JS injection con XSS-to-RCE en chromium sandbox.