Web Cache Poisoning
El Web Cache Poisoning convierte una respuesta maliciosa en contenido cacheado que se sirve a otros usuarios. La caché (CDN, proxy inverso, Varnish) guarda la respuesta usando una clave formada por unos pocos campos de la petición (normalmente método + host + path + query). Si la aplicación refleja en la respuesta algún campo que no forma parte de esa clave (una cabecera "unkeyed"), podemos envenenar la entrada: el atacante manda una vez la petición envenenada y la caché la reparte a todas las víctimas que pidan esa misma URL.
El flujo es: (1) encontrar una entrada unkeyed que se refleje, (2) meter un payload en ella, (3) conseguir que la respuesta se cachee. Cabeceras típicas no incluidas en la clave:
GET /?cb=1 HTTP/1.1
Host: victima
X-Forwarded-Host: atacante.tld
X-Forwarded-Scheme: httpSi el back-end usa X-Forwarded-Host para construir una URL absoluta (un <script src> o un enlace) y esa respuesta se cachea, todas las víctimas cargan el recurso desde el host del atacante. Para provocar el cacheo se usa un parámetro cache buster propio (?cb=) mientras se investiga, y luego la URL real. Herramientas: Param Miner (Burp) descubre cabeceras unkeyed automáticamente.
Según lo que se refleje, el impacto va de un XSS almacenado servido a todos, a una redirección masiva (open redirect) o a un robo de recursos. Cuando la reflexión viene por la cabecera Host, se solapa con el Host header injection.
Cómo detectarlo. En los logs de la caché/CDN, la firma es una respuesta cacheada cuyo contenido depende de una cabecera de petición que no debería influir (X-Forwarded-Host, X-Forwarded-Scheme, X-Host). Un mismo path que empieza a servir contenido con dominios o rutas ajenas, y cabeceras Age/ X-Cache: HIT en respuestas anómalas, delatan el envenenamiento. Vigilar peticiones repetidas con cabeceras X-Forwarded-* raras hacia URLs cacheables.
Defensa. Incluir en la cache key toda entrada que influya en la respuesta (o no reflejar cabeceras no fiables), desactivar el soporte de cabeceras X-Forwarded-* que no se usen, y marcar como Cache-Control: no-store las respuestas que dependan de la petición. Combina con request smuggling para forzar el cacheo de respuestas arbitrarias.