Démonstration de la vulnérabilité CVE-2022-31160 de jQuery UI
Ce projet illustre la vulnérabilité du widget Checkboxradio de jQuery UI (CVE-2022-31160) qui permet le décodage d'entités HTML lors des opérations de rafraîchissement du widget, pouvant conduire à des attaques de type Cross-Site Scripting (XSS).
🚨 Avertissement de sécurité
⚠️ Ce projet contient des charges utiles XSS fonctionnelles à des fins éducatives et de recherche uniquement.
Ne pas utiliser sur des systèmes de production
Utiliser uniquement dans des environnements contrôlés
Destiné à la recherche et à l'éducation en sécurité
Type de vulnérabilité : Cross-Site Scripting (XSS) via le décodage d'entités HTML
Score CVSS : 6.1 (Moyen)
Première publication : 20 juillet 2022
Cause racine
Lorsqu'un widget checkboxradio est initialisé sur une entrée contenue dans une étiquette (<label>), appeler .checkboxradio("refresh") sur le widget entraîne un décodage erroné des entités HTML dans le contenu de l'étiquette. Cela peut convertir du contenu malveillant encodé de manière sécurisée en JavaScript exécutable.
Compréhension de base des concepts de sécurité web
Construction et exécution
root@kitploit:~
# Cloner ou naviguer dans le répertoire du projet
cd jquery-cve-2022-31160
# Construire l'image Docker
docker build -t jquery-cve-2022-31160 .
# Exécuter le conteneur
docker run -p 3000:3000 jquery-cve-2022-31160
Accéder aux démonstrations
Une fois le conteneur en cours d'exécution, accédez à :
3. Gestionnaire d'événement de souris (onmouseover)
Déclenchement : Nécessite une interaction utilisateur (survol)
Fiabilité : Élevée lorsque l'utilisateur interagit
Cas d'utilisation : Scénarios d'ingénierie sociale
Risque réel : Moyen - nécessite l'engagement de l'utilisateur
Pourquoi ces charges utiles fonctionnent
Avantages des gestionnaires d'événements :
S'exécutent lorsque l'élément est inséré via innerHTML
Contournent les restrictions des balises <script>
Fonctionnent de manière cohérente dans différents navigateurs
Ne nécessitent pas de ressources externes à charger
Les déclencheurs basés sur l'état (comme ontoggle) sont très fiables
Contournement d'encodage :
Les entités HTML (<, ") sont décodées par le rafraîchissement de jQuery UI
Transforme du contenu encodé sécurisé en code exécutable
Démontre un contournement de la désinfection en conditions réelles
Plusieurs vecteurs d'exécution montrent la diversité de la surface d'attaque
🐳 Utilisation de Docker
Construction de l'image
root@kitploit:~
docker build -t jquery-cve-2022-31160 .
Exécution du conteneur
root@kitploit:~
# Exécution sur le port par défaut 3000
docker run -p 3000:3000 jquery-cve-2022-31160
# Exécution sur un port personnalisé
docker run -p 8080:3000 jquery-cve-2022-31160
# Exécution en arrière-plan
docker run -d -p 3000:3000 jquery-cve-2022-31160
# Exécution avec un nom personnalisé
docker run --name jquery-xss-demo -p 3000:3000 jquery-cve-2022-31160
Gestion du conteneur
root@kitploit:~
# Lister les conteneurs en cours d'exécution
docker ps
# Arrêter le conteneur
docker stop jquery-cve-2022-31160
# Supprimer le conteneur
docker rm jquery-cve-2022-31160
# Supprimer l'image
docker rmi jquery-cve-2022-31160
🔬 Analyse de sécurité
Évaluation de l'impact
Gravité : Moyenne (CVSS 6.1)
Complexité de l'attaque : Faible
Interaction utilisateur : Requise (interaction avec la page)
Portée : Inchangée (même origine)
Confidentialité : Faible impact
Intégrité : Faible impact
Disponibilité : Aucun
Scénarios réels
Cette vulnérabilité peut être exploitée dans des applications qui :
Utilisent les widgets checkboxradio de jQuery UI
Permettent le contenu généré par l'utilisateur dans les étiquettes
Désinfectent le contenu en utilisant l'encodage d'entités HTML
Rafraîchissent les widgets par programmation
Méthodes de détection
Analyse statique : Rechercher les appels .checkboxradio("refresh")
Analyse dynamique : Surveiller les changements de contenu HTML lors des opérations du widget
Scan automatisé : Utiliser des outils capables de détecter les XSS basés sur le DOM
Tests manuels : Tester le rafraîchissement du widget avec des charges utiles encodées
🛡️ Mitigation
Actions immédiates
Mettre à jour jQuery UI : Passer à la version 1.13.2 ou ultérieure
Validation des entrées : Mettre en place une validation côté serveur appropriée
Politique de sécurité du contenu : Déployer des en-têtes CSP restrictifs
Encodage des sorties : Utiliser un encodage de sortie adapté au contexte
Corrections de code
root@kitploit:~
// Avant le rafraîchissement, désinfecter ou valider le contenu
function safeRefresh(element) {
// Valider le contenu de l'étiquette avant le rafraîchissement
const label = $(`label[for="${element.attr('id')}"]`);
const content = label.html();
// Vérifier la présence de contenu potentiellement dangereux
if (content.includes('<') || content.includes('javascript:')) {
console.warn('Contenu potentiellement dangereux détecté');
return;
}
element.checkboxradio("refresh");
}