* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
**Serialización** es el proceso de convertir un objeto en un formato de datos que se puede restaurar más tarde. A menudo, las personas serializan objetos para guardarlos en almacenamiento o enviarlos como parte de las comunicaciones.
**Deserialización** es el proceso inverso, tomando datos estructurados de algún formato y reconstruyéndolos en un objeto. Hoy en día, el formato de datos más popular para la serialización de datos es JSON. Antes de eso, era XML.
*`__destruct` se llama cuando el script de PHP finaliza y el objeto se destruye.
*`__toString` utiliza el objeto como una cadena, pero también se puede usar para leer archivos o algo más basado en la llamada de función dentro de él.
Si observas los resultados, puedes ver que las funciones **`__wakeup`** y **`__destruct`** se llaman cuando el objeto es deserializado. Ten en cuenta que en varios tutoriales encontrarás que la función **`__toString`** se llama al intentar imprimir algún atributo, pero aparentemente eso ya **no sucede**.
El método **`__unserialize(array $data)`** se llama **en lugar de `__wakeup()`** si está implementado en la clase. Te permite deserializar el objeto proporcionando los datos serializados como un array. Puedes usar este método para deserializar propiedades y realizar cualquier tarea necesaria al deserializar.
Puedes leer un ejemplo de PHP explicado aquí: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), aquí [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) o aquí [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
[**PHPGGC**](https://github.com/ambionics/phpggc) puede ayudarte a generar payloads para abusar de las deserializaciones en PHP.\
Ten en cuenta que en varios casos **no podrás encontrar una forma de abusar de una deserialización en el código fuente** de la aplicación, pero podrías ser capaz de **abusar del código de extensiones externas de PHP**.\
Entonces, si puedes, verifica la `phpinfo()` del servidor y **busca en internet** (incluso en los **gadgets** de **PHPGGC**) algún posible gadget que puedas abusar.
Si has encontrado una LFI que solo lee el archivo y no ejecuta el código PHP dentro de él, por ejemplo, utilizando funciones como _**file\_get\_contents(), fopen(), file() o file\_exists(), md5\_file(), filemtime() o filesize()**_**.** Puedes intentar abusar de una **deserialización** que ocurre al **leer** un **archivo** utilizando el protocolo **phar**.\
Para obtener más información, lee el siguiente artículo:
La siguiente página presenta la técnica para **abusar de una deserialización insegura en las bibliotecas de Python de yamls** y finaliza con una herramienta que se puede utilizar para generar una carga útil de deserialización RCE para **Pickle, PyYAML, jsonpickle y ruamel.yaml**:
JS **no tiene funciones "mágicas"** como PHP o Python que se ejecutarán solo para crear un objeto. Pero tiene algunas **funciones** que se **utilizan con frecuencia incluso sin llamarlas directamente**, como **`toString`**, **`valueOf`**, **`toJSON`**.\
Si abusas de una deserialización, puedes **comprometer estas funciones para ejecutar otro código** (potencialmente abusando de contaminaciones de prototipos) y así ejecutar código arbitrario cuando se llamen.
Otra forma **"mágica" de llamar a una función** sin llamarla directamente es **comprometer un objeto que es devuelto por una función asíncrona** (promesa). Porque, si **transformas** ese **objeto devuelto** en otra **promesa** con una **propiedad** llamada **"then" de tipo función**, se ejecutará solo porque es devuelto por otra promesa. _Sigue_ [_**este enlace**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _para obtener más información._
Como puedes ver en el último fragmento de código, si se encuentra la bandera, se utiliza `eval` para deserializar la función, por lo que básicamente se está utilizando la entrada del usuario dentro de la función `eval`.
Sin embargo, simplemente serializar una función no la ejecutará, ya que sería necesario que alguna parte del código esté llamando a `y.rce` en nuestro ejemplo, lo cual es muy poco probable.\
De todos modos, podrías modificar el objeto serializado agregando algunos paréntesis para que la función serializada se ejecute automáticamente cuando se deserialice el objeto.\
En el siguiente fragmento de código, observa el último paréntesis y cómo la función `unserialize` ejecutará automáticamente el código:
Como se indicó anteriormente, esta biblioteca obtendrá el código después de `_$$ND_FUNC$$_` y lo **ejecutará** utilizando `eval`. Por lo tanto, para **auto-ejecutar código**, puedes **eliminar la parte de creación de la función** y el último paréntesis y **simplemente ejecutar un comando de JavaScript en una sola línea** como en el siguiente ejemplo:
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
serialize.unserialize(test);
```
Puedes [**encontrar aquí**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **más información** sobre cómo explotar esta vulnerabilidad.
La diferencia interesante aquí es que los **objetos integrados estándar no son accesibles**, porque están fuera de alcance. Esto significa que podemos ejecutar nuestro código, pero no podemos llamar a los métodos de los objetos integrados. Entonces, si usamos `console.log()` o `require(something)`, Node devuelve una excepción como `"ReferenceError: console is not defined"`.
Sin embargo, podemos recuperar fácilmente el acceso a todo porque aún tenemos acceso al contexto global usando algo como `this.constructor.constructor("console.log(1111)")();`:
El paquete **no incluye ninguna funcionalidad de deserialización** y requiere que la implementes tú mismo. Su ejemplo utiliza `eval` directamente. Este es el ejemplo oficial de deserialización:
El principal problema con los objetos deserializados en Java es que **se invocaron devoluciones de llamada de deserialización durante la deserialización**. Esto permite que un **atacante** se **aproveche de esas devoluciones de llamada** y prepare un payload que abuse de las devoluciones de llamada para **realizar acciones maliciosas**.
Busca en el código las clases y funciones de serialización. Por ejemplo, busca clases que implementen `Serializable`, el uso de `java.io.ObjectInputStream` \_\_ o las funciones `readObject` \_\_ o `readUnshare`\_.
* Archivos web con extensión `.faces` y parámetro `faces.ViewState`. Si encuentras esto en una aplicación web, echa un vistazo al [**post sobre la deserialización de Java JSF VewState**](java-jsf-viewstate-.faces-deserialization.md).
Si quieres **aprender cómo funciona una explotación de deserialización en Java**, deberías echar un vistazo a [**Deserialización básica en Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserialización de DNS en Java**](java-dns-deserialization-and-gadgetprobe.md) y [**Carga útil de CommonsCollection1**](java-transformers-to-rutime-exec-payload.md).
Puedes intentar **verificar todas las bibliotecas** conocidas por ser vulnerables y para las cuales [**Ysoserial**](https://github.com/frohoff/ysoserial) puede proporcionar un exploit. O puedes verificar las bibliotecas indicadas en [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
También puedes usar [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) para buscar posibles cadenas de gadgets que se puedan explotar.\
Cuando ejecutes **gadgetinspector** (después de compilarlo), no te preocupes por las toneladas de advertencias/errores que aparecen y déjalo terminar. Escribirá todos los hallazgos en _gadgetinspector/gadget-results/gadget-chains-año-mes-día-hora-min.txt_. Ten en cuenta que **gadgetinspector no creará un exploit y puede indicar falsos positivos**.
Usando la extensión de Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), puedes identificar **qué bibliotecas están disponibles** (e incluso las versiones). Con esta información, podría ser **más fácil elegir un payload** para explotar la vulnerabilidad.\
[**Lee esto para obtener más información sobre GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe se centra en las deserializaciones de \*\* `ObjectInputStream` \*\*.\*\*
Usando la extensión de Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), puedes **identificar bibliotecas vulnerables** explotables con ysoserial y **explotarlas**.\
[**Lee esto para obtener más información sobre Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
También puedes usar [**Freddy**](https://github.com/nccgroup/freddy) para **detectar vulnerabilidades** de deserialización en **Burp**. Este complemento detectará vulnerabilidades relacionadas no solo con `ObjectInputStream`, sino también con bibliotecas de deserialización de **Json** y **Yml**. En modo activo, intentará confirmarlas utilizando payloads de sleep o DNS.\
[**Puedes encontrar más información sobre Freddy aquí.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
No todo se trata de verificar si el servidor utiliza alguna biblioteca vulnerable. A veces puedes ser capaz de **cambiar los datos dentro del objeto serializado y evadir algunas comprobaciones** (quizás otorgarte privilegios de administrador dentro de una aplicación web).\
Si encuentras un objeto serializado de Java que se envía a una aplicación web, **puedes usar** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **para imprimir en un formato más legible para los humanos el objeto de serialización que se envía**. Saber qué datos estás enviando facilitaría modificarlos y evadir algunas comprobaciones.
La herramienta más conocida para explotar deserializaciones de Java es [**ysoserial**](https://github.com/frohoff/ysoserial) ([**descargar aquí**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). También puedes considerar usar [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), que te permitirá usar comandos complejos (con tuberías, por ejemplo).\
Ten en cuenta que esta herramienta está **centrada** en explotar **`ObjectInputStream`**.\
Yo **comenzaría usando el payload "URLDNS"** antes que un payload de RCE para probar si la inyección es posible. De todos modos, ten en cuenta que tal vez el payload "URLDNS" no funcione, pero otro payload de RCE sí lo haga.
Al crear un payload para **java.lang.Runtime.exec()**, **no puedes usar caracteres especiales** como ">" o "|" para redirigir la salida de una ejecución, "$()" para ejecutar comandos o incluso **pasar argumentos** a un comando separados por **espacios** (puedes hacer `echo -n "hello world"` pero no puedes hacer `python2 -c 'print "Hello world"'`). Para codificar correctamente el payload, puedes [utilizar esta página web](http://www.jackson-t.ca/runtime-exec-payloads.html).
Siéntete libre de utilizar el siguiente script para crear **todos los posibles payloads de ejecución de código** para Windows y Linux, y luego probarlos en la página web vulnerable:
Puedes **utilizar** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **junto con ysoserial para crear más exploits**. Más información sobre esta herramienta en las **diapositivas de la charla** donde se presentó la herramienta: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1)
[**marshalsec**](https://github.com/mbechler/marshalsec) se puede utilizar para generar payloads y explotar diferentes bibliotecas de serialización **Json** y **Yml** en Java.\
Para compilar el proyecto, necesité **agregar** estas **dependencias** al archivo `pom.xml`:
Lee más sobre esta biblioteca de JSON en Java: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
* Si quieres probar algunos payloads de ysoserial, puedes **ejecutar esta aplicación web**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
Algunos de los objetos de tu aplicación pueden verse obligados a implementar `Serializable` debido a su jerarquía. Para garantizar que tus objetos de aplicación no puedan ser deserializados, se debe declarar un método `readObject()` (con un modificador `final`) que siempre lance una excepción:
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
La clase `java.io.ObjectInputStream` se utiliza para deserializar objetos. Es posible fortalecer su comportamiento mediante la creación de una subclase. Esta es la mejor solución si:
La idea general es sobrescribir [`ObjectInputStream.html#resolveClass()`](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass\(java.io.ObjectStreamClass\)) para restringir qué clases se permiten deserializar.
Dado que esta llamada ocurre antes de que se llame a `readObject()`, puedes estar seguro de que no ocurrirá ninguna actividad de deserialización a menos que sea del tipo que deseas permitir.
Un ejemplo simple se muestra aquí, donde la clase `LookAheadObjectInputStream` está garantizada para no deserializar ningún otro tipo aparte de la clase `Bicycle`:
Si no eres el propietario del código o no puedes esperar a un parche, utilizar un agente para incorporar fortalecimiento a `java.io.ObjectInputStream` es la mejor solución.\
Utilizando este enfoque, solo puedes incluir en la lista negra los tipos maliciosos conocidos y no incluirlos en la lista blanca, ya que no sabes qué objetos se están serializando.
Para habilitar estos agentes, simplemente agrega un nuevo parámetro JVM:
```
-javaagent:name-of-agent.jar
```
### Referencias
* Charla sobre deserialización y ysoserial: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
* Charla sobre gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) y diapositivas: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
* Documento de Marshalsec: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
* Documento sobre deserialización en Java y .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** charla: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) y diapositivas: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
Encuentra qué es **la inyección de JNDI, cómo abusar de ella a través de RMI, CORBA y LDAP y cómo explotar log4shell** (y un ejemplo de esta vulnerabilidad) en la siguiente página:
> La API de **Java Message Service** (**JMS**) es una API de middleware orientada a mensajes en Java para enviar mensajes entre dos o más clientes. Es una implementación para manejar el problema del productor-consumidor. JMS es parte de Java Platform, Enterprise Edition (Java EE) y fue definido por una especificación desarrollada en Sun Microsystems, pero que desde entonces ha sido guiada por el Java Community Process. Es un estándar de mensajería que permite a los componentes de aplicaciones basadas en Java EE crear, enviar, recibir y leer mensajes. Permite que la comunicación entre diferentes componentes de una aplicación distribuida sea débilmente acoplada, confiable y asíncrona. (De [Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service)).
Entonces, básicamente hay **varios servicios que utilizan JMS de manera peligrosa**. Por lo tanto, si tienes **suficientes privilegios** para enviar mensajes a estos servicios (generalmente necesitarás credenciales válidas), podrías ser capaz de enviar **objetos maliciosos serializados que serán deserializados por el consumidor/suscriptor**.\
Esto significa que en esta explotación, todos los **clientes que vayan a utilizar ese mensaje se infectarán**.
Debes recordar que incluso si un servicio es vulnerable (porque deserializa de manera insegura la entrada del usuario), aún necesitas encontrar gadgets válidos para explotar la vulnerabilidad.
La herramienta [JMET](https://github.com/matthiaskaiser/jmet) fue creada para **conectar y atacar estos servicios enviando varios objetos maliciosos serializados utilizando gadgets conocidos**. Estos exploits funcionarán si el servicio aún es vulnerable y si alguno de los gadgets utilizados está dentro de la aplicación vulnerable.
.Net es similar a Java en cuanto a cómo funcionan los exploits de deserialización: El **exploit** abusará de gadgets que **ejecutan** algún código interesante cuando se **deserializa** un objeto.
Puede buscar la cadena codificada en Base64 **AAEAAAD/////** u cualquier otra cosa que **pueda ser deserializada** en el backend y que le permita controlar el tipo deserializado. Por ejemplo, un **JSON** o **XML** que contenga `TypeObject` o `$type`.
En este caso, puede utilizar la herramienta [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) para **crear exploits de deserialización**. Una vez descargado el repositorio de git, debe **compilar la herramienta** utilizando Visual Studio, por ejemplo.
Si desea aprender sobre **cómo ysoserial.net crea su exploit**, puede [**consultar esta página donde se explica el gadget ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
* **`--gadget`** se utiliza para indicar el gadget a abusar (indique la clase/función que se abusará durante la deserialización para ejecutar comandos).
* **`--formatter`**, se utiliza para indicar el método para serializar el exploit (debe saber qué biblioteca está utilizando el backend para deserializar la carga útil y utilizar la misma para serializarla).
* \*\*`--output` \*\* se utiliza para indicar si desea el exploit en formato **raw** o codificado en Base64. _Tenga en cuenta que **ysoserial.net** codificará la carga útil utilizando **UTF-16LE** (codificación utilizada de forma predeterminada en Windows), por lo que si obtiene el formato raw y simplemente lo codifica desde una consola de Linux, es posible que tenga algunos problemas de **compatibilidad de codificación** que evitarán que el exploit funcione correctamente (en el HTB JSON box, la carga útil funcionó tanto en UTF-16LE como en ASCII, pero esto no significa que siempre funcionará)._
* \*\*`--plugin` \*\* ysoserial.net admite complementos para crear **exploits para frameworks específicos** como ViewState.
#### Más parámetros de ysoserial.net
*`--minify` proporcionará una carga útil **más pequeña** (si es posible).
*`--raf -f Json.Net -c "anything"` Esto indicará todos los gadgets que se pueden utilizar con un formateador proporcionado (`Json.Net` en este caso).
*`--sf xml` puede **indicar un gadget** (`-g`) y ysoserial.net buscará formateadores que contengan "xml" (sin distinción de mayúsculas y minúsculas).
**Ejemplos de ysoserial.net** para crear exploits:
**ysoserial.net** también tiene un parámetro muy interesante que ayuda a comprender mejor cómo funciona cada exploit: `--test`. Si indicas este parámetro, **ysoserial.net** intentará el exploit localmente, para que puedas probar si tu carga útil funcionará correctamente. Este parámetro es útil porque si revisas el código, encontrarás fragmentos de código como el siguiente (de [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
Esto significa que para probar el exploit, el código llamará a [serializersHelper.JsonNet\_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539)
Object obj = JsonConvert.DeserializeObject<Object>(str, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
return obj;
}
```
En el **código anterior es vulnerable al exploit creado**. Por lo tanto, si encuentras algo similar en una aplicación .Net, significa que probablemente esa aplicación también es vulnerable.\
Por lo tanto, el parámetro **`--test`** nos permite entender **qué fragmentos de código son vulnerables** al exploit de deserialización que puede crear **ysoserial.net**.
Echa un vistazo a [este POST sobre **cómo intentar explotar el parámetro \_\_ViewState de .Net**](exploiting-\_\_viewstate-parameter.md) para **ejecutar código arbitrario**. Si **ya conoces los secretos** utilizados por la máquina víctima, [**lee este post para saber cómo ejecutar código**](exploiting-\_\_viewstate-knowing-the-secret.md)**.**
No permitas que el flujo de datos defina el tipo de objeto al que se deserializará el flujo. Puedes prevenir esto utilizando, por ejemplo, `DataContractSerializer` o `XmlSerializer` si es posible.
Si es necesario deserializar flujos de datos que definen su propio tipo, entonces restrinja los tipos que se permiten deserializar. Uno debe ser consciente de que esto sigue siendo arriesgado, ya que muchos tipos nativos de .Net son potencialmente peligrosos en sí mismos. Por ejemplo,
Los objetos `FileInfo` que hacen referencia a archivos en el servidor pueden, al deserializarse, cambiar las propiedades de esos archivos, como por ejemplo, ponerlos en modo de solo lectura, lo que crea un potencial ataque de denegación de servicio.
Incluso si has limitado los tipos que pueden ser deserializados, recuerda que algunos tipos tienen propiedades que representan un riesgo. Por ejemplo, `System.ComponentModel.DataAnnotations.ValidationException` tiene una propiedad `Value` de tipo `Object`. Si este tipo es permitido para la deserialización, un atacante puede establecer la propiedad `Value` a cualquier tipo de objeto que elijan.
Se debe evitar que los atacantes puedan controlar el tipo que se instanciará. Si esto es posible, incluso `DataContractSerializer` o `XmlSerializer` pueden ser subvertidos.
var serializer = new DataContractJsonSerializer(Type.GetType(typename));
var obj = serializer.ReadObject(ms);
```
La ejecución puede ocurrir dentro de ciertos tipos de .Net durante la deserialización. Crear un control como el que se muestra a continuación es ineficaz.
```
var suspectObject = myBinaryFormatter.Deserialize(untrustedData);
//Check below is too late! Execution may have already occurred.
Para `BinaryFormatter` y `JSON.Net`, es posible crear una forma más segura de control de lista blanca utilizando un `SerializationBinder` personalizado.
Manténgase actualizado sobre los gadgets de deserialización inseguros conocidos de .Net y preste especial atención a los lugares donde dichos tipos pueden ser creados por sus procesos de deserialización. **Un deserializador solo puede instanciar tipos que conoce**.
Mantenga cualquier código que pueda crear gadgets potenciales separado de cualquier código que tenga conectividad a Internet. Como ejemplo, `System.Windows.Data.ObjectDataProvider` utilizado en aplicaciones WPF es un gadget conocido que permite la invocación arbitraria de métodos. Sería arriesgado tener una referencia a este ensamblado en un proyecto de servicio REST que deserializa datos no confiables.
* Documento sobre deserialización JSON en Java y .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** charla: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) y diapositivas: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
Ruby tiene dos métodos para implementar la serialización dentro de la biblioteca **marshal**: el primer método es **dump** que convierte un objeto en una secuencia de bytes **(serializar)**. Y el segundo método es **load** para convertir la secuencia de bytes nuevamente en un objeto (**deserializar**).\
Ruby utiliza HMAC para firmar el objeto serializado y guarda la clave en uno de los siguientes archivos:
* config/environment.rb
* config/initializers/secret\_token.rb
* config/secrets.yml
* /proc/self/environ
Cadena de gadgets de deserialización genérica de Ruby 2.X a RCE (más información en [https://www.elttam.com/blog/ruby-deserialization/](https://www.elttam.com/blog/ruby-deserialization/)):
Otra cadena de RCE para explotar Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).