🔍 Contexte
Publié le 6 août 2026 sur le blog de pwn.ai par Nigusu Kasahun, cet article détaille la découverte et l’exploitation complète d’une chaîne de vulnérabilités baptisée XSS2Shell, affectant WordPress Core dans toutes ses versions jusqu’à 7.0.3. La CVE associée est CVE-2026-64638. WordPress est utilisé par plus de 43 % des sites web, soit plus de 500 millions de sites potentiellement exposés.
🐛 Vulnérabilité initiale : différentiel de parseurs
Le point d’entrée est wp-login.php. Lors d’une tentative de connexion échouée, le nom d’utilisateur soumis est intégré dans un message d’erreur HTML. La chaîne de sanitisation passe par :
sanitize_user()→wp_strip_all_tags()→strip_tags()(PHP) :strip_tags()ne reconnaît pas comme balise un tag précédé d’un espace (< arean’est pas strippé).wp_kses_post()(moteur KSES de WordPress) : reconnaît< area>comme une balise<area>valide et autorisée.
Ce différentiel de parseurs permet d’injecter des éléments DOM arbitraires (ex: <area>, <div>, <button>) dans la page de login sans authentification.
⚙️ Chaîne d’exploitation vers XSS
- DOM Clobbering : injection d’un
<area id=ajaxurl href=...>pour écraser la variable JavaScriptajaxurlvia les named properties dewindow. - Déclenchement automatique : le script
user-profile.js(chargé inutilement sur toute la page de login) contient un handler$(document).readyqui auto-clique.wp-generate-pwdans.reset-pass-submit, déclenchant un$.post()versajaxurl. - REST JSONP : la requête POST est redirigée vers l’API REST WordPress avec
_jsonp=alert,_method=GET,_envelope=1. WordPress retourne unContent-Type: application/javascript, jQuery exécute le corps viaglobalEval()→ exécution de JavaScript dans l’origine WordPress.
🔗 Escalade vers RCE (Same Origin Method Execution)
La technique SOME (publiée par Paulos Yibelo en 2022) est utilisée pour franchir la frontière de fenêtres :
- L’attaquant héberge une page qui ouvre une fenêtre enfant et navigue la fenêtre principale vers
authorize-application.php(page d’autorisation Application Password de WordPress Core). - La fenêtre enfant soumet le payload XSS avec
_jsonp=window.opener.approve.click. - Le callback JSONP clique le bouton
#approvedans la session administrateur → création d’un Application Password renvoyé versattacker.example/callback. - Avec ce mot de passe, l’attaquant publie une page WordPress contenant des balises
<script>(via REST API + Basic Auth). - Le navigateur de l’admin est redirigé vers cette page ; le script embarqué extrait un nonce, uploade un plugin ZIP malveillant via
/wp-admin/update.php. - Le fichier PHP extrait dans
wp-content/plugins/payload/shell.phpest directement accessible et exécuté par le serveur web → RCE confirmé (www-data).
📅 Timeline
- 26 juillet 2026 : Découverte et reproduction de la chaîne complète.
- 27 juillet 2026 : Signalement à WordPress avec preuves.
- 27 juillet 2026 : Accusé de réception par WordPress.
- 6 août 2026 : Publication de WordPress 7.0.3 et assignation de CVE-2026-64638.
- 7 août 2026 : Divulgation publique coordonnée.
📄 Type d’article
Il s’agit d’une publication de recherche technique avec divulgation coordonnée, incluant un PoC fonctionnel, une analyse détaillée de la chaîne d’exploitation et une timeline de disclosure. L’objectif principal est de documenter la vulnérabilité et de promouvoir la mise à jour vers WordPress 7.0.3.
🧠 TTPs et IOCs détectés
TTP
- T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
- T1190 — Exploit Public-Facing Application (Initial Access)
- T1505.003 — Server Software Component: Web Shell (Persistence)
- T1055 — Process Injection (Defense Evasion)
- T1185 — Browser Session Hijacking (Collection)
- T1548 — Abuse Elevation Control Mechanism (Privilege Escalation)
- T1071.001 — Application Layer Protocol: Web Protocols (Command and Control)
IOC
- CVEs :
CVE-2026-64638— NVD · CIRCL - Fichiers :
payload.zip - Fichiers :
shell.php - Chemins :
/wp-content/plugins/payload/shell.php - Chemins :
/wp-admin/update.php
⚠️ À propos de ces IOC — ils sont extraits automatiquement de l’article original le 10 août 2026 et n’ont pas fait l’objet d’une vérification externe. Un indicateur peut avoir été réattribué depuis : une IP de C2 peut redevenir un service légitime, un domaine sinkholé peut changer de propriétaire. Aucune garantie d’exactitude ni d’actualité — contrôlez leur validité avant tout usage opérationnel, en particulier avant de les injecter dans une blocklist ou un SIEM.
🟡 Indice de vérification factuelle : 55/100 (moyenne)
- ⬜ pwn.ai — source non référencée (0pts)
- ✅ 16698 chars — texte complet (fulltext extrait) (15pts)
- ✅ 7 IOCs (IPs/domaines/CVEs) (10pts)
- ⬜ 0/2 IOCs confirmés externellement (0pts)
- ✅ 7 TTPs MITRE identifiées (15pts)
- ✅ date extraite du HTML source (10pts)
- ⬜ aucun acteur de menace nommé (0pts)
- ✅ 1/1 CVE(s) confirmée(s) (CIRCL) (5pts)
🔗 Source originale : https://pwn.ai/blog/xss2shell