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: /test → 404 Not Found
Le cache sert une réponse qui définit lang=es pour les visiteurs.
X-Original-Url: /setlang\es → 302 Found
Cette route :
Définit la cookie lang=es
Redirige ensuite vers la page d’accueil
Exécution du payload chez la victime
La victime visite /
La cookie lang passe à es
La page recharge le fichier translations.json depuis notre exploit server
La traduction malveillante est injectée dans le DOM