Like leaving the back door of a tiny boutique wide open on the internet — anyone can walk in, but almost nobody knows the shop exists
CVE-2026-27540 is an unrestricted file upload in the WooCommerce Wholesale Lead Capture plugin (a premium WordPress plugin by Rymera Web Co / Wholesale Suite) affecting all versions through 2.0.3.1. The vulnerable AJAX handler wwlc_file_upload_handler accepts a client-supplied file_settings parameter that overrides the server-side allowed-extensions list. An unauthenticated attacker sends a crafted multipart POST to wp-admin/admin-ajax.php with action=wwlc_file_upload_handler, sets permitted extensions to include .php, and uploads a webshell. No authentication, no user interaction, no race condition — it's a straight shot to remote code execution under the web server's process context.
The vendor's CRITICAL/9.0 score (some sources cite 9.8 with AC:L) is technically accurate for the vulnerability mechanics — unauthenticated RCE via trivial HTTP request is textbook critical. However, the score does not capture the real-world exposure surface: this is a premium niche plugin with roughly 6,000 active installations globally. For an enterprise fleet of 10,000 hosts, the probability of running this plugin is near zero unless the organization operates WooCommerce-based wholesale storefronts. The active exploitation campaign (100,000+ blocked attempts documented by Wordfence from February through August 2026) confirms weaponization is real, but the blast radius per compromised site is limited to that single WordPress instance — there is no lateral-movement multiplier, no domain escalation, no supply-chain pivot inherent to the plugin's role.
4 steps from start to impact.
Identify vulnerable WordPress instance
- Target runs WordPress with WooCommerce Wholesale Lead Capture ≤ 2.0.3.1
- Target's
admin-ajax.phpis reachable (default on all WordPress sites)
- Only ~6,000 active installations worldwide
- Premium plugin — not discoverable via wordpress.org free directory queries
Craft malicious upload request
admin-ajax.php with action=wwlc_file_upload_handler. The request includes a forged file_settings parameter that sets allowed_file_types to include php and disables MIME-type validation. A PHP webshell payload is attached as the file body. No authentication headers are needed.- Knowledge of the AJAX action name and parameter structure (public PoCs exist)
- None — the request is trivial to construct and PoCs are available
wwlc_file_upload_handler in POST body will catch this. Wordfence has published specific firewall rules.Upload PHP webshell
.php file to the WordPress uploads directory. The file is immediately accessible via a predictable URL path under wp-content/uploads/. The attacker receives the file path in the AJAX response.- Web server allows PHP execution in uploads directory (common default)
- Uploads directory is writable (required for normal WordPress operation)
- Some hardened WordPress configs disable PHP execution in
wp-content/uploads/via.htaccessor Nginx rules - Cloud-hosted WordPress (WP Engine, Kinsta, Pantheon) may sandbox uploads
.php files in uploads directories.Achieve remote code execution
www-data or apache). From here, the attacker can read wp-config.php for database credentials, dump customer/payment data, install persistent backdoors, or pivot to other sites on the same shared hosting environment.- Uploaded PHP file is executable via web request
- Execution context is limited to web server user privileges — no root/SYSTEM
- Blast radius is the single WordPress instance (plus shared-hosting neighbors)
- Container-based WordPress deployments limit filesystem and network pivoting
The supporting signals.
| In-the-Wild Exploitation | Active. Wordfence documented 100,000+ blocked exploitation attempts from Feb–Aug 2026. Multiple IP-based campaigns observed (92.241.13.213, 31.59.129.150, and others). Not KEV-listed but exploitation is confirmed and ongoing. |
|---|---|
| Proof-of-Concept | Public. At least 2 GitHub repositories host PoC code (indexed by SecureWithUmer/CVE-2026-PoCs). The exploit is trivial — a single curl command with multipart form data. |
| EPSS Score | 0.01734 (top ~5% — moderate exploitation probability). Understates actual risk given confirmed active exploitation. |
| KEV Status | Not listed as of 2026-09-16. Surprising given the documented exploitation campaigns — likely because it's a third-party WordPress plugin, not a vendor product CISA typically tracks. |
| CVSS Vector | User-provided: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H (9.0). Multiple sources report AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H (9.8). The AC:L variant is more accurate — exploitation requires no race condition or special circumstances. |
| Affected Versions | WooCommerce Wholesale Lead Capture ≤ 2.0.3.1 (all versions prior to fix). Premium plugin, no free tier. |
| Fixed Version | 2.0.3.2 — released by Rymera Web Co / Wholesale Suite. Available through the plugin's commercial update channel. |
| Exposure / Install Base | ~6,000 active installations globally (per Wordfence and plugin marketplace data). Niche premium WooCommerce extension for wholesale B2B registration workflows. |
| Disclosure Timeline | Disclosed 2026-02-20, CVE published 2026-03-19. Exploitation began within days of disclosure per Wordfence telemetry (first spike 2026-02-25). |
| Reporter | Discovered by Wordfence / Patchstack ecosystem researchers. Coordinated disclosure through the WordPress plugin security ecosystem. |
noisgate verdict.
Active unauthenticated RCE with confirmed in-the-wild exploitation keeps this firmly dangerous for any site running the plugin. The single most decisive factor for downgrading from CRITICAL is the extremely narrow installed base (~6,000 sites globally) — for a typical enterprise fleet, the probability of exposure approaches zero, and per-site blast radius is limited to a single WordPress instance with no inherent domain/fleet/supply-chain escalation path.
Why this verdict
- Unauthenticated RCE with trivial exploit: No credentials, no user interaction, single HTTP request. Public PoCs are available and exploitation is actively occurring — this is the floor-setting factor that prevents any downgrade below HIGH.
- Tiny global install base: ~6,000 active installations of a premium niche WooCommerce plugin. For an enterprise managing 10,000 hosts, the odds of running this plugin are negligible unless the organization specifically operates wholesale B2B storefronts on WordPress.
- Single-site blast radius: Compromise yields web-server-level access to one WordPress instance. No domain controller, no fleet propagation, no supply-chain pivot. The worst secondary outcome is shared-hosting lateral movement, which is environment-dependent.
- Role multiplier: WordPress with a WooCommerce wholesale plugin occupies role (b) at best — a line-of-business web storefront. It is not an identity provider, hypervisor, backup server, CI/CD system, or network edge appliance. The compromised site may hold customer PII and payment metadata (blast radius: tenant-level data breach), but this does not reach domain/fleet/supply-chain scale. The floor for HIGH is met by the active exploitation of unauth RCE; the floor for CRITICAL is NOT met because the component is not canonically high-value-role software and <0.01% of the enterprise server fleet runs it.
- Active exploitation confirmed but not KEV-listed: Wordfence has blocked 100,000+ attempts across multiple campaigns from Feb–Aug 2026. The lack of KEV listing is likely due to CISA's focus on vendor products rather than third-party WordPress plugins, not an indicator of low risk.
Why not higher?
CRITICAL would be appropriate if this plugin were widely deployed infrastructure software (e.g., a core WordPress component affecting millions of sites) or if the compromised component occupied a high-value role like an identity provider or hypervisor. With only ~6,000 global installations and single-site blast radius limited to web-server-user context, the exposure population and impact ceiling do not justify CRITICAL for enterprise prioritization. The AC:H in the user-provided CVSS vector (if accurate) would further reduce severity, though most public sources report AC:L.
Why not lower?
Active unauthenticated RCE with confirmed exploitation campaigns involving 100,000+ attempts is a hard floor for HIGH. The exploit is trivial (single curl command), PoCs are public, and attackers are actively scanning for this specific plugin. Any organization that does run this plugin faces immediate, no-skill-required compromise. Downgrading to MEDIUM would be irresponsible given the confirmed weaponization.
What to do — in priority order.
- Block the AJAX action at WAF/reverse proxy — Add a WAF rule to deny any POST to
admin-ajax.phpcontainingaction=wwlc_file_upload_handlerin the request body. This neutralizes the attack vector entirely without breaking core plugin functionality for existing registered users. Deploy within 30 days per noisgate mitigation SLA for HIGH, or immediately if you have confirmed installations. - Disable PHP execution in uploads directory — Add
php_flag engine offin.htaccessor equivalent Nginxlocationblock forwp-content/uploads/. This prevents any uploaded PHP file from executing, converting the file upload into a harmless file-write. This is a defense-in-depth measure that should already be in place on hardened WordPress deployments. - Update to version 2.0.3.2 — Apply the vendor patch via the Wholesale Suite commercial update channel. This is the definitive fix. Target completion within 30 days (noisgate mitigation SLA for HIGH).
- Audit uploads directory for existing webshells — Search
wp-content/uploads/for.phpfiles that should not exist. Check web server access logs for POST requests toadmin-ajax.phpwithwwlc_file_upload_handlerfollowed by GET requests to files in the uploads directory. Cross-reference against published IOC IPs (92.241.13.213, 31.59.129.150, etc.).
- WordPress user-role restrictions — the vulnerability is unauthenticated, so WordPress authentication and role checks are completely bypassed.
- CAPTCHA on registration forms — the exploit hits the AJAX handler directly, not the registration form UI. CAPTCHA provides zero protection.
- Disabling WordPress REST API — the exploit uses the legacy
admin-ajax.phpendpoint, not the REST API. Disabling REST API has no effect on this attack vector.
Crowdsourced verification payload.
Run this on each WordPress host (or via SSH across your fleet) as any user with read access to the WordPress installation directory. Usage: bash check_cve_2026_27540.sh /var/www/html where the argument is the WordPress root directory. No elevated privileges required.
#!/bin/bash
# CVE-2026-27540 checker — WooCommerce Wholesale Lead Capture
# Usage: bash check_cve_2026_27540.sh /path/to/wordpress
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
WP_ROOT="${1:-.}"
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/woocommerce-wholesale-lead-capture"
if [ ! -d "$PLUGIN_DIR" ]; then
echo "UNKNOWN — WooCommerce Wholesale Lead Capture plugin not found at $PLUGIN_DIR"
exit 2
fi
# Extract version from the main plugin file header
MAIN_FILE="$PLUGIN_DIR/woocommerce-wholesale-lead-capture.php"
if [ ! -f "$MAIN_FILE" ]; then
echo "UNKNOWN — Main plugin file not found"
exit 2
fi
VERSION=$(grep -i 'Version:' "$MAIN_FILE" | head -1 | sed 's/.*Version:[[:space:]]*//' | tr -d '[:space:]')
if [ -z "$VERSION" ]; then
echo "UNKNOWN — Could not extract plugin version"
exit 2
fi
echo "Detected WooCommerce Wholesale Lead Capture version: $VERSION"
# Compare version — vulnerable if <= 2.0.3.1
# Use sort -V for version comparison
FIXED="2.0.3.2"
LOWEST=$(printf '%s\n%s' "$VERSION" "$FIXED" | sort -V | head -1)
if [ "$VERSION" = "$FIXED" ] || [ "$LOWEST" = "$FIXED" ]; then
echo "PATCHED — Version $VERSION >= $FIXED"
exit 0
else
echo "VULNERABLE — Version $VERSION is below fixed version $FIXED (CVE-2026-27540)"
# Bonus: check for existing webshells in uploads
UPLOADS="$WP_ROOT/wp-content/uploads"
if [ -d "$UPLOADS" ]; then
SHELLS=$(find "$UPLOADS" -name '*.php' -type f 2>/dev/null | wc -l)
if [ "$SHELLS" -gt 0 ]; then
echo "WARNING: Found $SHELLS .php file(s) in uploads directory — possible compromise!"
find "$UPLOADS" -name '*.php' -type f 2>/dev/null
fi
fi
exit 1
fiIf you remember one thing.
wwlc_file_upload_handler today as a same-day compensating control, then patch within the noisgate mitigation SLA of 30 days. Audit your wp-content/uploads/ directories for .php webshells and review access logs against the published IOC IPs. If you do NOT run this plugin (likely, given only ~6,000 global installs), confirm its absence via the verification script and move on — this CVE does not affect your fleet.Sources
- GBHackers — Active Exploitation of WooCommerce Wholesale Lead Capture
- NVD — CVE-2026-27540 Detail
- Rapid7 — CVE-2026-27540 Vulnerability Database
- Exploit Intel — CVE-2026-27540 Analysis
- Wholesale Suite — Plugin Changelog
- OpenCVE — CVE-2026-27540
- SecurityOnline — WooCommerce Wholesale Lead Capture Exploited in the Wild
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.