Combinaison de vulnérabilités de web cache poisoning

Combining web cache poisoning vulnerabilities

On doit empoisonner le cache de la page d’accueil avec une version qui exécute alert(document.cookie) dans le navigateur du visiteur. La victime passe sur / environ toutes les minutes et sa langue est l’anglais (cookie lang=en).

1) Point d’entrée : la fonctionnalité de traduction côté client

Sur la page d’accueil, on observe :

  • Une cookie lang (ex. lang=es) + session=...

  • Un script de traduction : /resources/js/translations.js

Ce script lit lang depuis les cookies, puis fait un fetch() vers un JSON :

Et data.host vient d’un bloc inline sur la home :

Puis le script applique les traductions en remplaçant du texte via innerHTML, ce qui est important car ça peut transformer une “traduction” en injection HTML si on contrôle le JSON.

Vulnérabilité n°1 : manipulation du host via X-Forwarded-Host

En ajoutant l’en-tête HTTP suivant

nous constatons que la valeur est reflétée dans data.host.

Nous pouvons donc forcer le navigateur à charger le fichier :

3. Vulnérabilité n°2 : XSS via le fichier de traduction JSON

Nous hébergeons sur l’exploit server un faux translations.json contenant une injection XSS dans une traduction, par exemple :

Nous utilisons alors :

La page d’accueil, servie depuis le cache, pointera désormais vers notre fichier JSON malveillant.

Le contenu de la traduction est donc interprété comme du HTML, ce qui permet l’exécution du JavaScript injecté.

4. Limitation : la victime utilise la langue anglaise

Le script de traduction ne s’exécute que si :

  • lang !== 'en'

Or, la victime a initialement lang=en. Même si nous contrôlons le fichier JSON, l’XSS ne se déclenche pas tant que la langue n’est pas modifiée.

Nous devons donc forcer le passage en espagnol.

5. Vulnérabilité n°3 : forcer le changement de langue via X-Original-Url

À l’aide de Param Miner, nous identifions l’en-tête vulnérable :

Nous envoyons une autre requête vers / avec :

  • X-Original-Url: /test404 Not Found

Le cache sert une réponse qui définit lang=es pour les visiteurs.

X-Original-Url: /setlang\es302 Found

Cette route :

  • Définit la cookie lang=es

  • Redirige ensuite vers la page d’accueil

Exécution du payload chez la victime

  1. La victime visite /

  2. La cookie lang passe à es

  3. La page recharge le fichier translations.json depuis notre exploit server

  4. La traduction malveillante est injectée dans le DOM

  5. Le navigateur exécute :

Mis à jour