High-resolution close-up of HTML code displayed on a computer screen, perfect for technology themes.
News

wp2shell (CVE-2026-63030): How Two Chained WordPress Core Bugs Enable Unauthenticated Remote Code Execution on Default Installations

wp2shell chains CVE-2026-63030 and CVE-2026-60137 for unauthenticated RCE in WordPress core. No account needed. Patch to 6.9.5 or 7.0.2 now.
Sami Malik
Copywriter

WordPress powers an estimated 43% of all websites on the internet, which is why a critical flaw in WordPress core, not in a plugin, not in a theme, but in the software itself, draws attention in a way that plugin vulnerabilities rarely do. On 17 July 2026, a GitHub Security Advisory was published for CVE-2026-63030, one half of a two-bug chain that together allow an unauthenticated attacker to run arbitrary code on any default WordPress installation running an affected version. The chain has been named wp2shell.

The affected versions are WordPress 6.9.0 through 6.9.4 and 7.0.0 through 7.0.1. Fixed versions are 6.9.5 and 7.0.2. What makes the immediate patch priority acute is that a working proof-of-concept was published on GitHub by researcher 0xsha shortly after the advisory, and exploitation of a default installation requires no prior authentication, no user interaction, and no unusual server configuration.

The Two Vulnerabilities and How They Chain

wp2shell is the combination of two distinct flaws. CVE-2026-63030 is a REST API batch-route confusion vulnerability. WordPress exposes a REST API batch endpoint at /wp-json/batch/v1 that allows multiple API requests to be bundled and sent together. The confusion flaw in this endpoint allows an unauthenticated request to be processed in a way that bypasses the authentication checks that would normally gate the individual sub-requests. This alone does not allow code execution, but it opens a path to the second flaw.

CVE-2026-60137 is a SQL injection vulnerability in WordPress core. Under normal conditions, the SQL injection path is not reachable without authentication because the relevant code is only called in authenticated contexts. CVE-2026-63030 removes that requirement. A crafted batch request can reach the SQL injection code without a valid session, and SQL injection against a WordPress database can be used to write a PHP web shell to the filesystem, which then gives the attacker arbitrary code execution as the web server user.

The chained path, from unauthenticated HTTP request to shell on the server, requires no plugins, no unusual configuration, and no persistent object cache. A bare WordPress installation at an unpatched version is fully exposed on a default setup. That is the sentence that should set the patch priority.

What a Default Installation Means in Practice

The qualifier "default installation" is doing important work in assessing scope. A persistent object cache, such as Redis or Memcached integrated with WordPress, changes the code path in a way that breaks the SQL injection step. Sites that have configured object caching are not vulnerable to the current chained exploit. However, a default WordPress installation has no such cache configured, which means the overwhelming majority of smaller sites, agency-hosted sites, and self-managed WordPress installations running the affected versions are vulnerable.

Rapid7's ETR analysis of the vulnerability confirmed that the code-execution path functions only in the absence of a persistent object cache, but also noted that the default configuration lacks one. The practical implication is that organisations running WordPress at scale need to audit which installations are on affected versions and which have object caching configured, without assuming that caching is in place simply because it may be recommended practice.

Working Exploit Code Is Already Public

By the time the GitHub Security Advisory was published, a full working proof-of-concept had already appeared on GitHub in the repository 0xsha/wp2shell. The code demonstrates the complete attack chain from an unauthenticated batch request through to web shell deployment. Once a PoC at this level of completeness is publicly available, the time to widespread exploitation in the wild becomes very short. Automated scanners that identify WordPress sites and test for specific version fingerprints can be paired with the PoC to run opportunistic exploitation campaigns at scale.

BleepingComputer reported that public exploits were circulating and that patch-now advisories were being issued by security vendors including Cloudflare, which confirmed that its Web Application Firewall rules protect against the wp2shell chain for sites behind Cloudflare's proxy. For sites not behind a WAF, or behind WAFs that had not yet updated their rule sets, the only reliable protection is patching WordPress.

Mitigation While Patching Is Under Way

Upgrading to WordPress 6.9.5 or 7.0.2 is the definitive fix. For any deployment where an immediate upgrade is not possible, the most effective short-term mitigation is blocking the batch endpoint at the web server or WAF layer. The two paths to reach the endpoint are /wp-json/batch/v1 and ?rest_route=/batch/v1. Blocking both for anonymous requests removes the initial step of the chain without affecting authenticated REST API usage for most front-end integrations.

Installing a plugin that disables anonymous access to the REST API entirely is an alternative, but it may break functionality on sites that expose API-powered front ends to unauthenticated users. Assessing what the site actually uses before applying a blanket block is worth the time it takes.

WordPress installations that are not regularly updated are a persistent source of compromised web infrastructure. A compromised WordPress site is commonly used to host phishing pages, serve malware to visitors, or act as a proxy node in larger attack campaigns. Beyond the immediate risk to the organisation running the site, unpatched WordPress installations contribute to the broader criminal infrastructure ecosystem. Understanding where your organisation's web presence sits in terms of external exposure is part of assessing the downstream consequences of a web server compromise.

