hacktricks/pentesting-web/xss-cross-site-scripting/chrome-cache-to-xss.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

6.5 KiB

Chrome Cache to XSS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Técnica tomada de este artículo.

Existen dos tipos importantes de caché:

  • caché de retroceso/avance (bfcache)
    • ref. https://web.dev/i18n/en/bfcache/
    • Almacena una instantánea completa de una página, incluyendo el montón de JavaScript.
    • La caché se utiliza para navegaciones de retroceso/avance.
    • Tiene preferencia sobre la caché de disco.
  • caché de disco

Como punto interesante de la caché de disco, la caché incluye no solo la respuesta HTTP renderizada en una página web, sino también aquellas obtenidas con fetch. En otras palabras, si accedes a la URL de un recurso obtenido, el navegador renderizará el recurso en la página.

Hay otro punto importante. Si tanto la caché de disco como la caché de retroceso/avance son válidas para una página accedida en navegaciones de retroceso/avance, la caché de retroceso/avance tiene prioridad sobre la caché de disco. Por lo tanto, si necesitas acceder a una página almacenada en ambas cachés pero quieres usar la de disco, debes deshabilitar de alguna manera la caché de retroceso/avance.

Deshabilitar la caché de retroceso/avance

La caché de retroceso/avance se deshabilita por defecto en las opciones de puppeteer[2]. Hay muchas condiciones en las que se deshabilita la caché de retroceso/avance, la lista es:

La forma más sencilla es utilizar RelatedActiveContentsExist.

Por lo tanto, el siguiente procedimiento reproduce el comportamiento:

  1. Accede a una página web (por ejemplo, https://example.com).
  2. Ejecuta open("http://spanote.seccon.games:3000/api/token").
    • El servidor devuelve una respuesta con código de estado 500.
  3. En la pestaña abierta, accede a http://spanote.seccon.games:3000/.
    • Entonces, la respuesta de http://spanote.seccon.games:3000/api/token se almacena en caché como caché de disco.
  4. Ejecuta history.back().
    • ¡La respuesta JSON en caché se renderiza en la página!

Puedes confirmar que se utiliza la caché de disco utilizando DevTools en Google Chrome:

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