XHack Logo
XHack
Products
Services
Compliance
Pricing
Resources
Company
Sign upLogin
XHack Logo
XHackOffensive Security

Certified offensive security team delivering penetration testing evidence written for your auditor.

OSCP+OSCPC-AI/MLPenCASA
support@xhack.io

24/7 SOC Operations

XHack Status
Under attack? Get help now
Services
  • VAPT Services
  • Red Teaming
  • SOC Services
  • Threat Intelligence
  • Incident Response
  • Managed Testing
Pricing
  • Platform Plans
  • Services Pricing
Compliance
  • SOC 2
  • PCI DSS
  • ISO 27001
  • GDPR
  • HIPAA
  • ISO 42001
  • AI Maturity Assessment
  • TX-RAMP
  • NBFC / SECP
  • All Frameworks
Products
  • Vulnerability Assessment
  • GitGuard
  • AI Probe
  • SOC Dashboard
  • AI Agent
  • Cloud Investigation
Comparison
  • XBOW vs XHack
  • Horizon3 vs XHack
  • Strix vs XHack
  • Pentera vs XHack
Resources
  • Platform Tour
  • All Features
  • Install the Agent
  • XHack AI
  • Documentation
  • Blog
  • Case Studies
  • Documents
  • FAQ
Company
  • About Us
  • Our Team
  • Certifications
  • Security and Trust
  • VAPT Explained
  • Contact

© 2026 XHack. All rights reserved.

Security & TrustVulnerability DisclosurePrivacy PolicyTerms of ServiceRefund Policy
Blog/News

CVE-2026-63030: The wp2shell Bug That Hands Strangers a WordPress Admin Account

XHack

XHack

Author

September 24, 2026

17 min read

CVE-2026-63030: The wp2shell Bug That Hands Strangers a WordPress Admin Account

Table of contents

19

What the WordPress Batch Endpoint Does

What CVE-2026-63030 Actually Is

CVE-2026-60137: The SQL Injection That Needed Help

How CVE-2026-63030 Goes From One Bad Request to a New Administrator

Who Found CVE-2026-63030: An AI, According to the Researcher

The CVE-2026-63030 Timeline: Patched July 17, Exploited by July 21

Two Months Later: What CVE-2026-63030 Attacks Looked Like

Are You Exposed to CVE-2026-63030?

Hunting for CVE-2026-63030 Compromise

Fixing CVE-2026-63030

How XHack Reads CVE-2026-63030

FAQ: CVE-2026-63030 Questions Answered

What is CVE-2026-63030?

What is wp2shell?

Which WordPress versions does CVE-2026-63030 affect?

Is CVE-2026-63030 being actively exploited?

Did the automatic update fix CVE-2026-63030 on my site?

How do I know if CVE-2026-63030 was used against my site?

The Bottom Line

By Salman Khan, OSCP+, Founder of XHack, SRT (Synack Red Team member)

Read this in 30 seconds: CVE-2026-63030 is a WordPress core bug that, chained with a second one, lets anyone on the internet take over a default site with no login. It was patched in July. It is still worth your time in September.

  • Two bugs, one chain. CVE-2026-63030 (a REST batch flaw) and CVE-2026-60137 (an SQL injection) together give unauthenticated code execution on WordPress 6.9.0 through 7.0.1. Neither needs a plugin.
  • The fix is out, and forced. WordPress shipped 7.0.2, 6.9.5 and 6.8.6 on July 17 and turned on forced auto-updates. CISA listed both bugs as exploited on July 21.
  • A researcher says an AI found it for about $25. Adam Kues of Searchlight Cyber says he pointed GPT-5.6 Sol Ultra at the WordPress source and had a working chain in roughly ten hours.
  • Patching does not remove an intruder. GreyNoise reported on September 21 that one actor used CVE-2026-63030 and its partner bug against at least 49 organizations in 29 countries. One government target lost 18,566 records.
  • Your to-do for CVE-2026-63030 is two checks. Confirm the version, then look for administrator accounts and plugins you did not create.

Most WordPress bugs live in a plugin you can remove. This one lives in the core, and it works by making WordPress check one request and run another.

CVE-2026-63030 sits in the REST API’s batch endpoint, the part of WordPress that lets a client send several API calls in a single request. CVE-2026-63030 makes the checking step and the running step disagree about which call is which. That disagreement is what opens the door for CVE-2026-60137, and together the two are known as wp2shell.

Here is how it works, what the attacks looked like, and how to check your own site today.