Version Fingerprinting and Opportunistic Exploitation

WordPress installations expose their version in several places by default: the generator meta tag in page HTML, the readme.html file at the root, and the version parameter appended to core stylesheet and script URLs. Security-conscious administrators often suppress or obscure these signals, but many sites leave them in place, making version fingerprinting straightforward for an automated scanner.

The combination of easy version detection, a critical unauthenticated RCE, and a public PoC creates the conditions for the kind of mass exploitation that has historically followed high-severity WordPress core vulnerabilities. The patch releases for 6.9.5 and 7.0.2 are available through the WordPress admin dashboard's automatic update mechanism, through WP-CLI for managed deployments, and through managed WordPress hosting control panels. Any of the three provides a reliable update path.

What Happens After Exploitation

Once an attacker has code execution on a WordPress web server via a dropped web shell, the server itself is fully compromised. The web shell gives the attacker a command interface running as the web server user. From there, the attacker can read the wp-config.php file, which contains the WordPress database credentials, the database host, and the secret keys used to sign authentication cookies. Those credentials, particularly if the database server is reachable from the web server, open the database directly.

WordPress databases contain user table rows with hashed passwords. If those passwords are reused at other services, or if the bcrypt hashes are weak enough to be cracked, the breach extends beyond the web server. For sites where editors and administrators share credentials between WordPress and other systems, a WordPress compromise can pivot into email accounts, project management tools, or cloud service consoles.

The credential exposure that follows a web server compromise often surfaces on criminal forums. Monitoring for credential exposure linked to your organisation's domains provides early warning that compromised data is in circulation before attackers have finished leveraging it.

WordPress at Enterprise Scale: The Patch Management Gap

WordPress in enterprise and agency environments often involves a large number of distinct installations, each managed by different teams or clients, running different versions, and with different update cadences. The diversity of plugins and themes in use creates practical constraints on how quickly WordPress core can be updated: a core update can break theme or plugin compatibility, so update testing cycles are not always as short as a critical security vulnerability would require.

The wp2shell disclosure shortens those timelines by removing the luxury of a test-and-update cycle for any site running the affected core versions. A working public exploit for unauthenticated RCE means that the question is not whether an attacker can exploit an unpatched site, but when. The standard approach of staging a core update, testing for compatibility breaks, and then rolling out to production over a week or two is not viable when attackers are running automated scanners against sites running vulnerable version strings.

WordPress has an automatic update mechanism that can apply minor and security releases without manual intervention. For many sites running WordPress 6.9.x, the automatic update to 6.9.5 will run during the next scheduled check if automatic security updates are enabled. The challenge is that automatic updates are not universally enabled, particularly in managed hosting environments where the hosting provider controls the update cycle, and in custom enterprise installations where automatic updates have been disabled to prevent unexpected changes.

For organisations managing multiple WordPress installations, WP-CLI provides a scriptable way to check versions and apply updates across all sites from a central management host. The command wp core update --version=6.9.5, run against each installation, applies the update and can be scripted for bulk execution. Combining WP-CLI with a site registry that lists all WordPress installations under management is a workable approach for agencies and enterprise IT teams with a WordPress estate of any size.

The SQL injection component of wp2shell (CVE-2026-60137) also raises questions about what an attacker can do with database access before arriving at code execution. Reading the WordPress database directly, without going through the code-execution path, gives an attacker access to user password hashes, email addresses, and any data stored by plugins in custom database tables. Customer data, order data, form submissions, and membership information are commonly stored in plugin tables. The database credential from wp-config.php, read via the web shell, unlocks all of that data directly. For any site storing data beyond standard WordPress user accounts, the scope of a wp2shell breach extends significantly beyond the server compromise itself.

Site owners who have not yet patched should assume that any Internet-facing WordPress installation on an affected version may have been compromised and treat it accordingly: review access logs for requests to /wp-json/batch/v1, check for web shell files in the upload directories, and verify file integrity against known-good checksums for core files. Rapid7's ETR for CVE-2026-63030 includes specific indicators of compromise and log signatures that site owners can use to assess whether exploitation has occurred.

Scope Assessment: Which WordPress Versions Are Exposed

Understanding exactly which WordPress versions are vulnerable to the wp2shell chain is the first step in any patch assessment. The affected versions span two minor release lines: 6.9.0, 6.9.1, 6.9.2, 6.9.3, and 6.9.4 in the 6.9 line, and 7.0.0 and 7.0.1 in the 7.0 line. Versions prior to 6.9.0 are not affected by the specific batch-route confusion in CVE-2026-63030 because the REST API batch endpoint in its current form was not present in earlier versions. Versions 6.9.5 and 7.0.2 and any subsequent releases are patched.

For organisations managing a fleet of WordPress sites, identifying which sites are in the vulnerable range requires either centralised version tracking through a management dashboard, active version scanning against known sites, or WP-CLI queries run across the fleet. Passive inventory records that were last updated before the 6.9.0 release may not reflect current versions accurately if sites have been updated since the last audit. Running wp core version via WP-CLI against all known sites and filtering for versions in the affected range is the most reliable approach for bulk assessment.

