StoreKeeper for WooCommerce Unauthenticated Arbitrary File Upload (CVE-2025-48148)
by Nxploited (Khaled Alenazi) · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-48148
- Category
- web
- Affected product
- StoreKeeper for WooCommerce (WordPress plugin)
- Affected versions
- <= 14.4.4
- Disclosed
- 2026-07-06
- Patch status
- unpatched
Tags
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-48148 |
| Category | web |
| Severity | Critical |
| CVSS Score | 9.8 (per NVD) |
| Status | Weaponized |
| Tags | wordpress, woocommerce, storekeeper, arbitrary-file-upload, unauthenticated, webshell, rce, cwe-434, python |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | StoreKeeper for WooCommerce (WordPress plugin) |
| Versions Affected | <= 14.4.4 |
| Language / Platform | Python 3 PoC targeting a PHP/WordPress site |
| Authentication Required | No |
| Network Access Required | Yes (HTTP to target WordPress site) |
Summary
The StoreKeeper for WooCommerce plugin exposes an admin-ajax.php action (upload_product_image) that fails to validate the type/extension of uploaded files, in all versions up to and including 14.4.4. An unauthenticated attacker can extract a public AJAX nonce from the target site and then upload a file named shell.php (disguised with a PNG magic-byte header and an image/png MIME type) directly to the WordPress uploads directory. Because the server does not enforce that uploaded “product images” are actually images, the uploaded PHP file is stored and directly executable, giving the attacker unauthenticated remote code execution.
Vulnerability Details
Root Cause
The plugin’s upload_product_image AJAX handler accepts any file submitted in the file POST field and stores it under wp-content/uploads/ without validating the real file type/extension — only a nonce check (not an authentication/capability check) gates the request. The PoC crafts a file named shell.php whose content starts with the PNG magic bytes (\x89PNG\r\n\x1a\n) followed by inline PHP:
| |
It is then submitted with Content-Type: image/png but the real filename shell.php, and the plugin trusts the request rather than validating file contents:
| |
Because the WordPress nonce for this AJAX action can be harvested from any unauthenticated page load (it is embedded in the page markup, not tied to an authenticated session), no credentials are needed at all.
Attack Vector
- Send an unauthenticated GET request to the target WordPress site and scrape the
"nonce":"<hex>"value embedded in the page response via regex. - Build a malicious file named
shell.phpwith a PNG magic-byte header followed by a minimal PHP web shell (system($_GET['cmd'])). - POST the file to
wp-admin/admin-ajax.phpwithaction=upload_product_imageand the harvested nonce, spoofingX-Forwarded-For/Referer/X-Requested-Withheaders to blend in as a normal AJAX request and evade basic WAF rules. - The plugin saves the file as-is into the public uploads directory and returns its URL (e.g.
wp-content/uploads/shell.php) in the JSON response. - The attacker requests
shell.php?cmd=<command>directly to execute arbitrary OS commands on the server.
Impact
Unauthenticated remote code execution on any WordPress site running the vulnerable StoreKeeper for WooCommerce plugin — full server compromise, since the uploaded PHP file lands in a web-accessible directory and is executed by the PHP interpreter.
Environment / Lab Setup
Target: WordPress site with StoreKeeper for WooCommerce plugin <= 14.4.4 active
Attacker: Python 3 + requests library (see requirements.txt)
Proof of Concept
PoC Script
See
CVE-2025-48148.pyandrequirements.txtin this folder.
| |
Detection & Indicators of Compromise
Signs of compromise:
- Unexpected
.phpfiles present inwp-content/uploads/ - Files in the uploads directory that begin with the PNG magic-byte signature but contain PHP code
- Outbound GET requests to uploaded files carrying a
cmdquery parameter - Unusual
admin-ajax.php?action=upload_product_imagetraffic from anonymous IPs
Remediation
| Action | Detail |
|---|---|
| Primary fix | Upgrade StoreKeeper for WooCommerce to a version newer than 14.4.4 that enforces server-side file-type/extension validation on uploads |
| Interim mitigation | Disable or restrict the upload_product_image AJAX action pending patch; block execution of PHP files under wp-content/uploads/ at the web server level; monitor for unauthenticated POSTs to admin-ajax.php with this action |
References
Notes
Mirrored from https://github.com/Nxploited/CVE-2025-48148 on 2026-07-06. The script uses templated Nxploited-style branding and header-spoofing tricks (X-Forwarded-For, X-Originating-IP, etc.) for WAF evasion, but the core exploit logic (nonce harvesting + PNG-disguised PHP upload via upload_product_image) is specific and functional for this CVE.
| |