XSS dans une URL JavaScript avec caractères limités
Reflected XSS in a JavaScript URL with some characters blocked
Objectif
Exploiter une vulnérabilité XSS réfléchie dans une URL javascript: pour faire apparaître alert contenant la chaîne 1337 (la chaîne 1337 doit être présente quelque part dans le message).
L'application reflète notre entrée dans une URL JavaScript. À première vue le défi paraît simple, mais l’application filtre certains caractères pour empêcher les attaques XSS. Il faut donc trouver un moyen d’échapper au contexte JavaScript malgré ces restrictions et déclencher alert(...) contenant 1337.

Analyse du code source observé
Dans le code source on trouve le lien suivant :
Après décodage URL on obtient :
Cliquer sur Back to Blog exécute cette URL JavaScript. En interceptant la requête, on voit qu’un appel est fait vers /analytics. Le paramètre postId est pris depuis l’URL (/post?postId=...) et reflété dans le corps de la requête analytics.

Première tentative — casse du parsing

En injectant une seule apostrophe le parsing est cassé (l’ID devient invalide) :
L’apostrophe casse la structure, ce qui montre que la valeur est insérée dans un contexte où les quotes ont un impact.

Fuzzing des caractères spéciaux
On a testé rapidement quels caractères spéciaux produisent une réponse valide (avec wfuzz et la liste special-chars.txt). Exemple de commande utilisée :
Les résultats montrent que & et # produisent un code 200 — ils sont acceptés par le parseur et permettent d’insérer des séquences qui ferment proprement la structure.

Interprétation observée :

Construction d’un vecteur d’évasion
En fermant proprement la valeur et en insérant du code, on peut obtenir :

Ici x reste vide et la syntaxe est bien acceptée.
Ensuite on essaie d’ajouter un alert directement :
Mais les parenthèses () de alert(1) sont supprimées par le filtre — il faut donc contourner l’obligation d’utiliser ().

Contournement sans parenthèses
On échappe l’usage des parenthèses et on utilise des expressions JavaScript plus créatives pour invoquer alert avec 1337 dans l’output. La charge utile finale utilisée est :

Mis à jour
Ce contenu vous a-t-il été utile ?