Multisite WordPress installations, where a single WordPress installation hosts multiple sites through the network feature, present a particular consideration. A multisite network runs a single WordPress core installation shared across all sites in the network. If that core installation is on a vulnerable version, all sites in the network are affected through the shared codebase. Patching a multisite network patches all sites simultaneously, which is an advantage from an update management perspective, but the blast radius of a compromise before patching is also correspondingly larger.

Web Shell Indicators and Post-Compromise Forensics

The wp2shell chain ends with a PHP web shell written to the WordPress filesystem. Web shells are typically small PHP files that accept commands through HTTP requests and execute them on the server. The most common locations where the wp2shell chain would write a web shell are the wp-content/uploads directory, because it is writable by the web server user and typically excluded from modification tracking, and less commonly the wp-content/plugins or wp-content/themes directories.

Identifying a web shell requires either file integrity monitoring that detects new PHP files in directories where PHP execution is unexpected, or manual inspection of those directories for recently created PHP files. The WordPress uploads directory should not contain PHP files under normal operation: PHP files found there are almost certainly either a web shell or part of a plugin misconfiguration. A find command restricted to the uploads directory and filtering for PHP files created within a recent time window is a quick initial check.

Web server access logs will contain the attacker's requests to the web shell after it has been written. Web shell requests are typically HTTP POST requests to a PHP file in the uploads directory with a parameter containing the command to execute. The response to these requests, particularly if the response body is unusually long and contains system command output, is another detection signal in the access logs.

If exploitation has occurred, the scope of compromised data depends on what the attacker chose to access after gaining shell access. The immediate action after identifying a web shell should be to quarantine the site, preserve the logs, and begin a systematic check of what data was accessible from the compromised server: the WordPress database credentials, the database contents, any other files on the filesystem accessible to the web server user, and any environment variables containing secrets. A forensic inventory of what was accessible is necessary before assessing notification obligations.

The Plugin Ecosystem and False Comfort

Because WordPress security discussions frequently focus on plugin vulnerabilities, some administrators have developed the intuition that WordPress core itself is very well-audited and less likely to contain critical flaws. The wp2shell disclosure challenges that intuition. WordPress core does receive significant security attention, but its codebase has also grown considerably with the addition of the Gutenberg block editor, the REST API expansion, and various modern features. The REST API batch endpoint, introduced as part of that expansion, is precisely where CVE-2026-63030 was found.

The plugin security intuition can create a false sense of comfort for sites running lean WordPress configurations: a site with only a few well-maintained plugins may feel secure relative to a heavily customised site, but both are equally exposed to a WordPress core vulnerability like wp2shell. The number of plugins installed has no bearing on exposure to CVE-2026-63030 and CVE-2026-60137. The only relevant factors are the WordPress core version and whether a persistent object cache is in place.

For site owners who have upgraded to 6.9.5 or 7.0.2 and confirmed the upgrade was successful via version check, no further action is needed with respect to wp2shell specifically. Verifying that WordPress version display is suppressed from the generator meta tag and readme.html reduces the ease of fingerprinting for future vulnerabilities, but it does not affect the current fix status. The fix is in the code, not in obscuring the version string.

Confirming a Successful wp2shell Patch

After applying the WordPress 6.9.5 or 7.0.2 update, confirming the patch is active requires checking the running version rather than the installed package. The WordPress admin dashboard displays the current version on the Dashboard overview page. Via WP-CLI, wp core version returns the running version string. For sites where the update was applied through managed hosting, the hosting control panel typically shows the current WordPress core version. Any site still showing a version in the 6.9.0-6.9.4 or 7.0.0-7.0.1 range after the update window has closed is still exposed and needs immediate attention. Web application firewall rules from Cloudflare and similar providers offer temporary coverage while patching is completed, but they are not a substitute for the core update itself.

How Defendis Helps Organisations Respond to Credential and Identity Exposure

The attacks described in this article share a common thread: every one of them either harvests credentials, abuses legitimate identity infrastructure, or exploits the gap between patching timelines and attacker speed. GhostLock and wp2shell give an attacker on an internal machine or a compromised web server a direct route to deeper access. Helix bypasses MFA entirely by abusing Microsoft's own OAuth flows. NetNut makes attribution nearly impossible by routing attack traffic through ordinary home connections.

Defendis monitors the dark web, criminal forums, and breach indices for credentials and data linked to your organisation. When an attacker uses leaked credentials to pivot into your environment, or when data extracted from a compromised system surfaces for sale, Defendis surfaces the exposure with full context so your security team can act before damage compounds.

Book a demo to see how Defendis approaches dark web monitoring for enterprise security teams.

About the author
Sami Malik is a copywriter passionate about crafting clear, engaging, and impactful content that helps brands connect with their audience through storytelling and strategy.

Related Articles

Discover simplified
Cyber Risk Management
Learn how to prevent cyberattacks proactively with a free trial of Defendis.