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.
La checklist que repaso en cada objetivo nuevo
47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.
Te das de baja en un clic, desde cualquier correo.
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.
