
PoC of CVE-2025-22783
Plugin WordPress
Nome do componente SEO Plugin by Squirrly SEO
Versão vulnerável <= 12.4.01
Slug do componente squirrly-seo
Link do componente https://wordpress.org/plugins/squirrly-seo/
Classe de vulnerabilidade A3: Injection
Tipo de vulnerabilidade SQL Injection
Contributor +
O SEO Plugin by Squirrly SEO permite melhorar o SEO do seu site através de um recurso de links internos que permite selecionar páginas de origem e destino com base em palavras-chave específicas. Você pode gerenciar as palavras-chave de cada link, páginas de origem, páginas de destino e status através da página de gerenciamento de links internos (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks).
Nas versões 12.4.01 e anteriores do plugin Squirrly SEO, você pode pesquisar links internos criados na página de gerenciamento de links internos. Uma vulnerabilidade de SQL Injection ocorre quando os termos de pesquisa inseridos pelos usuários (Contributor+) são passados diretamente para as consultas ao banco de dados sem validação.
Embora os resultados da pesquisa não sejam exibidos diretamente na página de gerenciamento de links internos, informações do banco de dados podem ser extraídas usando técnicas de SQL Injection baseada em tempo, como a função SLEEP.
Faça login no site alvo com uma conta que tenha privilégios de Contributor ou superiores, onde o plugin Squirrly SEO versão 12.4.01 ou inferior esteja instalado.
Em seguida, ao acessar a URL abaixo, como a condição '1=1' na instrução IF do payload de SQL Injection é sempre verdadeira, a função SLEEP(5) será executada e a página carregará após 5 segundos.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=1,SLEEP(5),1)),2,3,4,5,6,7%23
Por outro lado, se você alterar a condição da instrução IF para '1=2', a página carregará imediatamente porque o resultado é falso.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=2,SLEEP(5),1)),2,3,4,5,6,7%23
Na página de gerenciamento de links internos (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks) do plugin Squirrly SEO, ao pesquisar links internos, a consulta ao banco de dados é feita chamando a função getSqInnerlinks no arquivo /wp-content/plugins/squirrly-seo/models/Qss.php.

Neste ponto, podemos ver que a variável $query_where é inserida diretamente na consulta SQL. Vamos examinar como o valor da variável $query_where é construído:
$search contém o termo de pesquisa inserido durante a busca por links internos, e a função sanitize_text_field é usada para processar os dados de entrada do usuário.$search é usada como parte da cláusula condicional e armazenada na variável $query_where.$query_where, e filtros são aplicados através da função apply_filters.Portanto, embora o termo de pesquisa inserido pelos usuários durante a busca por links internos seja processado pela função sanitize_text_field, essa função não pode prevenir ataques de SQL Injection. Caracteres especiais usados em consultas SQL (aspas simples ('), comentários (#), etc.) não são filtrados, e quando a variável $search contendo o payload de SQL Injection é passada para a consulta ao banco de dados sem a devida proteção (escaping), ocorre uma vulnerabilidade de SQL Injection.
⚠️ O código PoC implementado faz login com uma conta de administrador para criar uma conta com privilégios mínimos (Contributor+) necessários para reproduzir a vulnerabilidade e, em seguida, aciona a vulnerabilidade usando essa conta.

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