CVE-2026-63030 severity summary: wp2shell chain of two WordPress core bugs, unauthenticated remote code execution, on CISA KEV since July 21, 2026
CVE-2026-63030 at a glance: a WordPress core bug chain that ends in a new admin account

What the WordPress Batch Endpoint Does

WordPress exposes a REST API at /wp-json/. One of its routes, /wp-json/batch/v1, accepts a list of sub-requests in a single POST. It is meant to save round trips: instead of ten separate calls, a client sends one.

The server handles that list in two passes. First it looks at every sub-request, works out which handler each one belongs to, and validates its parameters. Then it runs them.

That design is fine as long as both passes agree on which request is which. CVE-2026-63030 is what happens when they do not.

What CVE-2026-63030 Actually Is

Here is the description NVD records for CVE-2026-63030:

“WordPress 6.9.x before 6.9.5 and 7.0.x before 7.0.2 is affected by a REST API batch endpoint route confusion issue which, combined with the author__not_in WP_Query SQL Injection (CVE-2026-60137), could allow an attacker to perform SQL Injection and achieve Remote Code Execution.”

In plain words, the bug is a bookkeeping error. The file is class-wp-rest-server.php, in a method called serve_batch_request_v1(). Simplified, the validation loop did this:

foreach ( $requests as $single_request ) {
    if ( is_wp_error( $single_request ) ) {
        $validation[] = $single_request;   // recorded here...
        continue;                          // ...but never added to $matches
    }
    $matches[]    = $this->match_request_to_handler( $single_request );
    $validation[] = /* result of validating it */;
}

If a sub-request is broken, WordPress notes the error in one list and forgets to add a matching entry to the other. From that point on, the two lists are off by one. Request number 2 gets checked against its own rules, but it is run using the handler that was matched for request number 3.

Searchlight Cyber’s write-up shows that a path which fails URL parsing, http://:, is enough to cause the break. You may see other write-ups describe a triple-slash prefix instead. We could not find that string in the primary sources, but the mechanism is the same: a path WordPress cannot parse.

The official fix for CVE-2026-63030 is small. It makes the broken-request branch add to both lists, and it stops WordPress starting a new top-level REST dispatch while one is already running.

How CVE-2026-63030 works: a broken sub-request leaves the validation list and the handler list one slot out of step, so a request is checked as one thing and run as another
CVE-2026-63030 root cause: two internal lists that fall one slot out of line

CVE-2026-60137: The SQL Injection That Needed Help

The second bug is in WP_Query, the code that builds most of WordPress’s database queries. It handles a setting called author__not_in, and it cleans the value with absint() only when the value is an array. Send a plain string and the cleaning step is skipped, so the string lands in the SQL query as written.

On its own that is hard to reach. The REST API declares the matching parameter as a list of integers and rejects anything else. That is why NVD describes CVE-2026-60137 as exploitable “when a plugin or theme passes untrusted input to the parameter.”

CVE-2026-63030 removes that limit. Because a request can be checked against one endpoint and run against another, an attacker can slip a string past a check that would have blocked it. That is the whole point of the chain, and it is why the pair is dangerous on a stock install.

The scores show how differently people read these two bugs:

CVEWPScan (CNA)CISA (ADP)
CVE-2026-630309.8 Critical7.5 High
CVE-2026-601375.9 Medium9.1 Critical

Both come straight from NVD’s record. Each scorer imagined a different situation, one counting the full chain and one counting the bug alone. In the real world the chain is what attackers use, so treat both as critical.

How CVE-2026-63030 Goes From One Bad Request to a New Administrator

The full chain is long, and it is the interesting part. This is the outline from the discoverer’s own account, with the exploit details left out:

  1. Fake posts in memory. The SQL injection lets an attacker return database rows that do not exist, so WordPress caches attacker-shaped posts for that request.
  2. Embed cache rows. WordPress creates real database rows for local embeds without checking that the target post exists. The attacker uses that to plant rows of the right type.
  3. Cache reconciliation. When the cached copy and the database copy disagree, WordPress updates the database. That turns a fake row into a real one.
  4. A trusted settings record. The attacker forges a saved customizer changeset, the record WordPress uses to apply a batch of theme settings.
  5. Borrowed admin rights. WordPress applies a changeset as the user who saved it. The forged one names user 1, the original admin, so WordPress briefly acts as that admin.
  6. A replay. A trick with a status and post type makes WordPress fire its start-of-request hook again. The original batch runs a second time, now with admin rights.
  7. A new admin account. The batch contains a request to create an administrator. It failed the first time. On the replay it works.
  8. Code execution. Logged in as that admin, the attacker uploads a plugin containing a web shell. That is remote code execution.

