
Authenticated PoC pour CVE-2026-0911 : teste le téléversement de fichiers faible et le comportement des fichiers orphelins dans le point de terminaison d'importation de modules du plugin WordPress Hustle, avec analyse multi-cibles et personnalisation des charges utiles.
Outil d'assistance à la recherche / pentest qui teste le comportement de téléversement via le point de terminaison d'import de module nécessitant une authentification, dans le cadre de CVE-2026-0911 pour le plugin WordPress Hustle (wordpress-popup, WPMU DEV).
Le script CVE-2026-0911.py contenu dans ce dépôt ou cet ensemble de fichiers ne doit être utilisé que sur des systèmes vous appartenant ou testés avec une autorisation écrite.
Dans les versions affectées (Wordfence/NVD : 7.8.9.2 et antérieures), l'appel à wp_handle_upload() dans action_import_module() est effectué avec test_type => false, ce qui laisse la validation du type de fichier faible ; même si la validation JSON après l'import échoue, le fichier téléversé peut (fichier « orphelin »). Si le serveur exécute du PHP sous , cela peut faire partie d'une chaîne menant en pratique à une exécution de code à distance. Dans les versions corrigées, et une restriction via temporaire sont appliqués.
wp-content/uploadstest_type => true.jsonupload_mimesConsultez l'enregistrement NVD et les références Wordfence pour un résumé technique détaillé.
from __future__ import annotations)Exemple d'installation :
pip install requests
Au moins une cible (-u ou -l) et une session WordPress valide (--cookie ou --cookie-file) sont obligatoires.
python CVE-2026-0911.py -u "https://exemple.com" --cookie "wordpress_logged_in_...=...; ..."
Aide :
python CVE-2026-0911.py --help
| Paramètre | Description |
|---|---|
-u, --url | URL racine d'une cible unique (ex. https://site.com) |
-l, --list | Fichier contenant une URL par ligne (commentaires avec #) |
--cookie | Chaîne de cookies copiée depuis le navigateur |
--cookie-file | Fichier contenant le cookie sur une seule ligne |
--nonce | Nonce WordPress manuel pour hustle_single_action (au lieu de la récupération automatique) |
--admin-page | Valeur admin.php?page= depuis laquelle récupérer le nonce (défaut : hustle_popup_listing) |
--module-id | moduleId du POST (défaut 0 : module invalide → flux d'import) |
--module-type | popup, slidein, embedded, social_sharing |
--module-mode | Ex. informational, optin |
--remote-name | Nom de fichier envoyé dans le multipart (défaut : probe_rce.php) |
--payload-file | Lire le contenu à téléverser depuis un fichier (remplace --uploader et la sonde par défaut) |
--uploader | Utiliser le corps du mini uploader PHP intégré |
--workers | Nombre de threads simultanés en mode liste (défaut : 8) |
--timeout | Délai d'expiration des requêtes en secondes (défaut : 25) |
--verify-ssl | Activer la validation TLS (défaut : désactivée) |
--debug | Sortie de débogage supplémentaire |
admin-ajax.php, URL candidates possibles. En mode multi-cibles, les lignes peuvent apparaître entremêlées car elles proviennent des threads ; chaque ligne contient le nom de domaine de la cible.--quiet supprime ces détails.append) au fichier -o, écrits sur disque avec flush / fsync si possible. Nom de fichier par défaut : cve-2026-0911-hits.txt (le chemin absolu dans le répertoire de travail est résumé).Site unique, validation TLS, débogage :
python CVE-2026-0911.py -u "https://lab.local" --cookie-file cookie.txt --verify-ssl --debug
Scan de liste, 16 workers, sortie personnalisée :
python CVE-2026-0911.py -l cibles.txt --cookie "..." --workers 16 -o resultats.txt
Corps d'uploader intégré et nom de fichier distant personnalisé :
python CVE-2026-0911.py -u "https://lab.local" --cookie "..." --uploader --remote-name test.php
single_module_action_nonce dans optinVars.moduleId=0, le plugin peut renvoyer une erreur avant le téléversement en raison de la limite de modules ; dans ce cas, le fichier n'est pas écrit.wp-content/uploads/YYYY/MM/ ; si WordPress renomme le fichier, le chemin réel peut différer.--cookie ne fonctionne pas sur différents domaines ; pour les tests multi-sites, une session appropriée est requise pour chaque environnement.0 si au moins un « hit » réussi, sinon un code non nul (retour de main dans le script).Ctrl+C : 130.Cet outil est destiné uniquement à un usage légal de test de sécurité, éducatif et défensif. Son utilisation sur des systèmes non autorisés est illégale et peut entraîner de lourdes sanctions. Les auteurs et contributeurs ne peuvent être tenus responsables d'un usage abusif.
--quiet | Désactiver les journaux de domaine/étapes ; axé sur le résumé |
-o, --output | Fichier dans lequel les lignes de « hits » réussis sont ajoutées |