🔍 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 unWP_Errorqui est ajouté à$validationmais 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 :
- Pré-authentification : injection SQL aveugle basée sur le temps pour extraire le couple
user_login:user_pass(hash) depuis la tablewp_users. - 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 viasystem($_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éeWP_Error - Ajout de gardes contre la ré-entrée dans le dispatch REST (
is_dispatching()) - Normalisation inconditionnelle de
author__not_inviawp_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/v1— URLhaus - URLs :
/?rest_route=/batch/v1— URLhaus - URLs :
/wp-admin/update.php?action=upload-plugin— URLhaus - URLs :
/wp-login.php— URLhaus - CVEs :
CVE-2026-63030— NVD · CIRCL - CVEs :
CVE-2026-60137— NVD · 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/