XSS DOM avec jQuery et événement hashchange

DOM XSS in jQuery selector sink using a hashchange event

Ce laboratoire contient une vulnérabilité XSS côté client sur la page d'accueil. Le code utilise la fonction sélecteur $() de jQuery pour cibler automatiquement un article dont le titre est passé via location.hash. L'objectif du lab est d'obtenir un exploit qui, lorsqu'un visiteur l'ouvre, appelle print() dans son navigateur.

  • La fonction récupère le fragment d'URL (window.location.hash), en retire le # avec slice(1) et le décode avec decodeURIComponent.

  • Ce texte est ensuite concaténé directement dans un sélecteur jQuery :contains(...). Comme il n'y a pas d'échappement, un contenu spécialement construit peut casser la syntaxe et injecter du HTML/JS via des vecteurs comme des attributs onerror.

  • Le code déclenche l'action uniquement quand le hash change (hashchange), donc un simple lien initial sans hash ne déclenchera rien tant que le fragment ne sera pas modifié côté client.

  • On profite du fait que la modification du # déclenche l'événement. L'exploit doit donc forcer le navigateur de la victime à charger une URL avec un fragment contenant le payload.

  • Une méthode courante consiste à utiliser un <iframe> référençant la page cible, puis, lors du onload, à modifier dynamiquement son src pour y ajouter le fragment malveillant (ce qui provoquera le hashchange et l'exécution du sélecteur vulnérable).

  • Le payload injecté doit provoquer l'exécution de print() dans le contexte de la victime.

Injection basique pour provoquer une erreur d'image (test) :

  • Exploit via iframe — première version (alerte) :

  • Exploit final visant print() (version adaptée) :

Mis à jour

Ce contenu vous a-t-il été utile ?