WordPress: critical bugs at the intersection of components

Three new studies have been published analyzing recent WordPress vulnerabilities. Although two of the vulnerabilities were found in the core and the third in the Temporary Login plugin, they share a common root cause: all of them arise from interactions between different WordPress components.
• WP2shell core vulnerabilities
CVE-2026-63030 — a vulnerability that arises when multiple REST Batch API calls are combined through /wp-json/batch/v1 (also available via ?rest_route=/batch/v1) into a single HTTP request. The request may be validated against the rules of one endpoint but executed by another endpoint's handler, bypassing parameter typing and sanitization.
CVE-2026-60137 — an SQL injection vulnerability in WP_Query: the string value of author__not_in was not sanitized but was still included in the SQL query.
In the WP2shell chain, the first vulnerability delivers an unchecked string to WP_Query, while the second turns it into a pre-auth SQL injection and, under a suitable configuration, potential RCE:
REST Batch API → route and validation-result desynchronization → bypass of REST schema validation and sanitization → string reaches author__not_in → WP_Query inserts it into SQL → SQL injection → RCE (under a suitable configuration) Researchers from Fullhunt presented a scanner for checking whether systems are vulnerable to WP2shell.
An interesting finding from Hacktron's research is that AI review and SAST often detected the array desynchronization but treated it as an ordinary error resulting in an HTTP 500 response. Its security impact became apparent only when analyzing the interaction between REST routing and WP_Query.
• Temporary Login plugin vulnerability
CVE-2026-7567 lies in the way the plugin looks up a user:
get_users([ 'meta_key' => '_temporary_login_token', 'meta_value' => $token, ]); The developers expected an exact token match. However, in WordPress, an empty meta_value disables value filtering, and WP_User_Query checks only the condition meta_key = '_temporary_login_token'. To bypass the check empty($_GET['temp-login-token']), it is sufficient to pass the parameter as an array. It is considered non-empty by empty(), but after sanitize_key() it becomes an empty string. As a result, the query returns any user with a _temporary_login_token set. The plugin treats the first user found as the owner of a valid token and passes that user to the WordPress Authentication API, which creates a fully authenticated session.
All of these studies once again highlight the importance of testing not only individual components but also their interactions.
Vulnerabilities
9.4
CVE-2026-60137
9.8
CVE-2026-63030
9.8
CVE-2026-7567
Researchers
Dtro
Haongo
Tf1T
Vendors
Wordpress
Fullhunt
Products
Rest Batch Api
Temporary Login Plugin
Wordpress
Wordpress Authentication Api
Wp2Shell-Scan
Wp_Query
More