
Reproduction de CVE : cve-2026-63030_60137-wordpress_rce_reproduction
Découvreur : Searchlight Cyber (via GPT-5.6 Sol)
Sévérité : Critique — CVSS 9.8 (CVE-2026-63030), CVSS 9.1 (CVE-2026-60137)
Statut : Exploité activement — ajouté au catalogue KEV de la CISA
Alias : « wp2shell »
Il s'agit d'une chaîne d'exécution de code à distance non authentifiée dans WordPress Core, composée de deux CVE :
| CVE | Composant | Type | CWE |
|---|---|---|---|
| CVE-2026-63030 | Endpoint batch de l'API REST WP | Confusion de route / bypass de contrôle d'accès | CWE-436 |
| CVE-2026-60137 | Paramètre author__not_in de WP_Query | Injection SQL | CWE-89 |
Chacune de ces failles est grave prise individuellement ; combinées, elles permettent à un attaquant non authentifié d'exécuter du code PHP arbitraire sur la cible et de déployer des webshells.
L'API REST de WordPress expose un endpoint batch à l'adresse /wp-json/wp/v2/batch. En raison d'une faille dans la résolution de route (introduite dans le middleware de routage réécrit de WP 6.9), le processeur batch ne valide pas correctement que les sous-requêtes internes d'un lot héritent des contrôles d'authentification et d'autorisation de la requête externe. Un attaquant peut élaborer une charge utile batch qui :
wp/v2/users, wp/v2/plugins) sans les vérifications de capacité requises.WP_REST_Server::dispatch() pour transmettre des paramètres de route forgés aux gestionnaires internes.Ceci contourne toutes les protections d'authentification pour les opérations de lecture et certaines opérations d'écriture lorsqu'il est combiné à de la contrebande de paramètres.
author__not_inLa classe WP_Query accepte un paramètre author__not_in destiné à exclure les articles de certains identifiants d'auteur. Un bug de coercition de type dans la méthode WP_Query::get_posts() (introduit lors de la refactorisation de l'assainissement des requêtes de WP 6.9) fait que les valeurs de author__not_in sont interpolées directement dans la clause SQL WHERE sans paramétrage adéquat lorsqu'elles sont fournies sous la forme d'un tableau associatif spécialement conçu.
L'injection se produit dans le SQL généré post_author IN (...). En imbriquant des tableaux avec des fragments SQL bruts, un attaquant peut sortir de la clause IN et exécuter des instructions UNION / INTO OUTFILE arbitraires — à condition que l'utilisateur de la base de données possède le privilège FILE.
Attacker (unauthenticated)
│
├─ POST /wp-json/wp/v2/batch
│ └─ CVE-2026-63030: Bypass auth, invoke internal query API
│ └─ CVE-2026-60137: Inject SQL via author__not_in
│ └─ UNION SELECT ... INTO OUTFILE 'webshell.php'
│ └─ Webshell deployed to web root
│ └─ RCE achieved
L'endpoint batch fournit le vecteur ; l'injection SQL fournit le moyen de livraison de la charge utile.
| Plage de versions | Chaîne complète |
|---|---|
| WordPress 6.9.0 – 6.9.4 | ✅ Les deux CVE présentes |
| WordPress 7.0.0 – 7.0.1 | ✅ Les deux CVE présentes |
| WordPress ≤ 6.8.x | CVE-2026-63030 uniquement (SQLi non exploitable) |
Les correctifs ont été fournis dans WordPress 6.9.5 et 7.0.2 (publiés tous deux le 2026-07-16).
/wp-json/wp/v2/batch renvoie 200 (et non 403/404).--target (voir ci-dessous)./wp-content/webshell.php?cmd=id.python exploit.py --target https://target.example.com --action deploy-webshell
python exploit.py --target https://target.example.com --action exec --command "id"
python exploit.py --target https://target.example.com --action exec --command "uname -a"
POST /wp-json/wp/v2/batch au niveau du WAF / proxy inverse.FILE à l'utilisateur MySQL de WordPress.define('DISALLOW_FILE_EDIT', true); et define('DISALLOW_FILE_MODS', true);..php inattendus sous wp-content/.author__not_in non entières dans les journaux de requêtes.