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
wp2shell-poc — wp2shell (CVE-2026-63030 & CVE-2026-60137) - chaîne RCE complète | Kitploit
Outils/GitHubGitHub/icex0/wp2shell-poc
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionCommandement et ContrôleAuthentificationRed TeamingDéveloppement de Charges Utiles
GitHubicex0/wp2shell-poc

wp2shell-poc

wp2shell (CVE-2026-63030 & CVE-2026-60137) - chaîne RCE complète

Voir le dépôt
737168il y a 10 joursVérifié par Kitploit

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 →
Partager

wp2shell-poc

Preuve de concept indépendante pour l'injection SQL par confusion de route dans le lot REST non authentifié de WordPress, associée à l'avis wp2shell de Searchlight Cyber.

Ce dépôt n'est pas le vérificateur officiel de Searchlight Cyber. check confirme le chemin SQLi, read démontre la lecture de la base de données, et shell ouvre un shell de commande basé sur un plugin, soit avec des identifiants administrateur fournis, soit en exerçant d'abord le pont SQLi-vers-admin.

wp2shell — la commande shell exerçant le pont SQLi-vers-admin pré-authentification

Versions affectées

L'avis de Searchlight Cyber liste ces plages d'exposition RCE wp2shell :

Plage de versionsStatut
<= 6.8.5Non affecté
6.9.0 – 6.9.4Affecté
7.0.0 – 7.0.1Affecté

Comment ça fonctionne

Le point de terminaison REST batch (/batch/v1) n'est pas authentifié et exécute plusieurs sous-requêtes en un seul appel, en s'appuyant sur le fait que chaque sous-requête est validée et vérifiée individuellement.

serve_batch_request_v1() construit deux tableaux parallèles — $matches (le gestionnaire correspondant à chaque sous-requête) et $validation (le résultat de validation pour chaque sous-requête) — puis les indexe tous deux par le même décalage lors de l'envoi. Une sous-requête dont le chemin échoue à wp_parse_url() est ajoutée à $validation mais pas à $matches, de sorte que les tableaux se désynchronisent et qu'une sous-requête est envoyée sous le gestionnaire d'une autre sous-requête. C'est la confusion de route.

Le PoC imbrique la primitive deux fois :

  1. Une requête POST /wp/v2/posts qui contient un corps requests est envoyée sous le gestionnaire batch lui-même. Ayant été validée comme une requête de posts, sa liste requests n'est jamais vérifiée par rapport au schéma batch, donc ses sous-requêtes peuvent utiliser GET — la liste des méthodes autorisées est contournée.
  2. À l'intérieur de ce batch interne, une requête GET /wp/v2/posts/999999 de type route d'élément porte des paramètres de requête de collection de posts tels que author_exclude, orderby et per_page. L'ID 999999 n'a pas besoin d'exister ; c'est juste un ID de post improbable utilisé pour correspondre à la route d'élément, dont le schéma ne valide pas ces paramètres réservés aux collections. La désynchronisation envoie alors la même requête sous get_items() des posts, où author_exclude correspond à la variable de requête author__not_in de , que la version vulnérable interpole dans le SQL sous forme de chaîne.

Le résultat est une injection SQL aveugle basée sur le booléen et le temps, accessible sans authentification préalable. Ce PoC inclut également la primitive de faux post UNION utilisée par la chaîne SQLi-vers-admin.

Le chemin RCE implémenté ici est :

  1. Utiliser les lignes factices wp_posts via UNION pour afficher un contenu contrôlé par l'attaquant à travers une collection de posts. Le pont d'affichage utilise la source de route d'élément /wp/v2/posts/999999 — la même route que la lecture SQLi utilise pour atteindre get_items().
  2. Utiliser cet affichage pour forcer WordPress à créer de vrais posts de cache oEmbed.
  3. Récupérer ces vrais IDs de posts de cache via le SQLi.
  4. Dans une seule requête batch empoisonnée, reconvertir ces IDs en ensemble de modifications du personnalisateur, élément de navigation et forme de hook de requête.
  5. Laisser la même requête atteindre POST /wp/v2/users, créant un administrateur généré.
  6. Se connecter en tant que cet administrateur généré et utiliser le comportement de téléchargement de plugin pour exécuter une commande.

Les étapes 1 à 5 sont sans authentification ; l'étape d'exécution de commande est un téléchargement de plugin administrateur authentifié.

Prérequis

Python 3.8+ et la bibliothèque standard. Aucune dépendance tierce.

Utilisation

Exécutez-le depuis le répertoire du dépôt :

root@kitploit:~
./wp2shell.py <command> <url> [options]

Ou pip install . pour obtenir une commande wp2shell dans votre PATH.

check — vérification de vulnérabilité non destructive

Affiche d'abord les marqueurs passifs de WordPress et les indices de version publique, puis envoie une sonde de marqueur batch inoffensive. Une implémentation batch vulnérable renvoie un code HTTP 207 avec le motif de marqueur de confusion de route parse_path_failed, block_cannot_read et rest_batch_not_allowed.

