
Modèle Nuclei pour la détection non intrusive de XSS2Shell, un parseur différentiel pré-authentifié dans WordPress Core qui permet l'injection d'éléments DOM dans la page de connexion, servant de base à une chaîne XSS → RCE.
Template Nuclei pour la détection non intrusive de XSS2Shell, un parser différentiel pré-authentifié dans WordPress Core qui permet l'injection d'éléments DOM dans la page de connexion, servant de base à une chaîne XSS → RCE.
⚠️ Ce template détecte uniquement le défaut d'assainissement (étape de réflexion du marqueur dans la réponse HTML). Il n'exécute pas la chaîne d'exploitation complète (DOM clobbering, JSONP/SOME, vol d'Application Password ou upload de plugin). Usage strict sur des actifs sous autorisation explicite.
WordPress Core, lors du rendu du message d'erreur « utilisateur non enregistré » dans wp-login.php, insère le nom d'utilisateur soumis dans le HTML sans échappement cohérent entre deux filtres distincts :
wp_strip_all_tags() (basé sur strip_tags() de PHP) ne reconnaît une balise que si < est suivi immédiatement d'une lettre — un espace après < amène le filtre à traiter le contenu comme du texte brut.wp_kses_post(), appliqué juste après, utilise son propre tokenizer, qui tolère cet espace et reconstruit la chaîne comme un véritable élément HTML (<area>, <div> et <button> sont dans la liste blanche).Le résultat est qu'un attaquant non authentifié peut injecter des éléments DOM arbitraires dans la page de connexion qui, combinés avec les gestionnaires hérités du script user-profile.js, le DOM clobbering de la variable ajaxurl et le JSONP de l'API REST, permettent l'exécution de JavaScript dans l'origine de WordPress et, en chaîne complète, un RCE contre le compte d'un administrateur.
Découvert et divulgué par pwn.ai. Corrigé dans WordPress 7.0.3 (backport jusqu'à la branche 4.7).
Le template envoie une requête POST vers /wp-login.php avec un payload dans le champ log contenant :
< area id=xss2shell-marker href=/x>< div id=xss2shell-div>
Si WordPress est vulnérable, wp_kses_post() reconstruit ces chaînes comme de véritables éléments HTML dans la réponse. Le template utilise deux matchers en regex (condition and) pour confirmer que les deux balises apparaissent reconstruites — réduisant les faux positifs des WAF qui réfléchissent partiellement l'entrée.
# Validar sintaxe do template
nuclei -t CVE-2026-64638.yaml -validate
# Rodar contra um alvo único
nuclei -t CVE-2026-64638.yaml -u https://target.com
# Rodar contra uma lista de alvos
nuclei -t CVE-2026-64638.yaml -l targets.txt
# Debug (ver request/response completos)
nuclei -t CVE-2026-64638.yaml -u https://target.com -debug-req -debug-resp
| Résultat | Signification |
|---|---|
| Correspondance positive | Les balises injectées ont été réfléchies comme du vrai HTML → parser différentiel présent → cible vulnérable (non corrigée) |
| Aucune correspondance | Le payload a été échappé ou supprimé → cible corrigée (WordPress ≥ 7.0.3) ou protégée par un WAF/proxy qui normalise les espaces dans les balises |
Mettre à jour vers WordPress 7.0.3 ou supérieur. Le correctif a été rétroporté sur toutes les branches maintenues à partir de la 4.7.
Ce template est fourni à des fins de recherche en sécurité et de tests d'intrusion autorisés. L'utilisation contre des systèmes sans autorisation explicite est illégale. L'auteur ne saurait être tenu responsable d'une mauvaise utilisation.
Renzi