Nuevos labs cada semana — Accede a todos desde 7,99€/mes
Ver labs →Labs de Deserialización
Insecure Deserialization
¿Qué es Deserialización?
La Deserialización Insegura ocurre cuando una app reconstruye objetos a partir de datos serializados controlados por el usuario sin validarlos. En PHP, Java, Python (pickle) o .NET, el proceso de deserialización puede invocar gadgets internos que derivan en RCE.
¿Por qué practicar Deserialización?
Es una de las vías más fiables a RCE en aplicaciones enterprise (Java, .NET) y CMS PHP. Reconocer un blob serializado y disparar la cadena de gadgets correcta es una skill muy valorada y con poca competencia. Los bounties por una deserialización a RCE arrancan en $5,000 y suben rápido.
¿Qué aprenderás con los labs de Deserialización?
Aprenderás a reconocer formatos serializados (O: en PHP, rO0 en Java, el opcode de pickle, AAEAAAD en .NET), construir payloads de PHP object injection con métodos mágicos (__wakeup/__destruct), generar cadenas con ysoserial en Java, y forjar pickles que ejecutan comandos en Python.
Tipos de Deserialización que cubrimos
- PHP Object Injection
unserialize() sobre input del usuario + una clase con __wakeup/__destruct explotable como gadget.
- Java (ysoserial)
Stream serializado rO0AB... a un endpoint que lo deserializa. ysoserial genera la cadena de gadgets (CommonsCollections, etc.).
- Python pickle
pickle.loads() de datos del usuario. Un objeto con __reduce__ ejecuta os.system al deserializarse.
- .NET
BinaryFormatter/Json.NET con TypeResolver laxo. ysoserial.net genera gadgets para RCE.
¿Cómo encontrar y explotar Deserialización?
Playbook práctico — del recon a la prueba de concepto.
- 1
Reconocer datos serializados
Busca blobs en cookies, parámetros o cuerpos con firmas reconocibles de cada plataforma. Es el primer indicio de deserialización.
PHP: O:4:"User":... · Java: rO0AB... · .NET: AAEAAAD///// · pickle bytes - 2
Identificar la plataforma y el sink
Determina el lenguaje y que el dato llega a una función de deserialización insegura (unserialize, readObject, pickle.loads, BinaryFormatter).
Cookie base64 → decodifica → empieza por rO0 = Java serialized - 3
PHP object injection
Si es PHP, forja un objeto de una clase con método mágico explotable y ajústalo para que su gadget ejecute tu acción al destruirse.
O:6:"Logger":1:{s:4:"file";s:10:"/tmp/x.php";} (gadget __destruct escribe fichero) - 4
Java/.NET con ysoserial
Genera la cadena de gadgets con la herramienta del ecosistema según las librerías presentes y envíala al endpoint vulnerable.
java -jar ysoserial.jar CommonsCollections6 'id' | base64 - 5
Python pickle RCE
Construye un objeto cuyo __reduce__ devuelva os.system con tu comando; al deserializarse, ejecuta.
class E: def __reduce__(self): return (os.system,('id',)) → base64(pickle.dumps(E()))
Aprende la teoría
Academy: Técnicas Avanzadas
Cargando labs...
Ver en catálogo completo →Preguntas frecuentes
¿Qué es la Deserialización Insegura?
Es una vulnerabilidad en la que la aplicación reconstruye objetos a partir de datos serializados controlados por el usuario sin validarlos. El propio proceso de deserialización puede invocar 'gadgets' internos del lenguaje que terminan ejecutando código (RCE).
¿Cómo se explota una deserialización insegura?
Se identifica un blob serializado (cookie, parámetro) y la plataforma (PHP, Java, Python, .NET), y se sustituye por un payload malicioso: un objeto PHP con método mágico, una cadena de ysoserial en Java/.NET o un pickle con __reduce__ en Python que ejecuta comandos al deserializarse.
¿Cómo encontrar Insecure Deserialization en bug bounty?
Decodifica cookies y parámetros buscando firmas de serialización (O: en PHP, rO0 en Java, AAEAAAD en .NET, bytes de pickle). Si encuentras un blob deserializado por el servidor, prueba a forjar objetos o usa ysoserial para generar la cadena de gadgets adecuada.
¿Cómo prevenir la Deserialización Insegura?
No deserialices datos no confiables; usa formatos de datos sin capacidad de instanciar objetos (JSON con parser estricto), firma e integridad-checkea los blobs si son imprescindibles, restringe los tipos permitidos (allowlist) y evita BinaryFormatter/pickle sobre input del usuario.
¿Por qué la deserialización lleva tan a menudo a RCE?
Porque al reconstruir un objeto se ejecutan métodos automáticos (__wakeup/__destruct en PHP, readObject en Java, __reduce__ en pickle). Encadenando clases ya presentes en la app (gadgets), un atacante dirige esa ejecución hacia llamadas peligrosas como system o spawn.
Otras categorías relacionadas
Empieza con labs de Deserialización
Practica Insecure Deserialization con labs basados en reportes reales. En español. Desde 7,99€/mes.
Empieza con el primer lab de Deserialización