web-dev-qa-db-fra.com

XSS basé sur Dom est-il toujours un problème de sécurité valide dans les navigateurs modernes?

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>
28
Ilya Chernomordik

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.

Source: URL

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>

Source: Le DOM

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="&quot;><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>

Évier: Eval

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='

Évier: document.write

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)
53
tim