🔍 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 (< area n’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

  1. DOM Clobbering : injection d’un <area id=ajaxurl href=...> pour écraser la variable JavaScript ajaxurl via les named properties de window.
  2. Déclenchement automatique : le script user-profile.js (chargé inutilement sur toute la page de login) contient un handler $(document).ready qui auto-clique .wp-generate-pw dans .reset-pass-submit, déclenchant un $.post() vers ajaxurl.
  3. REST JSONP : la requête POST est redirigée vers l’API REST WordPress avec _jsonp=alert, _method=GET, _envelope=1. WordPress retourne un Content-Type: application/javascript, jQuery exécute le corps via globalEval()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 :

  1. 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).
  2. La fenêtre enfant soumet le payload XSS avec _jsonp=window.opener.approve.click.
  3. Le callback JSONP clique le bouton #approve dans la session administrateur → création d’un Application Password renvoyé vers attacker.example/callback.
  4. Avec ce mot de passe, l’attaquant publie une page WordPress contenant des balises <script> (via REST API + Basic Auth).
  5. 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.
  6. Le fichier PHP extrait dans wp-content/plugins/payload/shell.php est 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-64638NVD · 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