
CVE-2026-32475 El campo File Upload de Elementor Pro Forms maneja la validación y el procesamiento de archivos en dos bucles separados con un manejo diferente de las entradas de carga vacías (UPLOAD_ERR_NO_FILE). Un atacante no autenticado puede enviar un multipart
El campo de carga de archivos de Elementor Pro Forms maneja la validación y el procesamiento de archivos en dos bucles separados con un manejo diferente de las entradas de carga vacías (UPLOAD_ERR_NO_FILE). Un atacante no autenticado puede enviar una solicitud multipart con una primera parte de archivo vacía seguida de un payload PHP para el mismo campo, lo que hace que validation() retorne antes mientras que process_field() aún mueve el archivo PHP a un directorio público: wp-content/uploads/elementor/forms/.php
Recupera automáticamente el post_id, form_id y field_id de la página objetivo:
python poc.py -t http://localhost/wp --page-url "http://localhost/wp/?page_id=16" -c "whoami"
O:
python poc.py -t http://localhost/wp --page-id 16 -c "whoami"
Inicia una sesión interactiva:
python poc.py -t http://localhost/wp --page-id 16 -i
El núcleo de la vulnerabilidad es la omisión del propio mecanismo de carga de archivos. Esta parte no difiere tanto si realizas la prueba en un laboratorio local como contra un servidor real: la primera parte de archivo vacía + el payload PHP en el campo de carga omiten la validación de extensión, sin embargo, el archivo aún es procesado por process_field(). Demostramos que el archivo se escribe correctamente, que es exactamente lo que describe.
En cuanto a la ruta de Laragon hardcodeada:
Eso fue solo para facilitar la verificación local.
En el objetivo real, el patrón de directorio es conocido y fijo:
/wp-content/uploads/elementor/forms/
Lo que no es fijo es el nombre final del archivo.
Elementor no conserva el nombre original del archivo. En process_field(), el nombre de archivo almacenado se genera de la siguiente manera:
Por lo tanto, si subes shell.php, el nombre del archivo puede llegar a ser algo como:
66f3a1c2e9b47.php
dentro de:
/wp-content/uploads/elementor/forms/
uniqid() se basa en el tiempo y no es un valor aleatorio fuerte; se basa aproximadamente en la marca de tiempo + microsegundos. Por lo tanto, recuperar el archivo de forma remota se convierte en un problema de descubrimiento del nombre, más que de carga.
Por ejemplo, puedes usar una ventana de tiempo basada en la cabecera Date del servidor y el tiempo de la solicitud, buscar en un rango estrecho alrededor del momento de la carga, o recuperar la URL exacta si el formulario envía un correo que contiene [all-fields].
Mantuve el PoC centrado en demostrar el problema principal en sí, que es la carga de archivos no autenticada, de forma clara y directa. Explicar completamente la recuperación remota del valor uniqid() haría la demostración mucho más larga de lo necesario para validar la vulnerabilidad en sí.