All news
vulnerability disclosure

Precursor Intelligence

Fidelis Security Discloses wp2shell Attack Chain for Unauthenticated WordPress RCE

CVE-2026-63030 and CVE-2026-60137 chain REST API route confusion with WP_Query SQL injection to achieve pre-auth RCE on WordPress 6.8–7.0.

22 September 2026
Fidelis Security Discloses wp2shell Attack Chain for Unauthenticated WordPress RCE

At a glance

2 CVEs1 target

Vulnerabilities

CVECVSSEPSSKEVPoCPRS risk
CVE-2026-601375.95.3%Exploited—74 · High
CVE-2026-630309.810.7%Exploited—90 · Critical

Targets & victims

OrganisationSectorRegionStatus
WordPressCMS—confirmed

Technology affected

WordPress · WordPressWordPress · WordPress Core

Malware & tooling

PHP web shell

Timeline

  1. Disclosure

    WordPress issued security update

  2. Patch release

    WordPress releases emergency security updates (6.8.6, 6.9.5, and 7.0.2) addressing the vulnerabilities that form the WP2Shell exploit chain.

  3. Public exploit release

    Public exploits released for the wp2shell RCE vulnerabilities.

  4. Kev addition

    ISA adds CVE-2026-63030 to the Known Exploited Vulnerabilities (KEV) Catalog, requiring U.S. federal agencies to remediate affected systems on an accelerated timeline.

Vulnerability details

CVE CVSS EPSS KEV PoC PRS risk
CVE-2026-63030 7.5 97.3% ✅ listed — 75.25 (High)
CVE-2026-60137 9.1 78.3% ✅ listed — 89.3 (Critical)

wp2shell: Unauthenticated RCE via WordPress REST API

Fidelis Security has disclosed wp2shell, a two-vulnerability attack chain that lets unauthenticated attackers achieve remote code execution against WordPress Core via the REST API batch endpoint. The chain combines CVE-2026-63030 (REST API batch route confusion, CVSS 7.5, EPSS 97.3%, CISA KEV) with CVE-2026-60137 (WP_Query author__not_in SQL injection, CVSS 9.1, EPSS 78.3%, CISA KEV).

The first flaw, CVE-2026-63030, is a route confusion in the REST API batch endpoint that lets an attacker bypass authentication and reach internal handlers without the required permission checks. The second, CVE-2026-60137, is a SQL injection in the author__not_in parameter of WP_Query that fires when a plugin or theme passes untrusted input to the parameter. Chained together, the two give a full pre-auth RCE: the attacker sends a crafted batch request, triggers the SQL injection, and drops a PHP web shell.

How the two flaws chain into RCE

The chain executes in five steps. First, the attacker sends a crafted batch request to the REST API batch endpoint. This is where CVE-2026-63030 lives: the route confusion lets the request bypass authentication and reach internal handlers that normally require permission checks. The attacker does not need a valid session or nonce at this stage.

Second, the request lands in the internal WP_Query handler. Because the batch endpoint routed it past the standard permission gate, the handler runs without the usual capability or role check that would normally reject an unauthenticated caller.

Third, the handler reaches the vulnerable author__not_in parameter. This is CVE-2026-60137. The parameter is passed to WP_Query without proper sanitization, so the attacker-controlled value flows directly into the SQL query.

Fourth, the attacker supplies a crafted input to author__not_in that alters the database query. The SQL injection fires, giving the attacker control over the query execution. This is the step that turns the two separate flaws into a working RCE.

Fifth, the attacker chains both vulnerabilities into a single unauthenticated RCE. The batch request triggers the SQL injection, which drops a PHP web shell. No plugin, theme, or user interaction is required — the entire chain runs through the REST API batch endpoint against WordPress Core.

Who is affected

WordPress 6.8.x through 6.8.5, 6.9.x through 6.9.4, and 7.0.x through 7.0.1 are affected by CVE-2026-60137. The flaw sits in the author__not_in parameter of WP_Query, which fails to sanitize untrusted input before it reaches the SQL query. A plugin or theme that passes attacker-controlled data to the parameter triggers the injection.

CVE-2026-63030 covers the same version range: 6.9.x before 6.9.5 and 7.0.x before 7.0.2. It is a route confusion in the REST API batch endpoint that lets the request bypass authentication and reach the internal handler without the standard permission check. The two CVEs chain so the batch request lands in the WP_Query handler that needs the author__not_in injection.

No plugin, theme, or user interaction is required. The entire chain runs through the REST API batch endpoint against WordPress Core, so any site with a plugin or theme that forwards untrusted input to author__not_in is exposed.

Exploitation in the wild

FortiGuard IPS blocked 4,649 exploitation attempts in the 24 hours leading up to publication, with 88,452 detections over the preceding seven days. The highest volume originated from or targeted Poland and Turkey, according to FortiGuard Labs telemetry.

watchTowr honeypots recorded tens of thousands of exploit attempts against the same chain. Jake Knott, principal security researcher at watchTowr, noted the team reproduced CVE-2026-63030 within minutes of disclosure and CVE-2026-60137 with additional effort, citing the ready availability of public proof-of-concept exploits for both CVEs as the driver behind the rapid mass exploitation.

Mitigation and WAF coverage

Administrators should patch to WordPress 6.8.6, 6.9.5, or 7.0.2 to close both CVEs. The three version lines cover the full affected range for CVE-2026-60137 and the REST API batch endpoint for CVE-2026-63030.

Cloudflare has deployed WAF rules for both vulnerabilities across all plans, including free accounts. The rules block the SQL injection in author__not_in (CVE-2026-60137) and the REST API batch-route confusion (CVE-2026-63030) for sites proxied behind the platform.

"WAF protections reduce exposure while customers update, but they are not a substitute for patching," Cloudflare said.

Key points

  • CVE-2026-63030 is a REST API batch endpoint route confusion (CVSS 7.5) that lets attackers bypass permission checks to reach internal handlers.
  • CVE-2026-60137 is a SQL injection in WP_Query's author__not_in parameter (CVSS 9.1) affecting WordPress 6.8.x through 7.0.x.
  • The chain enables unauthenticated RCE: attacker sends a crafted batch request, triggers SQL injection, and executes code without login, plugins, or user interaction.
  • Affected versions: 6.8.x before 6.8.6, 6.9.x before 6.9.5, and 7.0.x before 7.0.2. Both CVEs are in CISA KEV.
  • FortiGuard Labs reports 4,649 blocked attempts in 24 hours and 88,452 detections over seven days, with top traffic from Turkey.

Further reading & sources