Nuevo ataque de ejecución de código PHP pone en riesgo los sitios con WordPress

WordPress logo
Estándar

Sam Thomas, un investigador de seguridad de Secarma, ha descubierto una nueva técnica de explotación que podría facilitar a los ciberdelincuentes desencadenar vulnerabilidades críticas relacionadas a la deserialización en el lenguaje de programación PHP utilizando funciones consideradas de bajo riesgo.

La nueva técnica deja cientos de miles de aplicaciones web abiertas para ataques remotos de ejecución de código, incluidos sitios web impulsados por algunos sistemas populares de administración de contenido como son WordPress y Typo3.

Las vulnerabilidades de serialización PHP o inyección de objetos se documentaron inicialmente en el año 2009, lo que podría permitir a un atacante realizar diferentes tipos de ataques mediante el suministro de entradas maliciosas a la función PHP unserialize().

Si no lo sabe, la serialización es el proceso de conversión de objetos de datos en una cadena de texto simple y la función unserialize() ayuda a convertir de vuelta la cadena de texto a un objeto.

Thomas descubrió que un atacante puede usar funciones de bajo riesgo contra archivos Phar para desencadenar ataques de deserialización sin requerir el uso de la función unserialize() en una amplia gama de escenarios.

Los archivos Phar, son un formato de archivo de PHP, que almacena los metadatos en un formato serializado, que se extraterminará cuando una función de operación de archivos (fopen, file_exists, file_get_contents, etc.) intente acceder al archivo.

En su documento describiendo esta nueva forma de ataque, Thomas dice lo siguiente:

Esto es cierto tanto para las operaciones de archivos directos (como “file_exists”) como para operaciones indirectas como las que ocurren durante el procesamiento de entidades externas dentro de XML (es decir, cuando se está explotando una vulnerabilidad XXE)

Explotando el ataque de deserialización de PHP contra sitios WordPress.

En un documento detallado publicado en la última conferencia Black Hat en Las Vegas la semana pasada, Thomas demostró cómo este ataque se puede ejecutar contra sitios de WordPress usando una cuenta de autor para tomar el control total sobre el servidor web.

Para una explotación exitosa de la falla, todo lo que un atacante debe hacer es cargar un archivo Phar válido que contenga el objeto de carga maliciosa en el sistema de archivos local del objetivo y hacer que la función de operación de archivo acceda usando el contenedor de flujo “phar://”.

Thomas también reveló en el mismo documento que un atacante puede incluso aprovechar esta vulnerabilidad utilizando una imagen JPEG, originalmente un archivo Phar convertido en JPEG válido al modificar sus primeros 100 bytes para simular una cabecera JPEG.

De la forma descrita anteriormente, una vez que la miniatura JPEG creada se cargó en el servidor de WordPress seleccionado, el atacante puede usar otra función para llamar al mismo archivo de imagen que un archivo Phar utilizando el contenedor de flujo “phar://”, y finalmente ejecuta el código arbitrario cuando el programa deserializa los metadatos.

Esto es lo que Thomas explica sobre esta forma de aprovechar la vulnerabilidad en WordPress usando archivos de imágenes:

La vulnerabilidad existe debido a la deserialización insegura de los datos pasados como un archivo de imagen y luego se ejecuta mediante el contenedor de flujo ‘phar://’ dentro de la función ‘wp_get_attachment_thumb_file’ en el script ‘/wpincludes/post.php’ “, dice un aviso.

Un atacante autenticado remoto con la capacidad de crear / editar publicaciones puede cargar una imagen maliciosa y ejecutar código PHP arbitrario en un sistema vulnerable.

Thomas ha informado sobre esta vulnerabilidad al equipo de seguridad de WordPress a principios del año pasado y aunque la compañía reconoció la existencia del problema. Sin embargo, el parche lanzado por la compañía no resolvió el problema por completo.

Thomas también informó sobre esta\ vulnerabilidad a los desarrolladores de Typo3 el 9 de junio de 2018 y afortunadamente el problema fue solucionado en las versiones 7.6.30, 8.7.17 y 9.3.