Bitdefender’s MDR team says a full run takes about two minutes. Its advisory also notes that when a run fails partway, it can leave behind a rogue admin account without a web shell. That is why an admin you did not create is a sign of compromise by itself.

Who Found CVE-2026-63030: An AI, According to the Researcher

The most unusual part of this story is how the bug was found. Adam Kues of Searchlight Cyber says he gave OpenAI’s GPT-5.6 Sol Ultra a clean copy of the WordPress source and told it not to use changelogs, git history or the internet to diff against a patched version.

His account, in his own numbers:

  • The model first reported a pre-auth SQL injection.
  • About four hours later it reported that the injection could be pushed to remote code execution.
  • Total time was just over ten hours, with up to four agents running at once.
  • Total cost was about $25, which he says was 50% of a $200 weekly allowance.

Those figures are his, from his own post, and we have not reproduced them. The post’s title also says exploit brokers pay $500,000 for a WordPress RCE. It gives no source for that number, so treat it as a hook and not a fact.

What is safe to say is that one researcher and one subscription found a chain in mature, heavily reviewed code that had shipped to a very large share of the web. Bug hunters should expect the same tools to be pointed at every popular open-source project. We cover that shift in our guide to AI exploit development.

The CVE-2026-63030 Timeline: Patched July 17, Exploited by July 21

DateWhat happened
Jul 17, 2026WordPress 7.0.2, 6.9.5 and 6.8.6 released, with GitHub advisories and NVD records
Jul 17, 2026The first public exploit repository is created on GitHub, the same day
Jul 21, 2026CISA adds both CVEs to KEV. Due dates: July 24 (CVE-2026-63030) and August 4 (CVE-2026-60137)
Jul 22, 2026First exploit against the government target in GreyNoise’s report
Sep 21, 2026GreyNoise publishes its report on that campaign

WordPress pushed the fix instead of waiting for site owners to act. The release post says: “Due to the severity, the WordPress.org team have enabled forced updates via the auto-update system for sites running affected versions.”

The scale explains why. Censys counted about 62.8 million WordPress instances on July 20. Only around a quarter showed a version, and about 7.74 million of those sat in the range affected by the full chain. Wiz found that 60% of organizations using WordPress had a vulnerable instance at disclosure. A day later that was 50%, so patching was fast, but not complete.

CISA’s own triage on the NVD record marks CVE-2026-63030 as exploited, automatable and total technical impact.

Two Months Later: What CVE-2026-63030 Attacks Looked Like

The most useful thing published since July is GreyNoise’s report, released September 21. It follows one actor. GreyNoise says it is a suspected Chinese speaker and that the activity is the same as or related to a group Acronis calls “Red Heron.”

The headline numbers: at least 49 organizations in 29 countries, mostly small businesses and government bodies, hit through CVE-2026-63030 and CVE-2026-60137. The same actor also attacked 996 Zyxel GS1900 switches through CVE-2026-7273, a bug CISA added to its exploited list on September 21.

One government target shows the whole path. All times are from GreyNoise’s log, counted from the first exploit at 01:27 UTC on July 22:

  • +11 minutes: the attacker dumped the WordPress user table, which held 13 admin accounts.
  • +21 to +38 minutes: it created a rogue administrator. The account used an email address at the victim’s own domain and a registration date set back to 2025, so it blended in.
  • +42 minutes: it uploaded a plugin that collects system information.
  • +64 to +100 minutes: it tried 17 or more ways to bypass Windows security scanning, plus privilege escalation.
  • +110 minutes: it searched files for credentials and found database details.
  • +125 minutes: it downloaded a ZIP archive it had staged in a web-accessible folder.
  • +157 to +162 minutes: it password-sprayed an internal SQL server, got in and pulled out 18,566 records. They held accounts, plaintext passwords and personal data tied to law enforcement and government agencies.

The activity ended about four hours and ten minutes after it began. GreyNoise says the victims were running unpatched systems.

A CVE-2026-63030 intrusion timeline from GreyNoise: web shell and hidden admin within 42 minutes, host reconnaissance, then an internal SQL server and 18,566 records within about three hours
One real CVE-2026-63030 intrusion, minute by minute, from GreyNoise’s report

