Aprende que es una Deserialización Insegura

Hello Engineers!
En el dia de hoy, vamos a aprender acerca de una debilidad muy usual y critica en las aplicaciones web.

A8 - Insecure Deserialization
Es una vulnerabilidad que se produce cuando se usan datos no confiables para abusar de la lógica de una aplicación, infligir un ataque de denegación de servicio (DoS) o incluso ejecutar código arbitrario cuando se deserializa.
Una Aplicacion y APIs puede ser vulnerable, si deserializan objetos hostiles o manipulados por un atacante. Esto da como resultado dos tipos primarios de ataques:

  • Ataques relacionados con la estructura de datos y objetos; donde el atacante modifica la lógica de la aplicación o logra una ejecución remota de código que puede cambiar el comportamiento de la aplicación durante o después de la deserialización.
  • Ataques típicos de manipulación de datos; como ataques relacionados con el control de acceso, en los que se utilizan estructuras de datos existentes pero se modifica su contenido.

Conceptos Basicos

Serialización: Se refiere a un proceso de conversión de un objeto a un formato que puede persistir en el disco enviado a través de secuencias o enviado a través de una red. El formato en el que se serializa un objeto puede ser binario o texto estructurado (por ejemplo, XML, JSON YAML …). Cabe resaltar que JSON y XML son dos de los formatos de serialización más utilizados en las aplicaciones web.

Deserialización: Se refiere a transformar los datos serializados provenientes de un archivo, flujo o socket de red en un objeto.

Explotando las vulnerabilidades mas criticas en aplicaciones WEB.

Deserialización Insegura

Escenario de la prueba #1:
Vamos aprender a explotar esta vulnerabilidad por medio de un uploader que se encuentra en un aplicativo WEB.

Inicialmente vamos a dirigirnos al apartado para realizar la prueba de inyeccion de XSS reflejada.
http://172.17.0.2:9090/app/bulkproducts?legacy=true

Formulario con un uploader.

El aplicativo web anterior se compone de un uploader que recibe archivos para cargarlos en la base de datos y mostrarlos en la siguiente tabla.

Tabla renderizando lo cargado en el uploader.

Vamos a crear un archivo JSON malicioso, con el cual obtendremos el archivo /etc/passwd.
La carga util “maliciosa” que usaremos es la siguiente:

{"rce":"_$$ND_FUNC$$_function (){require('child_process').exec('id;cat /etc/passwd', function(error, stdout, stderr) { console.log(stdout) });}()"}

Al cargar el archivo logramos obtener el siguiente resultado:

Ejecutando comandos desde el aplicativo WEB.

Recomendaciones

El único patrón de arquitectura seguro es no aceptar objetos serializados de fuentes no confiables o utilizar medios de serialización que sólo permitan tipos de datos primitivos.
Si esto no es posible, considere alguno de los siguientes puntos:

  • Implemente verificaciones de integridad tales como firmas digitales en cualquier objeto serializado, con el fin de detectar modificaciones no autorizadas.
    Aísle el código que realiza la deserialización, de modo que se ejecute en un entorno con los mínimos privilegios posibles.
  • Registre las excepciones y fallas en la deserialización, tales como cuando el tipo recibido no es el esperado, o la deserialización produce algún tipo de error.
  • Monitoree los procesos de deserialización, alertando si un usuario deserializa constantemente.

Aprende hacking explotando las vulnerabilidades mas criticas en aplicaciones WEB.

Para mas informacion leer el siguiente PDF publicado por el OWASP

About the author:

Profile Image

Gerardo Eliasib

Ethical Hacker - Developer

Cyber Security Analyst and also creator of the content published in this blog.