Demo educativa del exploit CVE-2024-12877 para inyección de objetos PHP en el plugin GiveWP de WordPress. Incluye análisis de causa raíz, técnicas de bypass de regex y prácticas seguras de explotación.
Semana 66 | Autor: Ali Soltani (soltanali0))
Bienvenido a la Semana 66 de la serie GO-TO CVE, donde analizamos vulnerabilidades, estudiamos las causas raíz y demostramos técnicas prácticas de explotación en un contexto educativo y seguro.
CVE-2024-12877 es una vulnerabilidad de inyección de objetos PHP en GiveWP, uno de los plugins de donaciones para WordPress más utilizados. El uso inseguro de unserialize() sobre entrada controlada por el usuario permite a los atacantes activar métodos mágicos de PHP (como __wakeup()), lo que puede conducir a:
CVSS: 9.8 Crítico | Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

GiveWP impulsa miles de sitios web de organizaciones benéficas, ONG y plataformas de recaudación de fondos. Dado que maneja datos financieros y de donantes sensibles, una vulnerabilidad aquí tiene un gran impacto. Un atacante que explote la inyección de objetos puede escalar desde un solo plugin hasta comprometer toda la instalación de WordPress y el servidor subyacente.
Causa raíz: unserialize() sobre entrada no confiable.
Métodos mágicos de PHP: PHP los invoca automáticamente durante el ciclo de vida del objeto:
La vulnerabilidad se origina por el uso inseguro de la función PHP unserialize() sobre entrada controlada por el usuario. Si bien unserialize() está diseñada para reconstruir estructuras de datos de PHP, conlleva un efecto secundario peligroso: cuando los objetos se reconstruyen, PHP invoca automáticamente los métodos mágicos.
__wakeup() – se activa cuando un objeto se deserializa
__destruct(), __toString(), __get/__set(), __call/__callStatic() – pueden aprovecharse para ejecución maliciosa
Validación mediante regex: GiveWP implementó comprobaciones regex para detectar entrada serializada. Aunque la nueva regex detecta más tipos de datos, la regex no puede prevenir de forma fiable la inyección de objetos.

Con un objeto serializado manipulado, el atacante establece las propiedades del objeto, y el propio PHP ejecuta la lógica del atacante al invocar los métodos mágicos
GiveWP implementó una validación basada en regex para comprobar si la entrada estaba serializada. Regex antigua (incompleta)
• Solo reconocía arrays y objetos.
• Otros tipos serializados (string, int, bool, float, null) evadían la detección.

• Reconoce todos los tipos serializados de PHP.
• Bloquea algunos payloads triviales.
• Pero el problema principal sigue ahí: si se usa unserialize() sobre entrada del usuario, la regex no puede salvarte.

Este fragmento se escribió para comparar dos implementaciones de regex diferentes:
• is_serialized_old() → la versión antigua, que solo detecta arrays y objetos.
• is_serialized_new() → la versión mejorada, que reconoce todos los tipos de datos serializados de PHP (arrays, objetos, strings, integers, booleans, floats y null). Creamos un conjunto de valores de prueba (array, object, string, integer, boolean, float, null), los serializamos y luego comprobamos cada uno contra ambas funciones regex. En términos simples:

Y después de ejecutar este código en tu dokcer, verás este resultado en el navegador:

Paso 1

Paso 2: Crear una clase vulnerable

Esta clase tiene un método __wakeup() que se ejecutará automáticamente al ser deserializada.
Paso 3: Crear el payload

Paso 4: Salida Después de guardar el archivo, en este archivo puedes ver este exploit:

Exploit :

• Regex antigua: FALSE → no detectó el payload.
• Regex nueva: TRUE → lo detectó como entrada serializada.
• Ejecutando: Hello RCE! → El payload fue deserializado y el método mágico __wakeup() ejecutó código controlado por el atacante.
Prevención • No uses unserialize() sobre entrada no confiable. Sustitúyela por json_decode() u otras alternativas más seguras.
• Mantén GiveWP y todos los plugins de WordPress actualizados.
• Implementa un Cortafuegos de Aplicación Web (WAF) para bloquear payloads serializados maliciosos.
• Sigue el Principio de Mínimo Privilegio: ejecuta las cuentas de PHP y de base de datos con los permisos mínimos necesarios.
Resultados:
Idea clave: Nunca confíes en una regex para proteger unserialize(). El enfoque más seguro es evitar deserializar entrada no confiable por completo.
unserialize() sobre entrada no confiable; prefiere json_decode() u otras alternativas seguras.Dirijo dos canales de Telegram dedicados a la investigación y explotación de vulnerabilidades:
Episodios semanales de GO-TO CVE: Cada semana, profundizamos en un nuevo CVE y compartimos análisis detallados, demos y conocimiento. 🔗 Únete aquí
CVEdb – Archivo de exploits: Este canal archiva exploits de 1 día y PoCs personalizados para CVEs. Un gran recurso para investigadores que quieran ver técnicas de explotación activas. 🔗 Únete a CVEdb
Sigue los canales para mantenerte al día con los últimos CVEs, técnicas de explotación y conocimientos de investigación en seguridad.
Este repositorio es estrictamente para fines educativos y de investigación. Explotar vulnerabilidades sin permiso es ilegal y poco ético. El autor no es responsable del mal uso.