
Génère une page de déclenchement HTML auto-soumise qui exploite une injection HTML réfléchie dans la connexion WordPress (CVE-2026-64638) pour afficher une bannière personnalisée, à des fins de tests de sécurité autorisés.
Un générateur de PoC monofichier, sans dépendance, pour l'injection HTML réfléchie
CVE-2026-64638 de WordPress sur wp-login.php (différentiel strip_tags()
vs analyseur KSES). Il produit une page de déclenchement à auto-envoi : lorsque
la victime ouvre le fichier, la page envoie silencieusement la charge utile
d'injection par POST et la victime atterrit directement sur la page de connexion
cible avec une bannière rendue — aucune interaction, aucun JavaScript côté cible.
Réservé aux tests de sécurité autorisés. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous êtes explicitement autorisé à tester.
| Versions | Statut |
|---|
| 6.4.0 – 7.0.2 | Vulnérables — fonctionne immédiatement |
| 5.8 – 6.3 | Conditionnel — nécessite un plugin transmettant login_errors via wp_kses() avec style autorisé |
| 4.7 – 5.7 | Non exploitables (le nom d'utilisateur n'est pas réfléchi) |
| 6.4.9 / 6.5.9 / 6.6.6 / 6.7.6+ / 6.8.7 / 6.9.6 / 7.0.3+ | Corrigées (esc_html) |
python3 banner_poc.py \
--out trigger.html \
--target http://192.0.2.10/wp-login.php \
--msg "Scheduled System Maintenance"
# sous-répertoire + chemin de connexion masqué + sous-titre
python3 banner_poc.py \
--out trigger.html \
--target http://10.0.0.5:8080/blog/my-secret-login \
--msg "Please sign in again" --sub "Session expired"
Hébergez trigger.html n'importe où. Lorsque la victime l'ouvre, elle est
redirigée vers la page de connexion cible avec la bannière rendue. Le saut est
silencieux : aucun contenu intermédiaire visible, l'arrière-plan correspond à
l'écran de connexion WordPress, atterrissage en ~0,5 s.
| Option | Description |
|---|---|
--out | Fichier HTML de sortie (obligatoire) |
--target | URL complète de la page de connexion — sous-répertoire / chemins de connexion masqués inclus (obligatoire) |
--msg | Texte de la bannière (défaut : Scheduled System Maintenance) |
--sub | Ligne de sous-titre facultative |
wp-login.php réfléchit un nom d'utilisateur de connexion échouée dans le
message d'erreur. Les versions vulnérables l'assainissent avec PHP
strip_tags(), qui laisse passer tout ce qui contient < suivi d'un espace.< div style="..."> arrive comme un véritable élément.< /strong> (barre oblique précédée d'un espace) survit également à
strip_tags() et est reconstruit en une véritable balise fermante, permettant
à la charge utile de fermer le <strong> du modèle (un élément de formatage
actif HTML5) comme premier jeton et de conserver un contrôle exact du DOM.div final non fermé, hors écran et de taille nulle, avale le texte de fin
du modèle (« … is not registered on this site … »).class qui survivent à
safecss_filter_attr(). Sur 6.3+ / 6.4+, position:fixed rend une superposition
plein écran ; sur 5.8–6.2, ces propriétés sont supprimées et la même charge utile
se dégrade automatiquement en bannière rouge dans le flux.HTML/CSS pur — aucun JavaScript ne s'exécute côté cible. Les règles WAF ciblant
<script> ou les gestionnaires d'événements ne s'appliquent pas.
Cet outil est publié pour la recherche défensive et les tests d'intrusion autorisés. L'auteur n'est pas responsable d'une mauvaise utilisation.