
Non-intrusive exposure checker for the WordPress wp2shell pre-auth RCE chain (CVE-2026-63030 / CVE-2026-60137).
Non-intrusive exposure checker for the WordPress "wp2shell" pre-authentication RCE chain (CVE-2026-63030 + CVE-2026-60137).
⚠️ Authorized use only. Run this only against WordPress instances you own or have explicit permission to test. It is a triage aid, not an exploit. Scanning systems without permission may be illegal.
Given a URL, wp2shell-check:
generator meta tag on the homepage (passive).?rest_route=/batch/v1) to check whether
the REST batch route is reachable.It is designed for fast fleet triage: which of my sites are on an affected version with REST reachable?
Two chained WordPress Core flaws, disclosed with an emergency release on 2026-07-17:
| CVE | Type | Affected versions |
|---|---|---|
| CVE-2026-63030 | REST API batch-route confusion (RCE enabler) | 6.9.0–6.9.4, 7.0.0–7.0.1 |
| CVE-2026-60137 | WP_Query author__not_in SQL injection | 6.8.0 and later (6.8.0–6.8.5 = SQLi-only band) |
Chained, they let an unauthenticated attacker reach SQL injection and escalate to remote code execution on a default install — no plugins, no login. The RCE half only applies when a persistent object cache is not in use.
Fixed in: 6.8.6 (SQLi only), 6.9.5, 7.0.2 (and 7.1 Beta 2+). WordPress enabled forced auto-updates for affected sites — verify the update actually landed.
Reported by Adam Kues (Assetnote / Searchlight Cyber) via WordPress's HackerOne program.
Requires Python 3.9+ and requests.
# with uv
uv pip install requests
# or plain pip
pip install requests
python wp2shell.py https://target.example
Example output:
https://target.example: VULNERABLE (RCE) [6.9.3]
generator tag is often removed or spoofed; a missing version
yields wordpress not detected, not a guarantee that the site is safe or non-WordPress./wp-json/batch/v1 and ?rest_route=/batch/v1 at your WAF,
or restrict anonymous access to the REST API.Provided as-is, for authorized security testing and educational purposes only. You are solely responsible for how you use it.
| Verdict | Meaning |
|---|
VULNERABLE (RCE) / VULNERABLE (SQLi) | Affected version and REST batch route reachable → exposed on a default install. See Limitations. |
version-affected (...), route unconfirmed | Version is in an affected band, but the REST batch route did not respond as expected. |
not affected | WordPress detected, version outside the affected bands. |
wordpress not detected | No version found (REST locked down, generator tag removed, or not WordPress). |
unreachable | Host did not respond. |