Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
wpforms-xss-fix-bypass — XSS réfléchi non authentifié dans WPForms <= 2.0.2.1 — contournement de l'échappement Smart Tag de CVE-2026-88996 en position de nom d'attribut | Kitploit
Outils/GitHubGitHub/dorkerdevil/wpforms-xss-fix-bypass
Analyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebTests d'Intrusion
GitHubdorkerdevil/wpforms-xss-fix-bypass

wpforms-xss-fix-bypass

XSS réfléchi non authentifié dans WPForms <= 2.0.2.1 — contournement de l'échappement Smart Tag de CVE-2026-88996 en position de nom d'attribut

Voir le dépôt
13il y a 1 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

WPForms ≤ 2.0.2.1 — Contournement du correctif de CVE-2026-88996 (XSS réfléchi non authentifié)

Affecté : WPForms – AI Form Builder for WordPress (gratuit/lite), version 2.0.2.1 — la dernière en date au moment de la divulgation (également la version qui contient le correctif de CVE-2026-88996). L'édition Pro partage le moteur de rendu Smart Tag.

Classe : cross-site scripting réfléchi non authentifié (CWE-79) avec exécution JavaScript vérifiée, via un correctif incomplet de CVE-2026-88996 / GHSA-8j5g-9vmv-9mmw.

Découvert : 2026-09-27 ·

Signalé à Patchstack : 2026-09-27 ·

Refusé : 2026-09-28 (« le problème n'apparaît que lorsque l'administrateur du site a écrit un Smart Tag nu là où un nom d'attribut HTML devrait figurer... ce n'est pas une configuration par défaut ni un schéma que quiconque rédigerait de façon réaliste » — validité technique non contestée) ·

Public : 2026-09-28.

Résumé

Le correctif 2.0.2.1 pour le XSS réfléchi de la famille CVE-2026-93485 échappe les valeurs de Smart Tag qui sont substituées dans le balisage (SmartTags::escape_for_attribute() encode les guillemets et les espaces). Cela est efficace dès lors que la valeur substituée se retrouve à l'intérieur d'une valeur d'attribut entre guillemets. Lorsqu'un auteur de formulaire place un Smart Tag nu à une position de nom d'attribut dans le message de confirmation — par exemple :

<input {field_id="3"}>

une valeur de champ soumise ne contenant ni guillemets ni espaces, telle que onmouseover=alert(1), est insérée verbatim et devient un nouvel attribut de gestionnaire d'événement actif. L'échappement n'encode jamais =, et les noms d'attributs ne nécessitent ni guillemets ni espaces. La confirmation renvoyée au soumetteur anonyme contient alors :

<input onmouseover=alert(1)>

Les soumissions anonymes vers admin-ajax.php (action=wpforms_submit, wp_ajax_nopriv_*) sont sans nonce par conception pour les utilisateurs déconnectés, il s'agit donc d'une XSS réfléchie entièrement non authentifiée. Du JavaScript arbitraire s'exécute dans la contrainte d'un seul jeton via onmouseover=eval(String.fromCharCode(...)).

Le delta qui prouve qu'il s'agit d'une lacune de correctif

Sur le même formulaire, la forme de la charge utile de la CVE parente — la rupture de guillemets depuis l'intérieur d'une valeur entre guillemets, par ex. x" onfocus=alert(1) autofocus y=" — est correctement échappée à chaque position (encodage &quot; / &#32; observé). L'échappement de la 2.0.2.1 fonctionne partout sauf au placement du nom d'attribut. Il s'agit d'un correctif incomplet du même puits de substitution, et non d'une lacune fonctionnelle distincte.

Reproduction

# 1. WordPress + WPForms lite 2.0.2.1, create a form with a single-line text field (id 3)
# 2. Set the form's Confirmation message to:
#      A: <input value="{field_id="3"}">  B: <input {field_id="3"}>
# 3. Run the PoC (stdlib-only Python 3):
python3 poc.py --url http://target.example/form-page/

Expected output:

[+] field 3 reflects into the confirmation message
[payload (bypass position)] occurrences: LIVE=1 ESCAPED/INERT=2
    LIVE  -> ...<input onmouseover=alert(poc93485)>...
[control] parent-CVE payload escaped everywhere: YES (fix works at value positions)
=== VERDICT: VULNERABLE — payload reaches attribute-NAME position unescaped ===

poc.py découvre automatiquement le formulaire, les champs et le champ réfléchissant ; soumet anonymement ; et classe chaque occurrence comme LIVE (injection au niveau du nom d'attribut) ou ESCAPED (valeur entre guillemets, la forme de la CVE parente). Code de sortie 0 = vulnérable.

Préconditions (énoncées honnêtement)

Le message de confirmation rédigé par l'administrateur du formulaire doit contenir une balise Smart Tag réfléchissant une entrée, nue, à l'intérieur du balisage, en position de nom d'attribut. Les chercheurs de Patchstack ont jugé qu'il s'agissait d'un schéma de rédaction irréaliste ; il n'en reste pas moins une position de fonctionnalité documentée, l'échappement existe précisément pour rendre sûre la substitution en contexte de balisage, et l'auteur ne reçoit aucune erreur — seulement une injection silencieuse.

Correctif suggéré

Encoder = dans l'échappement en contexte de balisage, ou analyser contextuellement le balisage de confirmation et n'autoriser la substitution de Smart Tag que dans les positions de texte et de valeur d'attribut entre guillemets.

Fichiers

  • poc.py — PoC autonome (aucune étape côté serveur, aucune dépendance)
  • poc.sh — variante minimale basée sur curl

Avertissement

À des fins de tests autorisés et d'apprentissage uniquement. Le rapporteur publie ceci après qu'une tentative de soumission coordonnée a été refusée ; la découverte technique n'a pas été contestée.

Auteur

Ashish Kunwar (@D0rkerdevil)

Télécharger l’outil