Deserialization PHAR: Guía sobre este tipo de vulnerabilidad

Valoración:
5/5
de lectura

Las vulnerabilidades de deserialización han sido un tema de gran interés histórico dentro de la comunidad de seguridad web durante años debido a que cada año surgen nuevas cadenas de ataque en diferentes lenguajes de programación como Java, C # (a través del marco .NET).

Por este motivo, en la guía de hoy nos centraremos en la infección mediante la Deserialization PHAR que utiliza el contenedor de flujo PHAR: // para realizar operaciones de lectura/escritura en archivos PHAR.

Quizás, este tipo de información no te diga mucho pero has de saber que este tipo de archivos abren la puerta a los ataques POP (Programación Orientada a Propiedades).

En este tipo de ataque el ciberdelincuente podrá modificar las propiedades de los objetos para secuestrar el flujo lógico de la aplicación. Es decir, podrá ejecutar código malicioso en tu servidor.

Comprender las vulns de deserialización de PHAR para crear aplicaciones web más seguras

Tabla de contenidos

¿Qué es la deserialización PHAR?

phar: // Envoltorio de flujo

En PHP, todas las operaciones de archivos se realizan mediante secuencias. Una secuencia es un objeto que muestra un comportamiento que se puede leer o escribir de forma lineal.

De hecho, los desarrolladores de PHP utilizan «envoltorios» cuando su aplicación solicita recursos específicos, como una imagen o un documento. Estos «envoltorios» pueden ser:

  • http: //
  • ftp: //
  • file: //
  • php: //
  • phar: //

Seguro que ahora mismo estás muy perdido. Sin embargo, si lo utilizamos de form práctica todo lo verás mucho más sencillo:

  • file_get_contents(«http://example.com/image.jpeg»)
  • file_get_contents(«file://../images/image.jpeg»)
  • file_get_contents(«phar://./archives/app.phar»)

Gracias a estos «envoltorios» podrás llamar a la misma función (file_get_contents) para obtener una imagen desde una ubicación remota o desde una carpeta almacenada en local.

Por lo tanto,  el contenedor phar: // se utilizará para interactuar con archivos PHAR. Estos archivos te permitirán realizar varias operaciones de lectura/escritura en un archivo y solo funcionarán en archivos locales.

¿Qué son los archivos PHAR?

Al igual que ocurre con los archivos Java Archive (JAR), en PHP podrás compartir una biblioteca o una aplicación completa como un solo archivo mediante un PHAR.

¿Qué elementos componen un archivo PHAR?

Los archivos PHAR contienen siempre cuatro elementos:

  • Stub
  • Manifest
  • File Contents
  • Signature

Stub

El stub es la primera parte del archivo. Es un programa PHP simple y puede contener cualquier código. El único requisito es que el último comando emitido dentro del stub sea __HALT_COMPILER () :

<?php echo 'STUB!'; __HALT_COMPILER (); ?>

El método para configurar el stub es:

PHAR:: setStub (string$ stub)

Manifest

El Manifest o manifiesto es donde se encuentran los metadatos.

Además, aquí será donde se incluya información sobre el archivo y cada archivo que contenga el PHAR.

Sin embargo, lo más importante de esta parte es que los metadatos se almacenan de forma serializada.

formato de serialización PHAR

Nota: Recuerda que el factor clave en este ataque será la deserialización de los metadatos de cualquier archivo PHAR.

Por ejemplo,

file_get_contents ('phar://./archives/app.phar')

deserializará los metadatos del archivo app.phar .

Para agregar metadatos al archivo deberás utilizar:

PHAR :: setMetadata ( $ metadatos mixtos )

File contents

Los File Contents son los archivos reales incluidos en el archivo y que podrán ser de cualquier tipo. Para agregar archivos al archivo deberás utilizar:

// agrega el archivo especificado por $ ruta al archivo como $ nombre    PHAR :: addFile ( cadena $ ruta , $ nombre )    // agrega $ contenido al archivo como $ nombre    PHAR :: addFromString ( cadena $ nombre , cadena $ contenido )

Signature

La signature o firma es un hash del contenido del archivo.

El archivo PHAR ha de tener siempre una firma válida si se desea acceder al archivo desde PHP.

La firma se agregará automáticamente al crear un PHAR mediante programación.

¿Cómo funcionan los ataques POP?

Si un archivo PHAR llega a estar controlado por el ciberdelincuente esta situación será sinónimo o base de  un ataque POP ya que n atacante podrá agregar cualquier objeto a los metadatos del PHAR si cuenta con los valores establecidos para sus propiedades.

Cuando la operación del archivo agregado (El infectado) PHAR se active dentro de la página web es cuando se producirá la deserialización del PHAR.

Si el objeto definido en los metadatos pertenece a una clase definida en el alcance del programa actual, ese objeto se cargará en el contexto de ese programa.

En PHP existen una clase de métodos llamados «métodos mágicos» que se activan automáticamente cuando ocurre un evento determinado. Nos centraremos en dos de estos dos «métodos mágicos»:

__wakeup() y __destruct() que se activarán cuando un objeto necesite ser anulado en serie o destruido.

Ahora imagínate que el ciber delincuente tiene el archivo PHAR que controla cargado con el malware e inyectado en los metadatos del archivo PHAR. Además, este ciber delincuente sabe que «método mágico» activar cuando pierda el control de la página web o finalice el script malicioso que necesite.

En ese momento el atacante podrá hacer con tu página web lo que quiera.

como funciona un ataque de deserialización PHAR

¿Quieres limpiar tu web hackeada? Te ayudamos.

Te ayudamos a mantener segura tu página web WordPress frente a ciber ataques
¿Necesitas ayuda con la seguridad de tu WordPress?

Deja tu página web en manos de expertos y mantén segura tu página web WordPress frente a ciber ataques

¿Tienes alguna duda?

O escríbenos a hola [@] limpiatuweb [.] com para más preguntas

¡Suscríbete!

Y recibe directamente en tu email cada mes todas las vulnerabilidades en plugins, themes y WordPress