[Práctica de prueba de penetración] ¿Qué puertas traseras tiene el lenguaje PHP? y como usar

contenido

 Puerta trasera

 Puerta trasera compuesta de php.ini

 Puerta trasera de PHP compuesta por archivos .user.ini

 deserializar

 Implementación de serialización de PHP

 procesadores comunes

 formato de serialización

 privado与proteger

 Vulnerabilidad de deserialización de PHP

 punto de uso

 Uso nativo de SoapClient

 Archivo zip

 Sesión

 CVEs relacionados

 CVE-2016-7124


Todo bien. clase, clase

Puerta trasera

 Puerta trasera compuesta de php.ini

利用 auto_prepend_file 和 include_path

 Puerta trasera de PHP compuesta por archivos .user.ini

.user.ini se ejecuta en todos los servidores que ejecutan fastcgi.

El método de uso es el mismo que php.ini

 deserializar

 Implementación de serialización de PHP

 procesadores comunes

Hay varios tipos de procesamiento de serialización en PHP, a saber, php, php_serialize, php_binary y WDDX (el soporte debe estar habilitado en tiempo de compilación). El valor predeterminado es php, que se puede session.serialize_handlermodificar .

Si PHP se compila con compatibilidad con WDDX, solo se puede usar WDDX. WDDX está obsoleto desde PHP 7.4. php_serialize está disponible desde PHP 5.5.4. php_serialize simplemente usa las funciones serializar/deserializar directamente internamente y no tiene las limitaciones que tienen php y php_binary.

El formato del procesador PHP es: nombre clave + barra vertical + valor serializado por la función serialize().

El formato del procesador php_binary es: el carácter ASCII correspondiente a la longitud del nombre de la clave + el nombre de la clave + el valor serializado por la función serialize().

El formato del procesador php_serialize es: una matriz serializada por la función serialize().

 formato de serialización

La implementación de php_serialize está php-src/ext/standard/var.cen , la función principal es php_var_serialize_intern, el formato serializado es el siguiente:

boolean

    b:<value>;
    b:1; // true
    b:0; // false

integer

    i:<value>;

double

    d:<value>;

NULL

    N;

string

    s:<length>:"<value>";
    s:1:"s";

array

    a:<length>:{key, value};
    a:1:{s:4:"key1";s:6:"value1";} // array("key1" => "value1");

object

    O:<class_name_length>:"<class_name>":<number_of_properties>:{<properties>};

reference

    指针类型
    R:reference;
    O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}
    $a = new A();$a->a=1;$a->b=&$a->a;

 privado与proteger

A diferencia de las variables de protección y las variables públicas, las privadas no se pueden configurar directamente.

Solo se puede acceder a la propiedad privada dentro de la clase en la que está definida y no se heredará Agregar el nombre de la clase antes de que la propiedad se %00className%00use para indicar que es privada.

Se puede acceder al atributo protegido en la clase principal y la clase secundaria, y se agrega la variable %00*%00para marcarlo como protegido.

 Vulnerabilidad de deserialización de PHP

__wakeupPHP llamará a la función / etc al deserializar __sleep, lo que puede causar problemas como la ejecución del código. Si no hay una función relacionada, el destructor relacionado también se llamará al destruir, lo que también provocará la ejecución del código.

También se pueden utilizar otras __toString/ dos funciones.__call

Entre __wakeupellos , se activa cuando se deserializa, se activa __destructcuando se activa GC, se activa __toStringcuando se activa el eco y se activa __callcuando se llama a una función indefinida.

A continuación se proporciona una demostración simple.

class Demo
{

    public $data;

    public function __construct($data)
    {
        $this->data = $data;
        echo "construct<br />";
    }

    public function __wakeup()
    {
        echo "wake up<br />";
    }

    public function __destruct()
    {
        echo "Data's value is $this->data. <br />";
        echo "destruct<br />";
    }
}

var_dump(serialize(new Demo("raw value")));

producción

construct
Data's value is raw value.
destruct
string(44) "O:4:"Demo":1:{s:4:"data";s:9:"raw value";}"

Después de modificar la cadena serializada, ejecute

unserialize('O:4:"Demo":1:{s:4:"data";s:15:"malicious value";}');

producción

wake up
Data's value is malicious value.
destruct

Aquí puede ver que el valor ha sido modificado.

Lo anterior es unserialize()una aplicación simple de No es difícil ver que si __wakeup()o __desturct()tiene operaciones sensibles, como leer y escribir archivos y operar bases de datos, el comportamiento de lectura y escritura de archivos o lectura de datos se puede realizar a través de funciones.

Entonces, __wakeup()¿ agregar un juicio puede prevenir esta vulnerabilidad? En __wakeup()el añadimos una línea de código.

public function __wakeup()
{
    if($this->data != 'raw value') $this->data = 'raw value';
    echo "wake up<br />";
}

Pero, de hecho, aún se puede omitir. Hay vulnerabilidades de activación en las versiones PHP5 < 5.6.25 y PHP7 < 7.0.10. Cuando el número de objetos en deserialización no es igual al número anterior, se omitirá la reactivación, por lo que se utiliza la siguiente carga útil

unserialize('O:7:"HITCON":1:{s:4:"data";s:15:"malicious value";}');

producción

Data's value is malicious value.
destruct

Aquí se omite la activación y el valor aún se modifica.

 punto de uso

 Uso nativo de SoapClient

La clase SoapClient en php puede crear paquetes de datos de jabón. En el modo no wsdl, cuando la instancia de SoapClient se deserializa, realizará una solicitud de jabón a la URL especificada por el segundo parámetro. Esta característica se puede usar para SSRF.

 Archivo zip

ZipArchive::open()Si el parámetro de bandera en la clase nativa de php se establece en ZipArchive::OVERWRITE, el archivo especificado se eliminará Esta característica se puede usar para eliminar archivos bajo ciertas condiciones.

 Sesión

Las sesiones en PHP se almacenan como archivos de forma predeterminada. Los archivos se nombran con sess_sessionid. Cuando la sesión es controlable hasta cierto punto, la deserialización se puede activar a través de la sesión.

 CVEs relacionados

 CVE-2016-7124

Antes de PHP 5.6.25 y antes de 7.0.10, cuando el número de propiedades (variables) de un objeto es mayor que el número real, __wakeup()no se ejecutará.

 【Recomendación de recursos】

combate pitón

[Código fuente completo de 30 casos de desarrollo real de desarrollo de pygame]

[columna de desarrollo de juegos pygame, obtenga el código fuente completo + tutorial]

Recomendación de estudio oficial de CSDN ↓ ↓ ↓

  • El mapa de conocimiento completo de Python de CSDN es demasiado sólido, ¡se lo recomiendo a todos!

 

Supongo que te gusta

Origin blog.csdn.net/weixin_42350212/article/details/123191022
Recomendado
Clasificación