vulnerabilidad pitón deserialización ejecución de código arbitrario

La entrada de blog que introdujo las cadenas de serialización pitón, tuplas, listas y diccionarios

Detalles ver:
secuencia de cadena del pitón, una lista, una secuencia del diccionario, explica la clase

Voy a presentar este blog python反序列化漏洞 任意代码执行

Entonces, ¿cómo deserializar arbitraria de código para ejecutarlo?

Primero en hablar de __reduce__los métodos mágicos,
este método se debe utilizar para indicar cómo la clase de objeto de la secuencia,
cuando vuelve de tipo tupla puede implementar cualquier ejecución de código

Por ejemplo:

import pickle
import os

class Student(object):
    name = 'yuaneuro'
    age = '20'
    def __reduce__(self):
        cmd = "dir"
        return os.system, (cmd,)

y = pickle.dumps(Student())
print(y)
pickle.loads(y)

El resultado:
Aquí Insertar imagen Descripción
Vemos que cuando la ejecución de operaciones de deserialización ejecutado nuestra dircomandos

Nos dará como resultado serializado a cabo el análisis:

b'\x80\x03cnt\nsystem\nq\x00X\x03\x00\x00\x00dirq\x01\x85q\x02Rq\x03.'

explicación:

El uso de \ 03 del coperador introducido ntmódulo de systemfunción de ntmódulo es un osmódulo windowsincorporado en la
q\x00identificación de systemla función memodel área de índice
X\x03\x00\x00\x00detrás de la identificación de dirla longitud de la cadena
q\x01identifica direl índice de la cadena en el área de anotaciones de
\x85establecer un elemento meta grupo, este elemento es una cadena de caracteres precedentes dir
q\x02identifica la tupla en la zona de índice de memo
Rsuperior marcha de identificación del operador en función de la pila (System), y dir es la tupla contiene parámetros pasados a ella como

Podemos comando dir a otras operaciones para lograr la vulnerabilidad deserialización a la ejecución de código arbitrario

Entonces, ¿cómo defenderse contra esas lagunas?

El funcionario también dijo en el documento, el módulo de la salmuera no es seguro, no he ir deserializar datos no confiables.

  • Se puede utilizar una interfaz más avanzada __getnewargs(), __getstate__(), __setstate__()y así en lugar de __reduce__()métodos mágicos
  • Antes de deserializar, para el filtrado estrictos

Final de este artículo

Publicado 10 artículos originales · alabanza ganado 14 · vistas 3709

Supongo que te gusta

Origin blog.csdn.net/yuaneuro/article/details/104732477
Recomendado
Clasificación