Reports
MEDIA[EXPOSICIÓN DE DATOS]#3839889

Essity: 29 paquetes de plugins premium de WordPress descargables sin autenticación desde la biblioteca de medios

Una web de Essity guardaba en su biblioteca de medios de WordPress 29 ZIP de plugins de pago (RevSlider, ACF Pro, Wordfence Premium…), listados por la API REST y descargables por cualquiera sin iniciar sesión.

Resumen
Resumen en castellano de un reporte público, no una traducción literal. El código y los comandos se mantienen como en el original.

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

  1. Pedir a la API REST los medios de tipo application y 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
  1. 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
  1. 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:

  1. Borrar todos los ZIP del directorio de subidas.
  2. Revocar y renovar las licencias incluidas en los paquetes expuestos.
  3. 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;
}
  1. 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=application antes de intentar adivinar rutas: devuelve el source_url de 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.