
# Subida de archivos arbitraria sin autenticación -> RCE en WPLP Cookie Consent (gdpr-cookie-consent) <= 4.4.1 - informe técnico y PoC
Prueba de concepto y análisis técnico de la CVE-2026-75865, una subida arbitraria de archivos sin autenticación que conduce a la ejecución remota de código en el plugin WPLP Cookie Consent – Cookie Banner & Consent Management for GDPR, CCPA & Google Consent Mode para WordPress (slug gdpr-cookie-consent), que afecta a todas las versiones hasta la 4.4.1 inclusive.
| Datos clave |
|---|
| CVE | CVE-2026-75865 |
| Gravedad | Crítica — CVSS 3.1 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Debilidades | CWE-862 (Autorización faltante) + CWE-434 (Subida sin restricciones de archivos con tipo peligroso) |
| Versiones afectadas | gdpr-cookie-consent ≤ 4.4.1 |
| Corregido en | 4.4.2 |
| Asignador de CVE | Wordfence |
| Publicado | 2026-09-01 |
| Descubierto por | Supakiad S. (m3ez) |
Los endpoints REST del "conector" SaaS del plugin autentican las solicitudes delegando en la aplicación SaaS del proveedor, que valida un JWT Bearer — pero el plugin solo comprueba que el endpoint de validación responda con HTTP 200. No existe ningún vínculo de propiedad entre el JWT y el sitio de destino, por lo que cualquier token válido emitido por el SaaS (p. ej., de una cuenta gratuita) es aceptado.
La función saas_upload_logo() escribe entonces un blob base64 proporcionado por el atacante en el directorio público wp-content/uploads/ con un nombre de archivo también controlado por el atacante, sin ninguna validación de contenido ni de extensión. El token de API almacenado (master_key) que también protege el endpoint no es realmente secreto: la propia ruta /store-auth del plugin lo sobrescribe a partir de los parámetros de la solicitud tras la misma comprobación JWT, por lo que toda la cadena — desde una solicitud sin autenticación hasta un payload ejecutado en la raíz web — solo requiere una URL de destino y una cuenta SaaS gratuita.
La vulnerabilidad se corrigió en la versión 4.4.2 eliminando por completo el endpoint de subida y rediseñando el modelo de confianza del conector (vinculación de propiedad del JWT, hash_equals(), firma HMAC de las solicitudes).
Análisis técnico completo: REPORT.md
| Archivo | Descripción |
|---|---|
REPORT.md | Análisis técnico detallado: análisis de causa raíz con código referenciado por líneas, comparación de la corrección 4.4.1 → 4.4.2, cadena de explotación, detección y mitigación |
cve_2026_75865.py | Script PoC — escanea una lista de objetivos, detecta sitios vulnerables y ejecuta la cadena completa (enumeración de administradores → sobrescritura de la clave maestra → subida del payload → verificación) con salida en vivo |
payload.php | Payload benigno mínimo utilizado por defecto: imprime una cadena marcadora y admite la autoeliminación (?delete=1) |
git clone https://github.com/ghostpels/CVE-2026-75865.git
cd CVE-2026-75865
pip install requests # colorama es opcional (registros en color)
# 1. Guarda un JWT SaaS válido (cualquier cuenta en app.wplegalpages.com) en jwt.txt
# 2. Crea una lista de objetivos y ejecuta solo contra sistemas que tengas autorización para probar:
python cve_2026_75865.py -l targets.txt -o vuln.txt -t 40 --marker CVE-2026-75865-POC
Las URL de payload verificadas se añaden a vuln.txt en vivo, una por línea, en cuanto se verifica cada objetivo.
| Opción | Predeterminado | Descripción |
|---|---|---|
-l, --list | (obligatorio) | Lista de objetivos, una URL por línea |
-o, --output | vuln.txt | URL de payload verificadas, añadidas en vivo |
-t, --threads | 40 | Trabajadores concurrentes |
--shell | payload.php | Archivo de payload junto al script; el nombre subido = su nombre base |
--filename | — | Nombre de archivo subido personalizado (su extensión se prueba primero, luego --exts) |
--exts | php,phtml,php5,php74,php7,php3,php4,phar | Extensiones de respaldo cuando la principal está bloqueada |
--jwt-file | jwt.txt | JWT SaaS, primera línea no vacía |
--marker | — | Cadena que debe aparecer en la respuesta del payload para considerarse válido |
--timeout | 15 | Tiempo de espera por solicitud (segundos) |
-k, --insecure | desactivado | Deshabilitar la verificación TLS |
-v, --verbose | desactivado | Mostrar detalles de errores de conexión |
Este repositorio se publica únicamente con fines educativos y de investigación defensiva de seguridad. Utiliza la herramienta exclusivamente contra sistemas que poseas o para los que tengas permiso escrito explícito de prueba. El autor no es responsable de ningún uso indebido o daño causado por este material.