Resumen
En un sitio WordPress de Essity (el dominio aparece censurado en el reporte), alguien había ido subiendo a lo largo de los años los paquetes ZIP de varios plugins de pago a través de la biblioteca de medios. El resultado: 29 archivos, fechados entre diciembre de 2019 y octubre de 2025, que quedaban en /wp-content/uploads/ como cualquier imagen pública.
Dos cosas convertían esto en un problema:
- Los ficheros se servían por URL directa sin ninguna comprobación de autenticación ni autorización.
- No hacía falta adivinar los nombres (que llevan un sufijo aleatorio): la API REST de WordPress, en
/wp-json/wp/v2/media, los listaba con su URL completa.
Según el investigador, los paquetes incluyen el código fuente completo de los plugins y tokens de licencia o de verificación de compra incrustados. La debilidad se clasificó como asignación incorrecta de permisos a un recurso crítico (CWE-732), con severidad media.
Plugins afectados según el reporte:
| Plugin | ZIP | Fechas | |---|---|---| | Slider Revolution (RevSlider) | 14 | dic. 2019 – oct. 2025 | | Advanced Custom Fields Pro | 6 | sep. 2020 – jul. 2021 | | Ultimate Elementor | 3 | may. 2021 – ago. 2021 | | Wordfence Premium | 2 | sep. 2020 – abr. 2022 | | Jet Smart Filters | 1 | mar. 2021 | | Advanced Woo Search | 1 | nov. 2020 | | OoohBoi Steroids for Elementor | 1 | ago. 2020 | | Starter Templates (Starter Sites) | 1 | ago. 2020 |
Pasos de reproducción
- Pedir a la API REST los medios de tipo
applicationy quedarse solo con las URL que contienen.zip:
curl -s "https://████████/wp-json/wp/v2/media?per_page=100&media_type=application" \
| python3 -c "
import sys, json
for m in json.load(sys.stdin):
url = m.get('source_url','')
if '.zip' in url: print(url)
"
La salida es la lista de los 29 ficheros. Algunos ejemplos:
https://████████/wp-content/uploads/2025/10/revslider-6.5.14-HcwXam9CAYQZ0Y5.zip
https://████████/wp-content/uploads/2022/04/wordfence-7.5.9-mC66W9ZhHM.zip
https://████████/wp-content/uploads/2021/07/advanced-custom-fields-pro-5.9.7-B1tmZG9J2M6zhPBpk1BK.zip
https://████████/wp-content/uploads/2019/12/revslider-6.1.3-NLNTgy22Q4cD.zip
- Descargar cualquiera de ellos sin cookies ni credenciales:
curl -O "https://████████/wp-content/uploads/2025/10/revslider-6.5.14-HcwXam9CAYQZ0Y5.zip"
El servidor responde con el fichero completo (unos 7,6 MB):
HTTP/2 200
content-type: application/zip
content-length: 7606630
- Descomprimirlo y buscar datos de licencia dentro del código:
unzip revslider-6.5.14-HcwXam9CAYQZ0Y5.zip
grep -r "purchase_code\|license\|api_key\|activation" revslider/
Impacto
El investigador enumera estas consecuencias:
- Uso indebido de licencias: las claves de RevSlider, Wordfence Premium, ACF Pro o Ultimate Elementor que contengan los paquetes podrían extraerse y reutilizarse, con la consiguiente pérdida económica.
- Investigación dirigida: con el código fuente exacto de lo que corre en el sitio, un atacante puede buscar fallos en esas versiones concretas.
- Historial de versiones: 29 paquetes repartidos entre 2019 y 2025 muestran cuándo se actualizó cada plugin, lo que permite deducir en qué periodos el sitio tenía vulnerabilidades conocidas sin parchear.
- Riesgo de cadena de suministro: si los paquetes no venían de fuentes oficiales, podrían llevar puertas traseras.
Remediación
El reporte figura como resuelto; el envío fue el 3 de julio de 2026 y la divulgación el 6 de julio. El original no detalla qué cambió exactamente Essity, pero el investigador propuso:
- Borrar todos los ZIP del directorio de subidas.
- Revocar y renovar las licencias incluidas en los paquetes expuestos.
- Bloquear en el servidor web el acceso directo a ficheros ZIP dentro de
uploads, por ejemplo en nginx:
location ~* /wp-content/uploads/.*\.zip$ {
deny all;
}
- Actualizar los plugins de pago con un mecanismo dedicado (como el plugin Envato Market) en lugar de subir los ZIP a la biblioteca de medios.
Qué aprender de este caso
- En cualquier WordPress, consulta
/wp-json/wp/v2/media?media_type=applicationantes de intentar adivinar rutas: devuelve elsource_urlde cada fichero subido, así que los sufijos aleatorios en el nombre no protegen nada. - La biblioteca de medios es pública por diseño: todo lo que se suba ahí (instaladores de plugins, copias de seguridad, exportaciones) queda tan expuesto como una imagen de la portada. Para instalar o actualizar plugins, usa el instalador del panel o el mecanismo del proveedor en lugar de dejar el ZIP en la biblioteca de medios.
- Una regla en el servidor web que deniegue extensiones que nunca deberían servirse desde
uploads(.zip,.sql,.bak…) limita el daño cuando alguien sube algo por error. - Si un paquete con licencia llega a quedar expuesto, borrarlo no basta: hay que revocar y regenerar las claves, porque pudo descargarse antes.