In the last 72 hours, the National Vulnerability Database published seven CRITICAL-severity, network-vector CVEs affecting WordPress plugins: CVE-2026-110002, CVE-2026-97657, CVE-2026-97668, CVE-2026-104800, CVE-2026-87855, CVE-2026-104748, and CVE-2026-92097. The most severe of the set, CVE-2026-110002 (CVSS 9.8), is an unauthenticated Arbitrary File Upload vulnerability in the Snazzy Social Media Feed plugin, affecting all versions up to and including 2.5. Two additional 9.8-rated flaws — CVE-2026-97657 and CVE-2026-97668 — affect Abandoned Cart Pro for WooCommerce, with at least one confirmed as an authentication bypass.
Let me be blunt: unauthenticated arbitrary file upload in a WordPress plugin is a worst-case scenario for defenders. It means any unauthenticated remote attacker can drop a PHP webshell onto your server and achieve remote code execution under the web server context — full site compromise, database credential theft via wp-config.php, lateral movement into whatever that host can reach, and a staging point for ransomware or SEO spam operations. WordPress remains the most-attacked CMS on the internet, and plugin vulnerabilities like these are the primary entry vector we see in incident response engagements. If you run these plugins, treat this as an emergency change, not a routine patch cycle.
Technical Analysis
Affected Products and CVEs
| CVE | Product | Weakness | CVSS |
|---|---|---|---|
| CVE-2026-110002 | Snazzy Social Media Feed ≤ 2.5 | Arbitrary File Upload (CWE-434) | 9.8 |
| CVE-2026-97657 | Abandoned Cart Pro for WooCommerce | Authentication Bypass | 9.8 |
| CVE-2026-97668 | Abandoned Cart Pro for WooCommerce | Critical (network-exploitable) | 9.8 |
| CVE-2026-104800 | WordPress plugin (per NVD) | Critical (network-exploitable) | Critical |
| CVE-2026-87855 | WordPress plugin (per NVD) | Critical (network-exploitable) | Critical |
| CVE-2026-104748 | WordPress plugin (per NVD) | Critical (network-exploitable) | Critical |
| CVE-2026-92097 | WordPress plugin (per NVD) | Critical (network-exploitable) | Critical |
How CVE-2026-110002 Works
The root cause is a textbook WordPress plugin anti-pattern that I have personally exploited in penetration tests dozens of times: the plugin ships a standalone PHP script — save-to-cache.php — that is directly reachable via the web root but never bootstraps WordPress. Because WordPress core is never loaded, the script executes with:
- No authentication check —
is_user_logged_in()is never evaluated. - No capability check —
current_user_can()is absent, so subscriber-vs-admin distinctions are moot. - No nonce verification —
wp_verify_nonce()cannot run without the bootstrap, so CSRF protection is nonexistent.
Combined with insufficient sanitization of the pluginUR-derived input handling (the NVD description is truncated at pluginUR, consistent with a plugin-URL/path parameter being concatenated into a file write), an attacker can craft a direct HTTP request to something like:
/wp-content/plugins/snazzy-social-media-feed/save-to-cache.php
...and write arbitrary file content — including a .php webshell — to a web-accessible location. From there, it is a straight line to cmd.php?c=id and full code execution as www-data/apache/nginx. The attack requires zero authentication, zero user interaction, and network access only — hence the CVSS 9.8 (AV:N/AC:L/PR:N/UI:N).
The WooCommerce Abandoned Cart Pro Flaws
CVE-2026-97657 and CVE-2026-97668 (both CVSS 9.8) affect Abandoned Cart Pro for WooCommerce, a commercial plugin with a significant install base on revenue-generating storefronts. CVE-2026-97657 is confirmed as an authentication bypass. On a WooCommerce store, auth bypass does not just mean admin panel access — it means access to customer PII, order history, payment gateway configuration, and stored tokenized payment data, which pulls PCI-DSS scope directly into the blast radius. If you operate a WooCommerce store and are PCI-scoped, this is a reportable-risk event.
Exploitation Status
At the time of publication:
- None of the seven CVEs have been confirmed as added to the CISA Known Exploited Vulnerabilities (KEV) catalog — monitor CISA KEV continuously, because WordPress plugin CVEs at 9.8 with unauthenticated RCE historically move from disclosure to mass scanning within 24–72 hours.
- Given that
save-to-cache.phpis directly addressable and the flaw is trivially fingerprintable (a single GET to the plugin path confirms presence), assume automated exploitation attempts are imminent or already occurring. Wordfence, Patchstack, and WPScan feeds should be watched for PoC publication. - The safest operational posture: treat as exploited-in-the-wild until proven otherwise.
Detection & Response
These detections target the observable behaviors of this attack class: direct requests to the vulnerable standalone script, PHP file writes into web-accessible directories (especially wp-content/uploads/ and the plugin directory), and post-exploitation behavior where the web server process spawns a shell.
Sigma Rules
---
title: HTTP Request to Vulnerable Snazzy Social Media Feed save-to-cache.php
id: 3b7a1f92-6c4d-4e8a-b2f1-9d5c7e0a1234
status: experimental
description: Detects direct HTTP requests to the standalone save-to-cache.php script in the Snazzy Social Media Feed WordPress plugin, the attack vector for CVE-2026-110002 arbitrary file upload. Any request to this endpoint is suspicious because the script bypasses WordPress bootstrap and is not invoked through normal plugin operation by external clients.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-110002
author: Security Arsenal
date: 2026/04/06
tags:
- attack.initial_access
- attack.t1190
logsource:
category: webserver
detection:
selection:
cs-uri-stem|contains:
- '/wp-content/plugins/snazzy-social-media-feed/save-to-cache.php'
- '/snazzy-social-media-feed/save-to-cache.php'
condition: selection
falsepositives:
- Legitimate plugin cron-initiated requests from localhost (filter src IP to loopback/server IP)
level: critical
---
title: PHP File Written to WordPress Uploads or Plugin Directory
id: 8e2c4d61-1a5b-4f39-9c7e-2b8d6f1a4567
status: experimental
description: Detects creation of PHP files inside wp-content/uploads or plugin directories on a WordPress host. Legitimate WordPress operation never writes .php files into uploads; this is a hallmark indicator of webshell deployment following arbitrary file upload exploitation such as CVE-2026-110002.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-110002
author: Security Arsenal
date: 2026/04/06
tags:
- attack.persistence
- attack.t1505.003
logsource:
category: file_event
product: linux
detection:
selection:
TargetFilename|contains:
- '/wp-content/uploads/'
- '/wp-content/plugins/snazzy-social-media-feed/'
TargetFilename|endswith:
- '.php'
- '.phtml'
- '.phar'
- '.php5'
- '.php7'
condition: selection
falsepositives:
- Plugin updates writing files under the plugin directory (correlate with wp-cli or admin-initiated update windows; uploads/ has virtually no legitimate PHP writes)
level: high
---
title: Web Server Process Spawning Shell on Linux WordPress Host
id: 5f1d9e37-8b2c-4a6d-b4e8-7c3a9f2b6789
status: experimental
description: Detects the web server or PHP-FPM process spawning an interactive shell or common post-exploitation tooling, consistent with webshell execution after exploitation of WordPress plugin file upload vulnerabilities including CVE-2026-110002.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-110002
author: Security Arsenal
date: 2026/04/06
tags:
- attack.execution
- attack.t1059.004
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|endswith:
- '/apache2'
- '/httpd'
- '/nginx'
- '/php-fpm'
- '/php-cgi'
selection_child:
Image|endswith:
- '/sh'
- '/bash'
- '/dash'
- '/zsh'
- '/curl'
- '/wget'
- '/python'
- '/python3'
- '/perl'
- '/nc'
- '/ncat'
- '/netcat'
condition: selection_parent and selection_child
falsepositives:
- Rare legitimate plugin functionality invoking system tools (image processing, backups); investigate parent-child chains before whitelisting
level: critical
KQL (Microsoft Sentinel / Defender)
This query hunts web access logs ingested via CEF/Syslog (CommonSecurityLog and Syslog tables) for hits to the vulnerable script and for webshell-style requests into the uploads directory. The second section covers MDE-onboarded Linux web servers for post-exploitation process behavior.
// Hunt 1: Requests to vulnerable standalone script and PHP execution from uploads
let lookback = 7d;
let VulnPaths = dynamic(['save-to-cache.php', 'snazzy-social-media-feed']);
union isfuzzy=true
(CommonSecurityLog
| where TimeGenerated > ago(lookback)
| where RequestURL has_any (VulnPaths)
or (RequestURL has '/wp-content/uploads/' and RequestURL has_any ('.php', '.phtml', '.phar'))
| project TimeGenerated, SourceIP, DestinationHostName, RequestURL, RequestMethod, HttpUserAgentOriginal, DeviceAction
| extend TableSource = 'CommonSecurityLog'),
(Syslog
| where TimeGenerated > ago(lookback)
| where SyslogMessage has_any (VulnPaths)
or (SyslogMessage has '/wp-content/uploads/' and SyslogMessage has '.php')
| project TimeGenerated, HostIP, Computer, SyslogMessage, SeverityLevel
| extend TableSource = 'Syslog')
| summarize RequestCount = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by TableSource, SourceIP, RequestURL, bin(TimeGenerated, 1h)
| order by LastSeen desc;
// Hunt 2: Web server spawning shells on MDE-onboarded Linux hosts
DeviceProcessEvents
| where TimeGenerated > ago(lookback)
| where InitiatingProcessFileName has_any ('apache2', 'httpd', 'nginx', 'php-fpm', 'php-cgi')
| where FileName has_any ('sh', 'bash', 'dash', 'curl', 'wget', 'nc', 'ncat', 'python3', 'perl')
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine,
FileName, ProcessCommandLine, AccountName, RemoteIP, ReportId
| order by TimeGenerated desc;
Velociraptor VQL
Deploy this artifact across WordPress hosts to sweep for PHP webshells planted in uploads and recently modified PHP files inside the vulnerable plugin directory — the two highest-signal disk artifacts for CVE-2026-110002 exploitation.
-- Sweep WordPress hosts for webshell indicators: PHP in uploads, recent plugin-dir writes
LET upload_paths = glob(glob='/var/www/*/wp-content/uploads/**/*.php')
+ glob(glob='/var/www/*/wp-content/uploads/**/*.phtml')
+ glob(glob='/srv/www/*/wp-content/uploads/**/*.php')
+ glob(glob='/home/*/public_html/wp-content/uploads/**/*.php')
LET plugin_files = glob(glob='/var/www/*/wp-content/plugins/snazzy-social-media-feed/**/*.php')
+ glob(glob='/home/*/public_html/wp-content/plugins/snazzy-social-media-feed/**/*.php')
SELECT FullPath,
Size,
Mtime,
Ctime,
CASE
WHEN FullPath =~ 'wp-content/uploads' THEN 'PHP_IN_UPLOADS_HIGH_SEVERITY'
ELSE 'PLUGIN_DIR_FILE_REVIEW'
END AS Verdict
FROM foreach(row=upload_paths + plugin_files)
WHERE Mtime > (now() - 60 * 60 * 24 * 14) -- modified in last 14 days
ORDER BY Mtime DESC
Remediation & Verification Script
Run this Bash script on Linux-hosted WordPress servers to inventory the vulnerable plugins, disable them at the application layer (via WP-CLI where available, filesystem fallback otherwise), quarantine suspected webshells in uploads, and harden the uploads directory against PHP execution.
#!/usr/bin/env bash
# Security Arsenal - CVE-2026-110002 / WordPress plugin triage & hardening
# Run as root or with sudo. Test in staging first.
set -uo pipefail
WP_ROOTS=$(find /var/www /srv/www /home -maxdepth 4 -name wp-config.php -printf '%h\n' 2>/dev/null | sort -u)
QUAR=/root/quarantine-$(date +%Y%m%d%H%M%S)
mkdir -p "$QUAR"
for ROOT in $WP_ROOTS; do
echo "=== Processing $ROOT ==="
# 1. Inventory vulnerable plugins and versions
for PD in "$ROOT"/wp-content/plugins/*/; do
PNAME=$(basename "$PD")
case "$PNAME" in
snazzy-social-media-feed|*abandoned-cart*)
VER=$(grep -m1 -i 'Version:' "$PD"*.php 2>/dev/null | head -1 | awk '{print $NF}')
echo "[!] VULNERABLE PLUGIN FOUND: $PNAME version $VER at $PD"
# Disable via WP-CLI if available, else rename the directory
if command -v wp >/dev/null 2>&1; then
sudo -u www-data wp plugin deactivate "$PNAME" --path="$ROOT" 2>/dev/null \
&& echo "[+] Deactivated $PNAME via WP-CLI"
fi
mv "$PD" "$QUAR/$PNAME" && echo "[+] Quarantined plugin directory to $QUAR/$PNAME"
;;
esac
done
# 2. Hunt for PHP files planted in uploads (webshell sweep)
echo "[*] Scanning uploads for PHP webshells..."
find "$ROOT/wp-content/uploads" -type f \( -name '*.php' -o -name '*.phtml' -o -name '*.phar' -o -name '*.php5' \) \
-mtime -30 -print 2>/dev/null | while read -r SHELL_FILE; do
echo "[!] Suspicious PHP in uploads: $SHELL_FILE"
cp --parents "$SHELL_FILE" "$QUAR" && rm -f "$SHELL_FILE" && echo "[+] Quarantined: $SHELL_FILE"
done
# 3. Harden uploads against PHP execution (Apache .htaccess)
HT="$ROOT/wp-content/uploads/.htaccess"
if [ ! -f "$HT" ]; then
cat > "$HT" <<'EOF'
<FilesMatch "\.(php|phtml|phar|php[0-9])$">
Require all denied
</FilesMatch>
EOF
echo "[+] Wrote PHP execution block: $HT"
fi
done
# 4. Pull recent access-log hits to the vulnerable script for scoping
echo "[*] Checking access logs for exploitation attempts..."
grep -hE 'save-to-cache\.php|snazzy-social-media-feed' \
/var/log/apache2/access*.log* /var/log/nginx/access*.log* /var/log/httpd/access*.log* 2>/dev/null \
| grep -E 'POST|PUT' | tail -50 > "$QUAR/exploit-attempts.log"
[ -s "$QUAR/exploit-attempts.log" ] \
&& echo "[!] POSSIBLE EXPLOITATION ATTEMPTS logged to $QUAR/exploit-attempts.log — investigate POST bodies and source IPs" \
|| echo "[+] No direct hits to save-to-cache.php found in available logs"
echo "=== Triage complete. Evidence staged in $QUAR ==="
Remediation
Prioritized actions, in order:
- Snazzy Social Media Feed (CVE-2026-110002): All versions through 2.5 are vulnerable, and as of publication no patched version has been confirmed. Until the vendor releases a fix: deactivate and remove the plugin entirely from every site in your fleet. There is no configuration workaround for a standalone script that bypasses the WordPress bootstrap — disabling the plugin via the admin panel does not reliably block direct HTTP access to
save-to-cache.php, which is why the script above moves the directory off the web root entirely. Additionally, add a WAF/web-server-level deny rule for any request path containingsave-to-cache.php. - Abandoned Cart Pro for WooCommerce (CVE-2026-97657, CVE-2026-97668): Update immediately to the latest vendor release via your WooCommerce.com/PluginEver license channel and confirm with the vendor which release remediates these specific CVEs. If a fixed build is not yet available, disable the plugin on storefronts — the revenue impact of a disabled cart-recovery plugin is trivially small compared to an auth bypass exposing customer order and payment-adjacent data. If you are PCI-DSS scoped, document the exposure window and assess notification obligations with your QSA.
- The remaining four CVEs (CVE-2026-104800, CVE-2026-87855, CVE-2026-104748, CVE-2026-92097): Pull the full NVD entries for each, map them against your plugin inventory, and patch or remove accordingly. A CVSS 9.x network-vector WordPress plugin CVE with no authentication requirement does not wait for your next maintenance window.
- Assume breach on exposed hosts. Any host that had Snazzy Social Media Feed installed and internet-reachable since before disclosure should be swept for webshells (see VQL above), have
wp-config.phpdatabase credentials rotated, have all WordPress salts/keys regenerated (forcing session invalidation), and have admin accounts audited for unauthorized additions. Checkwp-content/uploads/for PHP files and review access logs for POST requests to plugin paths. - Structural hardening going forward: block PHP execution in
wp-content/uploads/at the web server layer (ApacheFilesMatchor nginxlocationdeny), deploy a WordPress-aware WAF rule set (Wordfence, Cloudflare managed rules, or ModSecurity OWASP CRS), enforce automatic minor plugin updates with an emergency-update runbook for critical CVEs, and subscribe to Patchstack/Wordfence intelligence feeds so plugin CVEs trigger alerts rather than surprises. - Monitor CISA KEV — if any of these seven CVEs are added, federal civilian agencies face Binding Operational Directive 22-01 remediation deadlines, and private-sector organizations should treat KEV listing as confirmation of active exploitation and escalate to emergency patching.
WordPress plugin vulnerabilities at this severity are not a patch-management hygiene issue — they are the single most common initial access vector we respond to in the field. The detection content above gives your SOC the telemetry to catch exploitation attempts and post-exploitation webshell activity even if a vulnerable site slips through patching. Don't wait for the KEV listing.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.