La sonde de marqueur est basée sur le correctif du noyau WordPress. La requête malformée /// crée parse_path_failed ; une requête /wp/v2/posts agit comme un espaceur autorisé en batch ; la route /wp/v2/block-renderer/... n'est pas autorisée en batch mais renvoie block_cannot_read si son gestionnaire est atteint de manière anonyme ; /batch/v1 donne rest_batch_not_allowed. Sur les versions vulnérables, l'erreur d'analyse décale les tableaux du gestionnaire batch, de sorte que la requête espaceur est envoyée sous le gestionnaire de block-renderer. Les versions corrigées maintiennent les tableaux alignés, donc ce motif exact des trois ne devrait pas apparaître pour la sonde conçue.

Par défaut, check s'arrête là et n'envoie pas de charge utile SQLi. Utilisez --confirm-sqli si vous souhaitez également une confirmation active du SQLi. La confirmation essaie d'abord la primitive de lecture UNION et se rabat sur des sondes de temporisation appariées si la réflexion UNION n'est pas disponible.

Les signaux sont indépendants : un indice de version n'est qu'un indice, le motif de marqueur montre une confusion de route, et --confirm-sqli montre qu'une charge utile a atteint la base de données. Un WAF peut bloquer la charge utile, donc un échec de confirmation ne prouve pas l'absence du bogue.

root@kitploit:~
./wp2shell.py check http://target
./wp2shell.py check targets.txt          # scanne chaque URL du fichier

read — extraire des données via injection SQL

root@kitploit:~
./wp2shell.py read http://target                      # empreinte du serveur
./wp2shell.py read http://target --preset users       # identifiants de connexion et hachages de mots de passe
./wp2shell.py read http://target --query "SELECT @@version"

Par défaut, l'extraction utilise --technique auto, qui essaie les méthodes disponibles dans cet ordre :

  1. union — forge une ligne factice WP_Post via UNION et lit son titre depuis la réponse REST sous forme de ||HEX(valeur)||. La charge utile utilise la même route source /wp/v2/posts/999999 avec orderby=none et per_page=500 pour que la ligne factice survive en tant que post rendu. Une requête par valeur.
  2. error — EXTRACTVALUE/UPDATEXML fuite environ 15 octets par requête, lorsque la cible reflète les erreurs MySQL (par ex. WP_DEBUG_DISPLAY activé).
  3. blind — recherche binaire booléenne, environ 8 requêtes par caractère ; lit l'en-tête X-WP-Total de la collection de posts comme signal vrai/faux et n'a besoin d'aucune valeur réfléchie.

Forcez-en une avec --technique union|error|blind. Ces chemins de lecture n'écrivent pas de lignes dans la base de données.

shell — exécution de commande

Avec --user et --password, shell se connecte avec les identifiants administrateur fournis et utilise le comportement de téléchargement de plugin WordPress.

Sans identifiants, shell exécute d'abord le pont SQLi-vers-admin pré-authentification, se connecte en tant qu'administrateur généré, puis télécharge le shell du plugin.

root@kitploit:~
./wp2shell.py shell http://target --user admin --password '<recupere>' --cmd id
./wp2shell.py shell http://target --user admin --password '<recupere>' -i   # shell interactif
./wp2shell.py shell http://target --cmd id                                   # pont pré-auth
./wp2shell.py shell http://target -i                                         # interactif pré-auth

shell télécharge un webshell de plugin (verrouillé derrière un chemin aléatoire et un jeton par exécution) et affiche son chemin. Le webshell téléchargé est supprimé automatiquement. Lorsque le pont pré-auth crée un administrateur, ce compte généré est supprimé automatiquement après la fin de la session shell.

Options

Correction

Mettez à jour vers WordPress 7.0.2, ou 6.9.5 si le site est sur la branche 6.9. En attendant, bloquez à la fois /wp-json/batch/v1 et le paramètre de requête rest_route=/batch/v1 en périphérie, ou exigez une authentification pour le point de terminaison batch via le filtre rest_pre_dispatch.

Légal

Pour les tests de sécurité autorisés uniquement. Utilisez-le exclusivement contre des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de tester. Aucune garantie n'est fournie et aucune responsabilité n'est acceptée en cas d'utilisation abusive.

Références

  • Annonce de la version WordPress 7.0.2 — https://wordpress.org/news/2026/07/wordpress-7-0-2-release/
  • Avis Searchlight Cyber wp2shell — https://slcyber.io/research-center/wp2shell-pre-authentication-rce-in-wordpress-core/
  • sergiointel/wp2shell-poc Pont SQLi-vers-admin — https://github.com/sergiointel/wp2shell-poc
Télécharger l’outil
WP_Query
OptionS'applique àDescription
--proxy URLtousRouter le trafic via un proxy HTTP (par exemple, Burp).
--timeout NtousDélai d'attente de requête en secondes.
--sleep NcheckDélai utilisé par le repli temporel pour --confirm-sqli.
--samples NcheckPaires temporelles utilisées par le repli temporel pour --confirm-sqli.
--confirm-sqlicheckEnvoie également une charge utile active de confirmation SQLi.
--presetreadfingerprint ou users.
--techniquereadauto (défaut), union (en bande, forge un faux post), error (en bande, nécessite des erreurs DB visibles), ou blind.
--queryreadUne expression SQL scalaire à lire.
--prefixreadPréfixe de table de base de données (défaut wp_).
--max-length NreadNombre maximum de caractères lus par valeur (défaut 128).
--user / --passwordshellIdentifiants admin facultatifs ; omettre les deux pour utiliser le pont pré-auth.
--cmdshellCommande à exécuter (omettre lors de l'utilisation de -i).
-i / --interactiveshellOuvre un shell interactif après le déploiement.