
CVE Reproduction: cve-2026-63030_60137-wordpress_rce_reproduction
Descobridor: Searchlight Cyber (via GPT-5.6 Sol)
Severidade: Crítica — CVSS 9.8 (CVE-2026-63030), CVSS 9.1 (CVE-2026-60137)
Status: Explorado ativamente — adicionado ao CISA KEV
Alias: "wp2shell"
Esta é uma cadeia de execução remota de código não autenticada no Núcleo do WordPress composta por duas CVEs:
| CVE | Componente | Tipo | CWE |
|---|---|---|---|
| CVE-2026-63030 | WP REST API batch endpoint | Confusão de rotas / bypass de controle de acesso | CWE-436 |
| CVE-2026-60137 | Parâmetro author__not_in do WP_Query | Injeção SQL | CWE-89 |
Individualmente, cada falha é grave; combinadas, permitem que um invasor não autenticado execute PHP arbitrário no alvo e implante webshells.
A API REST do WordPress expõe um endpoint batch em /wp-json/wp/v2/batch. Devido a uma falha na resolução de rotas (introduzida no middleware de roteamento reescrito do WP 6.9), o processador batch não valida corretamente que sub-requests internas em um lote herdam as verificações de autenticação e permissão da requisição externa. Um invasor pode criar um payload batch que:
wp/v2/users, wp/v2/plugins) sem as verificações de capacidade necessárias.WP_REST_Server::dispatch() para passar parâmetros de rota forjados para manipuladores internos.Isso contorna todas as proteções de autenticação para operações de leitura e algumas operações de escrita quando combinado com contrabando de parâmetros.
author__not_inA classe WP_Query aceita um parâmetro author__not_in destinado a excluir posts por IDs de autor específicos. Um bug de coerção de tipo no método WP_Query::get_posts() (introduzido na reforma da sanitização de consultas do WP 6.9) faz com que valores de author__not_in sejam interpolados diretamente na cláusula SQL WHERE sem a devida parametrização quando fornecidos como um array associativo especialmente criado.
A injeção ocorre no SQL gerado da cláusula post_author IN (...). Ao aninhar arrays com fragmentos SQL brutos, um invasor pode escapar da cláusula IN e executar instruções UNION / INTO OUTFILE arbitrárias — desde que o usuário do banco de dados tenha privilégio FILE.
Attacker (unauthenticated)
│
├─ POST /wp-json/wp/v2/batch
│ └─ CVE-2026-63030: Bypass auth, invoke internal query API
│ └─ CVE-2026-60137: Inject SQL via author__not_in
│ └─ UNION SELECT ... INTO OUTFILE 'webshell.php'
│ └─ Webshell deployed to web root
│ └─ RCE achieved
O endpoint batch fornece o vetor; o SQLi fornece a entrega do payload.
| Faixa de versões | Cadeia completa |
|---|---|
| WordPress 6.9.0 – 6.9.4 | ✅ Ambas as CVEs presentes |
| WordPress 7.0.0 – 7.0.1 | ✅ Ambas as CVEs presentes |
| WordPress ≤ 6.8.x | Apenas CVE-2026-63030 (SQLi não explorável) |
Correções foram enviadas no WordPress 6.9.5 e 7.0.2 (ambos emitidos em 2026-07-16).
/wp-json/wp/v2/batch retorna 200 (não 403/404).--target (veja abaixo)./wp-content/webshell.php?cmd=id.python exploit.py --target https://target.example.com --action deploy-webshell
python exploit.py --target https://target.example.com --action exec --command "id"
python exploit.py --target https://target.example.com --action exec --command "uname -a"
POST /wp-json/wp/v2/batch no WAF / proxy reverso.FILE do usuário MySQL do WordPress.define('DISALLOW_FILE_EDIT', true); e define('DISALLOW_FILE_MODS', true);..php inesperados em wp-content/.author__not_in com valores não inteiros nos logs de requisições.