
Prova de conceito do CVE-2025-30921
Plugin WordPress
Nome do componente Newsletters
Versão vulnerável <= 4.9.9.7
Slug do componente newsletters-lite
Link do componente https://wordpress.org/plugins/newsletters-lite/
Classe de vulnerabilidade A3: Injeção
Tipo de vulnerabilidade Injeção de SQL
Administrador
Ao visualizar o gráfico de visão geral das estatísticas no painel do plugin (/wp-admin/admin.php?page=newsletters) do plugin Newsletters versão 4.9.9.7 ou inferior, ocorre uma vulnerabilidade de Injeção de SQL devido à validação de entrada e processamento de escape insuficientes dos parâmetros de URL.
Por meio dessa vulnerabilidade, um atacante com privilégios de administrador pode explorá-la para extrair informações do banco de dados do site alvo.
Prepare um site WordPress com o plugin Newsletters versão 4.9.9.7 ou inferior instalado.
Navegue até o menu do painel do plugin Newsletters (/wp-admin/admin.php?page=newsletters).

Usando as ferramentas de desenvolvedor do navegador, pesquise por action=wpmlwelcomestats&security= na aba 'Elements' e verifique o valor de security. Por exemplo, se o resultado da pesquisa aparecer como mostrado abaixo, anote 22b1ac0de6.
// ...
jQuery.getJSON(newsletters_ajaxurl + 'action=wpmlwelcomestats&security=22b1ac0de6', ajaxdata, function(json) {
// ...

Insira o valor de security anotado na seção <VALOR DE SEGURANÇA> do caminho de URL abaixo e envie uma solicitação para essa URL
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=<SECURITY VALUE>&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
Ao solicitar a URL onde ocorre a vulnerabilidade de Injeção de SQL no PoC acima, a função ajax_welcomestats dentro do arquivo /wp-content/plugins/newsletters-lite/wp-mailinglist-plugin.php é chamada.
Nesse momento, o parâmetro de solicitação history_id é diretamente referenciado como uma cláusula de condição na string da consulta SQL e inicializado como a variável $history_condition. Essa variável é então passada para a consulta ao banco de dados sem qualquer processamento de escape.

Portanto, como não há validação ou processamento de escape para os valores inseridos no parâmetro de URL history_id, ocorre uma vulnerabilidade de Injeção de SQL. (Observe que os parâmetros de URL from e to também estão vulneráveis a ataques de Injeção de SQL devido à validação de entrada e processamento de escape insuficientes.)
Entre os parâmetros de URL,
history_idcontém o payload de Injeção de SQL, que permite consultar o nome do banco de dados (DATABASE()) e a versão (@@VERSION). Por exemplo, quando o valor desecurityé22b1ac0de6, acesse a seguinte URL.
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=22b1ac0de6&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
Ao verificar a resposta da solicitação à URL, você pode confirmar que o nome do banco de dados e as informações de versão são expostos devido à vulnerabilidade de Injeção de SQL por meio do parâmetro history_id.
