← Writeups

Exploiting origin server normalization for web cache deception

Web cache deception vía normalización del origin: el cache cachea todo lo que empieza por /resources mientras el origin resuelve traversal y sirve /my-account, guardando la API key en la caché.

Target Overview & Vulnerability Summary

El objetivo es obtener la API key de carlos. La regla de caché del cache server es de prefijo: todo lo que empieza por /resources se cachea. El origin server usa ? como delimitador y normaliza secuencias de path traversal (decodificando %2f a /). La URL /resources/..%2fmy-account?wcd hace que el origin sirva /my-account y que la caché guarde la respuesta bajo /resources/....

Campo Valor
Severidad Alta (exfiltración de datos autenticados vía caché pública)
Endpoint vulnerable /my-account (cacheado bajo prefijo /resources)
Root cause Regla de caché por prefijo /resources + normalización del origin (? delimitador, traversal resuelto)

Credenciales del laboratorio: wiener:peter. Se dispone de una lista de caracteres delimitadores.

Technical Breakdown & Exploitation Flow

1. La request deceptiva

GET /resources/..%2fmy-account?wcd HTTP/2
Host: <LAB-ID>.web-security-academy.net
Cookie: session=<SESSION_ID>

2. Comportamiento divergente

Cache server:

  • La regla cachea cualquier asset cuyo path empiece por /resources, sin importar lo que siga.
  • /resources/..%2fmy-account?wcd comienza con /resources → decide cachear la respuesta.

Origin server:

  • Usa ? como delimitador: ignora ?wcd del path.
  • Normaliza la secuencia de traversal: decodifica %2f → / y resuelve .., convirtiendo /resources/../my-account en /my-account.
  • Sirve la página de cuenta del usuario autenticado — con su API key.

3. Resultado

La respuesta de /my-account (API key de carlos cuando la víctima la visita) se almacena en la caché bajo la clave /resources/..%2fmy-account?wcd. El atacante:

  1. Entrega la URL a carlos vía el exploit server.
  2. El navegador de la víctima carga la página de cuenta; el origin devuelve la API key.
  3. El cache server almacena la respuesta por su prefijo /resources.
  4. El atacante solicita la misma URL (o la clave cacheada) y obtiene la respuesta con la API key.

Root Cause Analysis

La discrepancia clave es la normalización del origin: el origin resuelve el path traversal (/resources/../my-account → /my-account) y aplica el delimitador ?, mientras el cache server decide la cacheabilidad antes de normalizar, basándose solo en el prefijo /resources. La regla de prefijo es demasiado amplia: cualquier URL que comience con /resources (incluso una que resuelva a una página dinámica) se cachea. La normalización del origin convierte la URL en un recurso dinámico mientras el prefijo la mantiene estática para la caché.

Secure Remediation

  • Normalizar la URL (resolver traversal y decodificar) antes de aplicar las reglas de caché, de modo que la clave de caché y la decisión de cacheabilidad coincidan con el recurso efectivamente servido.
  • Restringir la regla de prefijo: cachear solo paths que terminen en extensiones de assets estáticos (/resources/*.js|.css|.png) y que no contengan secuencias de traversal.
  • Emitir Cache-Control: private, no-store en respuestas autenticadas y configurar el cache server para no cachear respuestas que contengan cookies de sesión.
  • Descartar del caching cualquier URL que, tras normalización, apunte a un endpoint dinámico.