Look at what that means. The web server was not the goal. It was the foothold. The real damage came from a database password sitting in a file and an internal server that accepted a password spray.

Are You Exposed to CVE-2026-63030?

Start with the version. These are the versions CVE-2026-63030 affects, and where it is fixed:

BranchAffectedFixed in
7.07.0.0 to 7.0.17.0.2
6.96.9.0 to 6.9.46.9.5
6.86.8.0 to 6.8.5 (SQL injection only)6.8.6
7.1 betaBefore beta 27.1 beta 2

WordPress says versions before 6.8 are not affected. The full unauthenticated chain exists from 6.9 on, because the batch flaw was introduced in 6.9. Version 6.8 has only the SQL injection, which needs a plugin or theme to reach it.

Check yours from the command line:

wp core version

Or open Dashboard, then Updates. Then ask two more questions:

  1. Did the forced update actually reach you? Sites that pin or disable core updates, which some Composer and git-based deployments do, may not have received it. Do not assume.
  2. Was the site exposed between July 17 and the day it was patched? If yes, patching closes the door but does not tell you who already came in.

Hunting for CVE-2026-63030 Compromise

Start with the accounts, because the attacker in GreyNoise’s report went there first:

wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

Look for any admin you do not recognize, and read the registration dates closely. GreyNoise’s attacker backdated its account to 2025, so an old date is not proof of a legitimate user. Also look at emails that use your own domain but belong to no one you know.

Then check the code on disk:

wp core verify-checksums
wp plugin verify-checksums --all
wp plugin list

The first two compare files against WordPress.org’s known-good copies. The third helps you spot a plugin nobody installed. Bitdefender reported dropper folders named with a fun-proof- prefix under wp-content/plugins/.

Next, the logs:

  • The batch route. Search access logs for /wp-json/batch/v1 and also ?rest_route=/batch/v1. Both reach the same handler.
  • The response. Wiz reports HTTP 207 responses from the batch endpoint as a strong signal.
  • The user agent. Wiz also reports scanners using the strings wp2shell and rezwp2shell.
  • A caution. Eye Security points out that the decisive part of the attack sits in the request body, which normal access logs do not record. A clean log is not a clean bill of health.

Finally, look for the odd things: unexpected PHP files under wp-content/, ZIP archives in web-accessible folders, and changes to active_plugins, siteurl or home in the wp_options table. Eye Security also lists leftover oembed_cache and customize_changeset rows as database clues.

Fixing CVE-2026-63030

  1. Update WordPress. Go to 7.0.2, 6.9.5 or 6.8.6, or anything newer. This is the only complete fix for CVE-2026-63030.
  2. If you cannot update today, block the batch route. Deny unauthenticated requests to /wp-json/batch/v1 and to ?rest_route=/batch/v1 at your WAF or reverse proxy. Searchlight Cyber and Censys both recommend this as a stopgap. It is a stopgap only, so update anyway.
  3. If you find a rogue admin, treat the site as breached. Remove the account, then rotate every admin password, the WordPress salts and the database password. Restore from a backup taken before July 17 if you can.
  4. Check where the database password lives. In GreyNoise’s case, credentials found in files gave access to an internal SQL server. If yours are reused anywhere else, change them there too.
  5. Separate the web server from the internal network. This is our advice, not a vendor rule. A WordPress host should not be able to reach an internal SQL server it has no business with.
  6. Turn on request-body logging or a WAF that inspects it. Standard access logs would not have shown the attack.

If you run Windows-hosted WordPress, note the Windows-specific steps in GreyNoise’s timeline. The attacker tried to bypass Windows security scanning, which means endpoint protection on the web server matters as much as the WordPress version.

How XHack Reads CVE-2026-63030

The lesson we take from CVE-2026-63030 is about the second half of the story, not the first. Patching stops new attackers. It does nothing about the one who got in during the weeks between disclosure and your update.

So the useful testing is a compromise assessment as much as a vulnerability check. We would confirm the version and whether the batch route answers from outside, then audit administrators, plugins and file integrity, and then look at what the WordPress host can reach on your internal network. That last check is where GreyNoise’s victim lost 18,566 records.

We would not run a public exploit against a production site. Those exploits are built to create admin accounts and upload plugins, which is exactly what you are trying to find. The discoverer points to wp2shell.com for a vulnerability check. We have not vetted it, so read any tool before pointing it at production.

That is the kind of testing our human testers and AI agents do on web applications and the servers behind them, and your data stays on your own machine while we do it. A checklist for the wider process is in our penetration testing checklist.

