WPvivid Backup & Migration Unauthenticated Arbitrary File Upload RCE (CVE-2026-1357)
by masterwok · 2026-07-05
- Severity
- Critical
- CVE
- CVE-2026-1357
- Category
- web
- Affected product
- WPvivid Backup & Migration WordPress plugin
- Affected versions
- Up to and including 0.9.123
- Disclosed
- 2026-07-05
- Patch status
- unpatched
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-04 |
| Author / Researcher | masterwok |
| CVE / Advisory | CVE-2026-1357 |
| Category | web |
| Severity | Critical |
| CVSS Score | Not specified in source |
| Status | Weaponized |
| Tags | wordpress, wpvivid, arbitrary-file-upload, rce, unauthenticated, cryptography, path-traversal |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | WPvivid Backup & Migration WordPress plugin |
| Versions Affected | Up to and including 0.9.123 |
| Language / Platform | PHP (WordPress plugin); PoC written in Python 3 |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
The WPvivid Backup & Migration plugin’s remote migration/“send to site” feature decrypts an incoming session key with openssl_private_decrypt(). When decryption fails, the function returns boolean false instead of the code aborting, and that false is passed straight into phpseclib’s AES cipher initialization, which treats it as an all-null-byte key — a fully predictable value an attacker can also use. Combined with the plugin’s failure to sanitize the filename embedded in the decrypted payload, an attacker can encrypt a malicious file (a PHP web shell) with the known null-byte key, set a path-traversal filename, and have the plugin write it outside its intended backup directory into a public, web-accessible location. The included PoC builds this encrypted payload, uploads it via the wpvivid_action=send_to_site handler, and then invokes the dropped shell to execute arbitrary OS commands.
Vulnerability Details
Root Cause
Improper error handling of a failed RSA decryption (openssl_private_decrypt() returning false) causes a predictable, attacker-known AES key (16 null bytes) to be used for the migration payload, and the plugin does not sanitize the destination filename, allowing directory traversal out of the backup/staging directory.
Attack Vector
- Attacker builds a JSON payload containing a PHP web-shell (
<?php system($_GET["cmd"]); ?>) and a traversal filename such as../uploads/<random>.php. - Attacker encrypts the JSON payload with AES-CBC using the known null-byte key and null IV, then wraps it with a fake RSA key-length header to satisfy the plugin’s parsing.
- Attacker sends the encoded payload to the target via an unauthenticated POST request with
wpvivid_action=send_to_site. - The plugin fails to properly decrypt/validate the session key, falls back to the predictable AES key, decrypts the attacker’s payload, and writes the PHP file to
wp-content/uploads/due to the unsanitized traversal filename. - Attacker requests the dropped file with a
?cmd=query parameter to execute arbitrary commands on the server.
Impact
Unauthenticated remote code execution as the web server user (typically www-data), leading to full compromise of the WordPress installation and potentially the underlying host.
Environment / Lab Setup
Target: WordPress + WPvivid Backup & Migration plugin <= 0.9.123 (docker-compose lab: MariaDB + WordPress, plugin mounted from a staged folder)
Attacker: Python 3, requirements.txt (requests, pycryptodome)
Proof of Concept
PoC Script
See
CVE-2026-1357.py,docker-compose.yml, andrequirements.txtin this folder.
| |
The script derives the predictable null-byte AES key, encrypts a PHP web-shell payload with a traversal filename, uploads it via the plugin’s send_to_site action, then requests the dropped shell with the given --command and prints the command output.
Detection & Indicators of Compromise
Signs of compromise:
- PHP files with unfamiliar, randomly generated names in
wp-content/uploads/. - GET/POST requests to those uploaded files containing a
cmdparameter. - Outbound requests to the site root with
wpvivid_action=send_to_sitefrom unrecognized IPs.
Remediation
| Action | Detail |
|---|---|
| Primary fix | Update WPvivid Backup & Migration to a version beyond 0.9.123 that validates RSA decryption failures and sanitizes destination filenames |
| Interim mitigation | Disable or remove the plugin if not actively used; block execution of PHP files under wp-content/uploads/ via web server configuration. |
References
Notes
Mirrored from https://github.com/masterwok/PoC-CVE-2026-1357 on 2026-07-05.
| |