
Authentifizierter PoC für CVE-2026-0911: testet schwaches Datei-Upload- und Waisen-Dateiverhalten im Modul-Import-Endpunkt des WordPress-Hustle-Plugins, mit Multi-Ziel-Scanning und Payload-Anpassung.
Ein Forschungs-/Pentest-Hilfstool für das WordPress-Plugin Hustle (wordpress-popup, WPMU DEV), das das Upload-Verhalten über den authentifizierten Modulimport-Endpunkt im Rahmen von CVE-2026-0911 testet.
Das Skript CVE-2026-0911.py in diesem Repository bzw. dieser Dateisammlung darf nur auf Systemen verwendet werden, die Ihnen gehören oder für die Sie eine schriftliche Genehmigung haben.
In betroffenen Versionen (Wordfence/NVD: 7.8.9.2 und früher) wird der Aufruf von wp_handle_upload() in action_import_module() mit test_type => false ausgeführt, wodurch die Dateitypprüfung schwach bleibt; selbst wenn die JSON-Validierung nach dem Import fehlschlägt, wird die hochgeladene Datei möglicherweise („verwaiste“ Datei). Wenn der Server PHP unter ausführt, kann dies praktisch Teil einer Kette sein, die zu Remote Code Execution führt. In gepatchten Versionen kommt sowie eine -Einschränkung über temporäre hinzu.
wp-content/uploadstest_type => true.jsonupload_mimesFür eine detaillierte technische Zusammenfassung siehe den NVD-Eintrag und die Wordfence-Referenzen.
from __future__ import annotations)Beispielinstallation:
pip install requests
Mindestens ein Ziel (-u oder -l) und eine gültige WordPress-Sitzung (--cookie oder --cookie-file) sind erforderlich.
python CVE-2026-0911.py -u "https://example.com" --cookie "wordpress_logged_in_...=...; ..."
Hilfe:
python CVE-2026-0911.py --help
| Parameter | Beschreibung |
|---|---|
-u, --url | Einzelne Ziel-Root-URL (z. B. https://site.com) |
-l, --list | Datei mit einer URL pro Zeile (# für Kommentare) |
--cookie | Aus dem Browser kopierte Cookie-Zeichenkette |
--cookie-file | Datei, die das Cookie in einer einzelnen Zeile enthält |
--nonce | Manuelles WordPress-Nonce für hustle_single_action (statt automatischem Abruf) |
--admin-page | admin.php?page=-Wert, aus dem das Nonce abgerufen wird (Standard: hustle_popup_listing) |
--module-id | POST moduleId (Standard 0: ungültiges Modul → Importablauf) |
--module-type | popup, slidein, embedded, social_sharing |
--module-mode | Z. B. informational, optin |
--remote-name | Im Multipart gesendeter Dateiname (Standard: probe_rce.php) |
--payload-file | Inhalt aus Datei zum Hochladen lesen (überschreibt --uploader und die Standard-Probe) |
--uploader | Eingebauten Mini-PHP-Form-Uploader-Body verwenden |
--workers | Anzahl gleichzeitiger Threads im Listenmodus (Standard: 8) |
--timeout | Anfrage-Timeout in Sekunden (Standard: 25) |
--verify-ssl | TLS-Validierung aktivieren (Standard: deaktiviert) |
--debug | Zusätzliche Debug-Ausgabe |
admin-ajax.php-POST-Zusammenfassung, mögliche Kandidaten-URLs. Bei mehreren Zielen können die Zeilen durcheinander erscheinen, da sie von Threads stammen; jede Zeile enthält die Ziel-Domain.--quiet werden diese Details unterdrückt.-o-Datei angehängt (append) und mit flush / nach Möglichkeit fsync auf die Festplatte geschrieben. Standarddateiname: cve-2026-0911-hits.txt (absoluter Pfad im Arbeitsverzeichnis wird zusammengefasst).Einzelne Site, TLS-Validierung, Debugging:
python CVE-2026-0911.py -u "https://lab.local" --cookie-file cookie.txt --verify-ssl --debug
Listenscan, 16 Worker, benutzerdefinierte Ausgabe:
python CVE-2026-0911.py -l ziele.txt --cookie "..." --workers 16 -o ergebnisse.txt
Eingebauter Uploader-Body und benutzerdefinierter Remote-Dateiname:
python CVE-2026-0911.py -u "https://lab.local" --cookie "..." --uploader --remote-name test.php
single_module_action_nonce in optinVars gelesen.moduleId=0 kann das Plugin vor dem Upload aufgrund des Modullimits einen Fehler zurückgeben; in diesem Fall wird keine Datei geschrieben.wp-content/uploads/YYYY/MM/ generiert; wenn WordPress die Datei umbenennt, kann der tatsächliche Pfad abweichen.--cookie funktioniert nicht für verschiedene Domains; bei Multi-Site-Tests ist für jede Umgebung eine geeignete Sitzung erforderlich.0 zurückgegeben, andernfalls ein Nicht-Null-Code (Rückgabewert von main im Skript).Ctrl+C: 130.Dieses Tool ist ausschließlich für legale Sicherheitstests, Schulungen und defensive Zwecke bestimmt. Die Verwendung auf nicht autorisierten Systemen ist rechtswidrig und kann zu schweren Strafen führen. Autoren und Mitwirkende können nicht für Missbrauch haftbar gemacht werden.
--quiet| Domain-/Schritt-Logs deaktivieren; zusammenfassungsorientiert |
-o, --output | Datei, an die erfolgreiche „Hit“-Zeilen angehängt werden |