J'essaie de comprendre comment fonctionne XSS basé sur DOM, par exemple de cet article , j'ai réussi à le reproduire dans IE11, mais par ex. Chrome et Firefox sont au moins immunisés contre cet exemple exact.
Ce qui se passe, c'est que document.baseURI
et des objets similaires renvoient une chaîne qui est encodée, donc à moins que vous n'écriviez explicitement du code pour le décoder ou quelque chose que je ne vois pas comment il peut être abusé.
Y a-t-il d'autres exemples auxquels les navigateurs modernes sont encore vulnérables? Je n'ai pas réussi à en trouver, car pratiquement tous les exemples sur le web pointent vers une vulnérabilité similaire.
P.S. L'essentiel de l'exemple est de former une requête hashbang avec injection:
http://victim/displayHelp.php?title=FAQ#<script>alert('Hello')</script>
Oui, XSS basé sur DOM est toujours une préoccupation. Bien que certains problèmes ne puissent pas être exploités en raison du codage d'URL, il existe un certain nombre de situations où le codage d'URL ne fera pas obstacle à l'exploitation.
L'essentiel de l'exemple est de former une requête de hachage avec injection
C'est un exemple, mais XSS basé sur DOM englobe tous les problèmes XSS qui résultent d'une gestion non sécurisée des données via JavaScript.
Les données peuvent provenir de sources telles que l'URL, le DOM lui-même, etc.
L'exemple le plus basique où l'entrée utilisateur est par exemple lue à partir de location.search
et traité avec innerHTML
ou .write
ne fonctionnera en effet avec aucun navigateur à jour, car la valeur est encodée en URL.
Mais XSS basé sur DOM avec des sources différentes de location.search
ou des récepteurs différents de innerHTML
fonctionneront toujours et existent dans les applications du monde réel.
Une liste incomplète d'exemples avec différents puits et sources peut être trouvée ci-dessous.
Un exemple de vulnérabilité XSS basée sur DOM où les entrées utilisateur proviennent de l'URL:
<html>
<body>
<script>
url = new URLSearchParams(location.search);
x = url.get('x');
document.write(x);
</script>
</body>
</html>
Attaque:
http://example.com/test.html?x=<script>alert(1)</script>
D'après mon expérience, il s'agit de la classe la plus courante de problèmes XSS basés sur DOM exploitables.
Supposons une application qui code correctement HTML toutes les données fournies par l'utilisateur qui sont insérées dans le code HTML.
Les applications liront encore souvent les données fournies par l'utilisateur à partir du DOM, puis les réinséreront de manière non sécurisée. Par exemple:
<html>
<body>
<input type="text" id="userinput" value=""><img src=x onerror=alert(1)>">
<div id="output"></div>
<script>
userinput = document.getElementById('userinput').value;
output = document.getElementById('output');
output.innerHTML = "Your input was: " + userinput;
</script>
</body>
</html>
Parfois, nous n'avons pas besoin de "
ou >
pour gagner XSS. Un exemple serait une entrée utilisateur passée à eval
:
<html>
<body>
<script>
x = window.location.hash.substr(1);
eval("var myvar = '" + x + "'");
</script>
</body>
</html>
Attaque:
http://example.com/test.html#';alert(1);x='
Un autre exemple où nous n'avons pas besoin de "
ou >
et qui fonctionne avec document.write
:
<html>
<body>
<script>
x = window.location.hash.substr(1);
document.write("<input type='text' value='" + x + "'");
</script>
</body>
</html>
</body>
</html>
Attaque:
http://example.com/test.html#test'onmouseover='alert(1)