WordPress wp2shell CVE-2026-63030 / CVE-2026-60137 exploitation
Summary
wp2shell is a pre-authentication remote-code-execution chain in WordPress Core. CVE-2026-63030 is a REST API batch-route interpretation-conflict issue that can expose the CVE-2026-60137 WP_Query author__not_in SQL-injection primitive on default installations. The combined chain affects WordPress 6.9.0 through 6.9.4 and 7.0.0 through 7.0.1; WordPress 6.8.0 through 6.8.5 is affected by CVE-2026-60137 but not the default-install RCE chain described in CVE-2026-63030.
Wiz Research reported active exploitation on 2026-07-20 against self-hosted cloud instances. Observed activity included malicious-plugin and PHP-webshell installation, administrator-panel access, user enumeration, local-file-inclusion attempts against wp-config, and high-volume scanning. This moves wp2shell from patch prioritization into incident-response territory for internet-facing systems exposed before remediation.
Tags
- ops
- operations
- WordPress
- wp2shell
- CVE-2026-63030
- CVE-2026-60137
- REST API
- SQL injection
- remote code execution
- active exploitation
- PHP web shell
- malicious plugin
- CMS
Why this matters
- The combined chain is remotely reachable without authentication on affected default WordPress installations and has a CVSS 3.1 base score of
9.8in the CNA CVE record. - Wiz observed successful exploitation shortly after public disclosure, not only scanning or proof-of-concept traffic.
- watchTowr subsequently reported internet-wide spraying after public exploit release, with honeypots receiving tens of thousands of attempts and more than 100 attacker-created administrator accounts observed across affected environments.
- Malicious plugins and web shells survive ordinary WordPress sessions and provide a durable route to filesystem, database, credential, and application-secret access.
- Wiz telemetry found that 25% of organizations using WordPress exposed a vulnerable server to the internet when the CVEs were published; that figure fell to 10% within 24 hours, but previously exposed systems still require compromise assessment.
Affected and fixed releases
- Combined pre-auth RCE chain: WordPress
6.9.0–6.9.4, fixed in6.9.5; and7.0.0–7.0.1, fixed in7.0.2. - CVE-2026-60137 SQL injection without the CVE-2026-63030 default-install chain: WordPress
6.8.0–6.8.5, fixed in6.8.6. The SQL-injection CVE record says exploitation on this branch requires a plugin or theme to pass untrusted input intoauthor__not_in. - WordPress.org released
7.0.2on 2026-07-17 and the WordPress update API lists7.0.2,6.9.5, and6.8.6as current security releases for their respective branches.
Observed exploitation
- Entry point: requests abuse
/?rest_route=/batch/v1or/wp-json/batch/v1. - Plugin upload: Wiz observed access to
/wp-admin/plugin-install.php?tab=uploadfollowed byPOST /wp-admin/update.php?action=upload-pluginto install persistent backdoors. - User discovery: requests to
/wp-json/wp/v2/users?context=editharvested administrator usernames and email addresses. - Credential-file targeting: local-file-inclusion attempts used
admin-ajax.php?template=../../../wp-configto seek database credentials and authentication keys. - Authenticated access: successful HTTP 200 responses from
/wp-admin/indicated attacker-controlled authenticated sessions after exploitation. - Scanning: high-volume batch-endpoint probing occurred alongside successful compromises; not every request implies code execution.
- Public-exploit escalation: watchTowr reported early credential-hash exfiltration followed by RCE as further details became public, widespread indiscriminate spraying, fake plugin deployment, secondary tooling, and at least one attempted Overlord RAT installation.
- Independent sensor telemetry: KEVIntel reported 35 attempts from 13 unique attacker IPs across eight sensors as of 2026-07-21. Treat aggregate counts as confirmation of active exploitation, not an estimate of total internet volume.
Payloads and persistence
Wiz described three PHP backdoor shapes:
- A minimal one-line
evalweb shell that accepts a secret POST parameter and returns HTTP 404 when it is absent. - A roughly 150 KB web shell disguised as a WordPress plugin named CMSmap. The sample uses a graphical interface, password authentication, file and database management, port scanning, batch code injection, and privilege-escalation modules. Its payload is hidden with hex-string concatenation and
eval(gzuncompress(base64_decode(...))). - A malicious plugin that registers an unauthenticated custom REST route under
/morning/v1/…, base64-decodes a supplied command, executes it withpassthru, and returns output as JSON.
Do not rely on a single filename or plugin slug: the observed backdoors range from trivial one-liners to full-featured plugin-shaped shells.
Detection and triage
- Search reverse-proxy, CDN, WAF, and origin logs for requests to
/?rest_route=/batch/v1and/wp-json/batch/v1, especially HTTP200or207responses followed by admin, plugin-upload, user-enumeration, or file-inclusion activity. - Hunt user-agent strings containing
wp2shellorrezwp2shell; Wiz reports these as purpose-built exploit-tool signatures, but absence does not rule out exploitation. - Review access to
/wp-admin/plugin-install.php?tab=upload,POST /wp-admin/update.php?action=upload-plugin,/wp-json/wp/v2/users?context=edit, anomalous/wp-admin/sessions, and traversal-styleadmin-ajax.phpparameters. - Inventory plugins and compare them with known-good deployment state. Investigate newly installed, unexpectedly activated, unsigned, or locally modified plugins and custom REST routes, including routes under
/morning/v1/. - Inspect WordPress Core,
wp-content/plugins,wp-content/mu-plugins, themes, and uploads for new or modified PHP files, one-lineevalshells, gzip/base64 runtime unpacking, permissive REST callbacks,passthru,shell_exec, and similar command-execution functions. - Review database users, roles, options, scheduled actions, cron,
.htaccess,wp-config.php, PHP configuration, web-server configuration, and hosting-panel state for persistence or credential access.
Public indicators
The following were published by Wiz as exploitation or payload pivots. Treat shared infrastructure as investigative context rather than standalone attribution.
Exploitation and scanning addresses
45.79.167[.]23834.81.132[.]6279.177.131[.]20615.157.135[.]17094.100.52[.]128172.235.128[.]52— reported as mass scanning
PHP web-shell hashes
2a1410d8e2a8337ac2171cedea8c0fdc47c647a058eca847e9eae9e6b08cc211f1559817b71bc4ccebea44890f434d5d67ede22009a3f4bb5cac33f8d9a220c8039f1c4d72cae7ccb8b3a33dec8815bee9756e2338f84746007235e4cab7a70d5b3ca47f
Response guidance
- Update immediately to
7.0.2,6.9.5,6.8.6, or a newer supported release as appropriate. Confirm the effective runtime version rather than assuming background updates completed. - Treat prior internet exposure as a compromise-assessment trigger. Patching closes the vulnerability but does not remove uploaded plugins, web shells, stolen sessions, or harvested secrets.
- If patching cannot happen immediately, temporarily block unauthenticated access to both batch-route forms at the WAF or disable anonymous REST API access. Validate application impact and remove the temporary restriction after patching; filtering is not remediation.
Cloudflare published blocking rules for both CVEs and advises customers to verify that ruleset overrides have not changed the new rules from
BlocktoLog. - Preserve CDN/WAF/origin logs, WordPress and PHP logs, filesystem timestamps, plugin inventories, database snapshots, process telemetry, and volatile evidence before cleanup where incident response matters.
- On confirmed or credible exploitation, isolate the host; rebuild from known-good artifacts where possible; rotate WordPress salts and keys, administrator and application passwords, database credentials, hosting/control-panel credentials, deployment keys, cloud credentials, and secrets readable by the web process; invalidate active sessions.
- Check adjacent infrastructure and cloud accounts for follow-on access. Wiz had not observed lateral movement or data exfiltration at publication time, which is not evidence that an individual compromised environment remained contained.
Attribution caveats
Wiz reported multiple actors and opportunistic mass scanning. The published indicators do not establish a single campaign or actor, and the CMSmap disguise is not evidence that the legitimate CMSmap project participated in the activity.
Related pages
- WP-SHELLSTORM webshell access brokerage
- WP Maps Pro CVE-2026-8732 exploitation
- Drupal Core CVE-2026-9082 exploitation
Sources
- Wiz Research: Exploitation in the Wild of wp2shell
- WordPress: WordPress 7.0.2 Release
- GitHub / WordPress advisory for CVE-2026-63030: GHSA-ff9f-jf42-662q
- GitHub / WordPress advisory for CVE-2026-60137: GHSA-fpp7-x2x2-2mjf
- CVE record: CVE-2026-63030
- CVE record: CVE-2026-60137
- Aikido Security: Unauthenticated RCE in WordPress core (wp2shell), via SQL injection
- Cloudflare: Protecting against critical WordPress vulnerabilities
- KEVIntel: CVE-2026-63030 exploitation telemetry
- The Hacker News: wp2shell exploitation grows as public exploit fuels mass scanning