web-dev-qa-db-fra.com

Que signifie "Vulnérable avec: sélecteur de classe css" pour JQuery?

Je suis surtout un débutant en cybersécurité. Je suis tombé sur l'autre jour sur la façon dont JQuery 1.3.2 est vulnérable aux sélecteurs CSS et à l'emplacement Hash ( source ).

Je comprends le fonctionnement de XSS et je sais ce que sont les sélecteurs CSS. Mais je ne comprends pas vraiment ce que cela signifie par Vulnérable avec le sélecteur de classe CSS. Comme cela signifie-t-il que chaque fois qu'un site utilise JQuery 1.3.2, est-il possible de lancer une attaque XSS sur celui-ci? Si oui, de quelles manières serait-il possible?

Je serai vraiment reconnaissant si quelqu'un peut expliquer comment cela fonctionne exactement dans un scénario réel.

26
Akhil

Dans jQuery, vous pouvez spécifier un sélecteur CSS et du code HTML avec le même raccourci.

Ceci est un sélecteur:

$('#some-thing')

C'est du HTML qui est évalué immédiatement:

$('<svg onload=alert(1)>')

Il s'agit d'un exemple de code réel pour analyser un sélecteur à partir du hachage d'emplacement (la partie URL après un #):

var x = $('#' + window.location.hash.substr(1));
x.addClass('highlighted').find('div').show();

Il est tiré de cette question et une approche similaire est (dangereusement) recommandée dans this SO thread .

Vous voyez le problème avec ça? L'intention de l'auteur était d'autoriser un sélecteur CSS contrôlé par l'utilisateur, mais si vous ouvrez le site affecté en tant que https://example.com/#<svg onload=alert(1)>, vous vous retrouvez avec ce sélecteur ambigu:

$('#<svg onload=alert(1)>');

Les anciennes versions de jQuery l'exécutent en tant que code HTML et créent ainsi une faille XSS puisque le gestionnaire d'événements JS serait exécuté immédiatement une fois le nœud DOM créé. Cependant, les versions plus récentes décident qu'une chaîne qui ne commence pas par un crochet angulaire doit être analysée en tant que sélecteur, atténuant ainsi le défaut.

De les docs :

Si une chaîne est transmise en tant que paramètre à $(), jQuery examine la chaîne pour voir si elle ressemble à HTML (c'est-à-dire qu'elle commence par <tag ... >). Sinon, la chaîne est interprétée comme une expression de sélecteur, comme expliqué ci-dessus. Mais si la chaîne semble être un extrait HTML, jQuery tente de créer de nouveaux éléments DOM comme décrit par le HTML.

Vous pouvez lire comment ce comportement a été changé dans la discussion en bug # 9521 .

La page que vous avez liée ne fait que noter avec quel type de sélecteur chaque version est vulnérable.

44
Arminius