web-dev-qa-db-fra.com

Dans quelles situations peut-elle element.setattribute autoriser XSS?

Burp a identifié une vulnérabilité potentielle DOM XSS:

L'application peut être vulnérable aux scripts croisés basés sur DOM. Les données sont lues à partir de window.location.href et sont passées à la fonction 'Seattribute ()' d'un élément DOM

Dans cet exemple, le code vulnérable est comme (je ne peux pas inclure l'original réel pour la confidentialité):

var thing = windows.location.href;
...
element.setAttribute("fill", thing);

Le Feuille de triche Owasp Dom XSS dit "Echap Javascript avant d'insérer des données non approuvées dans le sous-poste d'attribut HTML dans le contexte d'exécution". Je ne suis pas tout à fait sûr de ce qu'ils entendent par contexte d'exécution.

Faire des tests rapides (en chrome), c'est vulnérable:

document.getElementById("bob").setAttribute("onclick", "alert(1)");

Mais ce n'est pas le cas:

document.getElementById("bob").setAttribute("fill", "" onclick="alert(1)");

Compte tenu de tout cela, je pense que Burp a signalé un faux positif. Mais je crains que j'ai peut-être manqué quelque chose, de sorte que d'autres contributions seraient appréciées.

Je ne suis intéressé que si cela est exploitable dans les navigateurs récents. Je ne suis pas intéressé par "Ce n'est pas la meilleure pratique" ou "Exploitable In IE 4 sur un Mac".

9
paj28

setAttribute() est en sécurité en ce sens qu'elle ne fait rien de plus que de définir la valeur de l'attribut. Même en utilisant des caractères spéciaux de la chaîne, vous ne pouvez pas injecter un attribut supplémentaire (comme vous l'avez tenté dans votre troisième extrait), laissez-moi seulement échapper à la balise HTML.

Certains attributs sont dangereux pour certains éléments . Comme vous l'avez démontré, on* Les attributs sont vulnérables car ils vous permettent de spécifier les gestionnaires d'événements de script. De même, src et srcdoc sont dangereux sur <iframe> Éléments, etc.

La technique d'injectation de JS via url() tel que proposé par @anders a travaillé dans le passé pour les attributs CSS mais n'est plus possible dans les grands navigateurs. À l'époque, une charge utile telle que <rect fill="url('javascript:alert(1)')"/> aurait pu travailler. Cela pourrait également être la raison pour laquelle Burp le drapeau comme une vulnérabilité potentielle. Ce n'est pas un vecteur d'attaque dans les navigateurs récents, cependant.

5
Arminius