Empoisonnement du cache pour exploiter une XSS DOM avec cache « strict

Web cache poisoning to exploit a DOM vulnerability via a cache with strict cacheability criteria

Objectif du lab

Nous devons empoisonner le cache afin qu’un visiteur de la page d’accueil exécute alert(document.cookie) via une vulnérabilité DOM.

Observations

  • La page affiche une information de livraison basée sur le pays (ex. United Kingdom).

  • Nous identifions un script geolocate.js qui construit du DOM à partir d’un JSON.

Analyse de la logique côté client

Dans geolocate.js, nous voyons une fonction du type :

  • Elle fait un fetch(jsonUrl)

  • Puis elle récupère j.country

  • Et elle fait : div.innerHTML = 'Free shipping to ' + j.country;

Le JSON chargé par défaut est :

/resources/json/geolocate.json

Dans la page d’accueil, l’URL du JSON est construite ainsi :

Point d’injection utile (cache poisoning)

Nous remarquons que si nous ajoutons un en-tête comme :

  • X-Forwarded-Host: test.com

Alors la valeur est reflétée dans data.host, ce qui impacte ensuite l’URL passée à initGeoLocate().

Hébergement de notre JSON sur l’exploit server

Sur notre exploit server, nous créons un fichier JSON (exemple simple) :

Puis nous envoyons une requête à la racine avec :

  • X-Forwarded-Host: <notre-exploit-server>

Au début, cela ne charge pas à cause d’un problème CORS (absence de Access-Control-Allow-Origin).

Nous ajoutons donc dans la réponse de l’exploit server :

  • Access-Control-Allow-Origin: *

Après ça, le JSON distant est chargé correctement.

Injection XSS via le JSON (DOM XSS)

Nous remplaçons ensuite le contenu du JSON par une charge utile, par exemple :

Comme j.country est injecté dans innerHTML, le navigateur interprète notre HTML, et l’alerte s’exécute.

Mis à jour