WordPress: critical bugs at the intersection of components
Attack Techniques & Methods2026-07-29, 09:03
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 emptymeta_valuedisables value filtering, andWP_User_Querychecks only the conditionmeta_key = '_temporary_login_token'. To bypass the checkempty($_GET['temp-login-token']), it is sufficient to pass the parameter as an array. It is considered non-empty byempty(), but aftersanitize_key()it becomes an empty string. As a result, the query returns any user with a_temporary_login_tokenset. 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.
Article 1: https://fullhunt.io/blog/2026/07/17/wp2shell-wordpress-core-pre-auth-rce-cve-2026-63030.html
Article 2: https://www.hacktron.ai/blog/wp2shell
Vulnerabilities
Researchers
Vendors
Products
More