WP移行専用プラグイン for CPI <= 1.0.2 - Unauthenticated Arbitrary File Upload RCE (CVE-2025-11170)
by Nxploited (Khaled Alenazi) · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-11170
- Category
- web
- Affected product
- WP移行専用プラグイン for CPI (cpi-wp-migration, a CPI/site-migration import plugin for WordPress)
- Affected versions
- <= 1.0.2
- Disclosed
- 2026-07-06
- Patch status
- unpatched
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-06 |
| Last Updated | 2026-07-06 |
| Author / Researcher | Nxploited (Khaled Alenazi) |
| CVE / Advisory | CVE-2025-11170 |
| Category | web |
| Severity | Critical |
| CVSS Score | 9.8 (per NVD) |
| Status | Weaponized |
| Tags | wordpress, cpi-wp-migration, unauthenticated-file-upload, rce, admin-ajax, cwe-434, python |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | WP移行専用プラグイン for CPI (cpi-wp-migration, a CPI/site-migration import plugin for WordPress) |
| Versions Affected | <= 1.0.2 |
| Language / Platform | Python 3 (exploit); PHP / WordPress (target) |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
The “WP移行専用プラグイン for CPI” WordPress plugin is vulnerable to unauthenticated arbitrary file upload due to missing file type validation in the Cpiwm_Import_Controller::import function, present in all versions up to and including 1.0.2. The plugin registers an unauthenticated wp_ajax_nopriv action (cpiwm_import) that accepts a filename and base64-encoded file content and writes it directly to a predictable, web-accessible plugin storage directory. The included PoC (CVE-2025-11170.py) is a 142-line script with retry/backoff logic that POSTs a base64-encoded shell.php payload to wp-admin/admin-ajax.php and reports the resulting shell path on success, enabling unauthenticated remote code execution.
Vulnerability Details
Root Cause
The Cpiwm_Import_Controller::import handler, wired to the WordPress AJAX action cpiwm_import (and exposed to unauthenticated users via wp_ajax_nopriv_cpiwm_import), decodes attacker-supplied base64 data and writes it verbatim to wp-content/plugins/cpi-wp-migration/storage/<filename> using an attacker-controlled filename parameter, with no validation of file extension or content type. Since the storage directory is inside the web root and directly reachable over HTTP, an uploaded .php file is executed by the server on request.
Attack Vector
- Attacker sends an unauthenticated
POSTrequest to<target>/wp-admin/admin-ajax.phpwithaction=cpiwm_import, afilenameof e.g.shell.php,dataset to base64-encoded PHP (default PoC payload is<?php system($_GET['cmd']); ?>), and anindexvalue. - The plugin’s AJAX handler decodes the
dataparameter and writes it towp-content/plugins/cpi-wp-migration/storage/<filename>without validating the file type. - A successful upload is signaled by the endpoint returning the literal string
0. - The attacker requests the newly written file directly (
.../wp-content/plugins/cpi-wp-migration/storage/shell.php?cmd=<command>) to execute arbitrary OS commands.
Impact
Unauthenticated remote code execution on the WordPress host, since the plugin writes attacker-controlled PHP content into a web-accessible, executable directory with no authentication check.
Environment / Lab Setup
Target: WordPress site with "WP移行専用プラグイン for CPI" (cpi-wp-migration) <= 1.0.2 installed and activated
Attacker: Python 3, `pip install requests`
Proof of Concept
PoC Script
See
CVE-2025-11170.pyin this folder.
| |
Additional flags: -d (base64 file content, default is a simple system($_GET['cmd']) shell), -i (index field), -H (extra headers), -t/--retries/--backoff (HTTP timeout/retry tuning), -v (verbosity).
Detection & Indicators of Compromise
Signs of compromise:
- Non-migration files (e.g.
shell.php) present inwp-content/plugins/cpi-wp-migration/storage/ - AJAX requests with
action=cpiwm_importoriginating from IPs with no legitimate admin session - Outbound command execution activity correlated with requests to the plugin’s storage directory
Remediation
| Action | Detail |
|---|---|
| Primary fix | Update the “WP移行専用プラグイン for CPI” plugin to a patched version that validates uploaded file types/extensions and restricts the cpiwm_import AJAX action to authenticated, authorized users — no official patched version identified at time of mirroring, see references |
| Interim mitigation | Deactivate the plugin if not actively in use for migration, block unauthenticated access to admin-ajax.php actions related to cpiwm_import at the WAF level, and audit/remove non-expected files from the plugin’s storage/ directory |
References
Notes
Mirrored from https://github.com/Nxploited/CVE-2025-11170 on 2026-07-06. Uses templated Nxploited-style branding (function names prefixed Nxploited_, banner text, Telegram contact) but the exploit logic — a direct base64-payload POST to the cpiwm_import AJAX action — is CVE-specific and functional.
| |