
PoC do CVE-2025-22710
Plugin WordPress
Nome do componente WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager
Versão vulnerável <= 8.50.0
Slug do componente smart-manager-for-wp-e-commerce
Link do componente https://wordpress.org/plugins/smart-manager-for-wp-e-commerce/
Classe de vulnerabilidade A3: Injeção
Tipo de vulnerabilidade Injeção SQL
Administrador
O plugin WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager (doravante Smart Manager) é um plugin que permite a edição em massa e a visualização de todos os tipos de post no WordPress.
Na versão 8.50.0 e anteriores do plugin Smart Manager, ao utilizar a função de pesquisa avançada para visualizar posts, ocorre uma vulnerabilidade de Injeção SQL porque os valores de filtragem são passados para as consultas ao banco de dados sem processamento de escape.
No entanto, embora os resultados diretos de ataques de Injeção SQL não possam ser vistos na tela, a Injeção SQL Cega é possível através de diferenças nos valores de resposta com base em condições verdadeiro/falso.
⚠️ Pelo menos um post deve existir para observar a diferença nos valores de resposta com base em condições verdadeiro/falso.
/wp-admin/admin.php?page=smart-manager).

' OR 1=1 )) # no formulário de entrada de texto. Depois disso, clique no botão de pesquisa no topo.

' OR 1=2 )) # no formulário de entrada de texto, nenhum post será recuperado porque a condição é sempre falsa (OR 1=2).

Ao executar a função 'Pesquisa Avançada' solicitada na descrição do PoC acima, o seguinte pacote é gerado, e os valores de filtragem (Título do Post, is, ' OR 1=1 )) #) inseridos na pesquisa avançada são colocados nos dados da requisição advanced_search_query.
advanced_search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

Quando este pacote é solicitado, a função get_data_model no arquivo /wp-content/plugins/smart-manager-for-wp-e-commerce/classes/class-smart-manager-base.php é chamada e realiza consultas ao banco de dados na seguinte ordem.
Se os dados da requisição advanced_search_query existirem, ela chama a função process_search_cond. Neste momento, os dados da requisição advanced_search_query são passados para o valor com a chave search_query no argumento do par chave-valor.
search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

A função chamada process_search_cond itera pelo valor com a chave search_query, inicializa o valor de filtragem Título do Post (post_title) na variável $search_col, e inicializa o valor de filtragem ' OR 1=1 )) # contendo o payload de Injeção SQL na variável $search_value.

As variáveis $search_col e $search_value são passadas para as chaves search_col (=post_title) e search_value (=' OR 1=1 )) #) do array $search_params, respectivamente. Posteriormente, esta variável $search_params é passada como um valor com a chave search_params para a função create_flat_table_search_query.

Em seguida, a função create_flat_table_search_query define a cláusula WHERE da consulta SQL, e neste ponto, o search_value (=' OR 1=1 )) #) da chave search_params passado como argumento é incluído na cláusula WHERE sem qualquer processamento de escape.

Então, o valor de retorno da função create_flat_table_search_query (contendo o payload de Injeção SQL) é passado como argumento para a função process_flat_table_search_query.

A função process_flat_table_search_query constrói uma consulta ao banco de dados usando o argumento recebido, inicializando as variáveis $select, $from e $where. Aqui, podemos ver que o payload de Injeção SQL é passado diretamente para a variável $where sem qualquer validação.

As variáveis $select, $from, $where são diretamente atribuídas à variável $query_posts_search, e esta variável é, por fim, passada como argumento para a função que executa a consulta ao banco de dados.

Na função de pesquisa avançada, a entrada do usuário (' OR 1=1 )) #) é incluída diretamente na consulta ao banco de dados sem processamento de escape, resultando em uma vulnerabilidade de Injeção SQL. Esta vulnerabilidade permite que atacantes executem consultas SQL arbitrárias, potencialmente levando a sérios riscos de segurança, como vazamento ou manipulação de informações sensíveis do banco de dados.
⚠️ O código PoC implementado consulta o nome do banco de dados explorando a vulnerabilidade de Injeção SQL.
Abra o código PoC em um editor e insira o endereço do site WordPress e as credenciais do administrador.

Em seguida, digite o seguinte comando para executar o código PoC.
Módulo necessáriorequests
python poc.py