FAQ: CVE-2026-63030 Questions Answered

What is CVE-2026-63030?

CVE-2026-63030 is a bug in the WordPress core REST API batch endpoint. A failed sub-request is recorded in one internal list but not another, so requests are validated against one handler and run against a different one. Chained with the SQL injection CVE-2026-60137, it gives an unauthenticated attacker remote code execution on default sites.

What is wp2shell?

wp2shell is the name for the exploit chain that combines CVE-2026-63030 and CVE-2026-60137. Neither bug alone gives unauthenticated code execution on a default install, but together they do, on WordPress 6.9.0 through 7.0.1.

Which WordPress versions does CVE-2026-63030 affect?

WordPress 6.9.0 to 6.9.4 and 7.0.0 to 7.0.1 are affected, and the fixes are 6.9.5 and 7.0.2. Version 6.8.x is exposed only to the SQL injection, and is fixed in 6.8.6. WordPress says versions before 6.8 are not affected.

Is CVE-2026-63030 being actively exploited?

Yes. CISA added CVE-2026-63030 and CVE-2026-60137 to its Known Exploited Vulnerabilities catalog on July 21, 2026. GreyNoise reported on September 21 that one actor used the chain against at least 49 organizations in 29 countries.

Did the automatic update fix CVE-2026-63030 on my site?

It should have, for most sites. WordPress.org enabled forced updates through the auto-update system for affected versions. Sites that disable or pin core updates may have missed it, so check the version yourself, and check for signs of compromise from the days before the update.

How do I know if CVE-2026-63030 was used against my site?

Look for administrator accounts you did not create, unfamiliar plugins, unexpected PHP files and requests to the batch route. Run wp user list --role=administrator and wp core verify-checksums. Remember that the attack body does not appear in normal access logs, so a quiet log does not prove a clean site.

The Bottom Line

CVE-2026-63030 is a small bookkeeping error with a large blast radius: two lists that fall out of step, and a whole authentication system that trusts the wrong one. It was fixed in July, and WordPress pushed the fix to sites without waiting to be asked.

The part that is still open is the gap before the patch. Check your version, check your administrators, and check what your web server can reach. If you find nothing, you have lost ten minutes. If you find a rogue admin, you found it before the attacker finished.


Categories

News

Previous

ISO 27001 Penetration Testing: What the Standard Says vs What Auditors Expect

Next

CVE-2026-94127: Is Your F5 BIG-IP Exposed? The Five-Minute Check

On this page

What the WordPress Batch Endpoint Does

What CVE-2026-63030 Actually Is

CVE-2026-60137: The SQL Injection That Needed Help

How CVE-2026-63030 Goes From One Bad Request to a New Administrator

Who Found CVE-2026-63030: An AI, According to the Researcher

The CVE-2026-63030 Timeline: Patched July 17, Exploited by July 21

Two Months Later: What CVE-2026-63030 Attacks Looked Like

Are You Exposed to CVE-2026-63030?

Hunting for CVE-2026-63030 Compromise

Fixing CVE-2026-63030

How XHack Reads CVE-2026-63030

FAQ: CVE-2026-63030 Questions Answered

What is CVE-2026-63030?

What is wp2shell?

Which WordPress versions does CVE-2026-63030 affect?

Is CVE-2026-63030 being actively exploited?

Did the automatic update fix CVE-2026-63030 on my site?

How do I know if CVE-2026-63030 was used against my site?

The Bottom Line

Related articles

Continue reading

CVE-2026-100706: How a Kyverno Tenant Becomes Cluster Admin

News

CVE-2026-100706: How a Kyverno Tenant Becomes Cluster Admin

CVE-2026-100706 lets a Kyverno tenant reach cluster admin via an encoded path. See who is exposed, the fixed version 1.1...

Read article
CVE-2026-87902: The WordPress Bug That Needs Three Things to Work

News

CVE-2026-87902: The WordPress Bug That Needs Three Things to Work

CVE-2026-87902 is an exploited WordPress core bug in 4.7.0 to 7.1.1. See the three conditions for code execution, how to...

Read article
CVE-2026-5430: The WSO2 Token Check That Lets Unverifiable Tokens Through

News

CVE-2026-5430: The WSO2 Token Check That Lets Unverifiable Tokens Through

CVE-2026-5430 is an exploited WSO2 API Manager JWT bypass scored 10.0. See affected versions, the fixed update levels, w...

Read article