🔍 Contexte

Publié le 18 juillet 2026 sur le blog ZephrSec (zsec.uk), cet article constitue une analyse technique approfondie (code trace) de la vulnérabilité wp2shell, découverte et documentée par AssetNote. Elle affecte WordPress Core versions 6.9.0 à 7.0.1 et porte deux CVEs : CVE-2026-63030 et CVE-2026-60137.

🐛 Description des vulnérabilités

La chaîne d’exploitation repose sur trois composants vulnérables :

  • Désynchronisation du batch REST (/wp-json/batch/v1) : un chemin malformé (http://:) provoque un WP_Error qui est ajouté à $validation mais pas à $matches, désalignant les deux tableaux parallèles. Cela permet à un objet requête d’être dispatché avec le handler d’une autre route.
  • Route confusion : la requête d’un endpoint (/wp/v2/categories) est exécutée par le handler de /wp/v2/posts, contournant la validation du schéma REST.
  • Injection SQL dans WP_Query (author__not_in) : une valeur scalaire non normalisée atteint la construction SQL sans coercition entière, permettant l’injection d’expressions SQL arbitraires (ex: SELECT IF((condition),SLEEP(delay),0)).

⚙️ Chaîne d’exploitation (PoC Python)

Le PoC est structuré en deux étapes :

  1. Pré-authentification : injection SQL aveugle basée sur le temps pour extraire le couple user_login:user_pass (hash) depuis la table wp_users.
  2. Post-authentification : utilisation des credentials récupérés (après crackage offline du hash) pour s’authentifier, uploader un plugin PHP malveillant via /wp-admin/update.php?action=upload-plugin, puis exécuter des commandes OS via system($_GET['c']).

🩹 Correctifs (WordPress 7.0.2 et 6.9.5)

Trois corrections ont été apportées :

  • Alignement de $matches[] et $validation[] lors d’une entrée WP_Error
  • Ajout de gardes contre la ré-entrée dans le dispatch REST (is_dispatching())
  • Normalisation inconditionnelle de author__not_in via wp_parse_id_list()

🔎 Indicateurs de compromission notables

  • User-Agents : wp2shell-check/1.0, wp2shell-poc/1.0
  • Boundary multipart : ----wp2shell
  • Fichiers : wp2shell-<8hex>.zip, wp-content/plugins/wp2shell-*/wp2shell-*.php
  • Marqueurs de sortie : WP2SHELL_OUT_START, WP2SHELL_OUT_END, WP2SHELL_REMOVED
  • Paramètres SQL dans author_exclude : SELECT IF, SLEEP, CHAR_LENGTH, SUBSTRING

📄 Nature de l’article

Il s’agit d’une analyse technique (code trace + PoC commenté) publiée par un chercheur indépendant. Le but principal est de documenter précisément le fonctionnement interne de la vulnérabilité, d’accompagner la publication d’un scanner open-source, et de fournir des indicateurs de détection exploitables.

🧠 TTPs et IOCs détectés

TTP

  • T1190 — Exploit Public-Facing Application (Initial Access)
  • T1059.004 — Command and Scripting Interpreter: Unix Shell (Execution)
  • T1505.001 — Server Software Component: SQL Stored Procedures (Persistence)
  • T1505.003 — Server Software Component: Web Shell (Persistence)
  • T1078 — Valid Accounts (Defense Evasion)
  • T1110.002 — Brute Force: Password Cracking (Credential Access)
  • T1552.001 — Unsecured Credentials: Credentials In Files (Credential Access)
  • T1083 — File and Directory Discovery (Discovery)
  • T1071.001 — Application Layer Protocol: Web Protocols (Command and Control)

IOC

  • URLs : /wp-json/batch/v1URLhaus
  • URLs : /?rest_route=/batch/v1URLhaus
  • URLs : /wp-admin/update.php?action=upload-pluginURLhaus
  • URLs : /wp-login.phpURLhaus
  • CVEs : CVE-2026-63030NVD · CIRCL
  • CVEs : CVE-2026-60137NVD · CIRCL
  • Fichiers : wp2shell-a1b2c3d4.zip
  • Chemins : wp-content/plugins/wp2shell-a1b2c3d4/wp2shell-a1b2c3d4.php
  • Chemins : wp-content/plugins/wp2shell-*

Malware / Outils

  • wp2shell (tool)
  • wp2shell-scanner (tool)

🟡 Indice de vérification factuelle : 50/100 (moyenne)

  • ⬜ blog.zsec.uk — source non référencée (0pts)
  • ✅ 31817 chars — texte complet (fulltext extrait) (15pts)
  • ✅ 9 IOCs (IPs/domaines/CVEs) (10pts)
  • ⬜ 0/3 IOCs confirmés externellement (0pts)
  • ✅ 9 TTPs MITRE identifiées (15pts)
  • ✅ date extraite du HTML source (10pts)
  • ⬜ aucun acteur de menace nommé (0pts)
  • ⬜ 0/2 CVE(s) confirmée(s) (0pts)

🔗 Source originale : https://blog.zsec.uk/wp2shell-code-trace-deep-dive/