Mithilfe von serialize() können Code Objekte als String gespeichert werden. Mit unserialize() wird dies wieder rückgängig gemacht. Die unserialize() Funktion nimmt den serialized String als erste Option entgegen und als zweites ein array, welches alle erlaubten Klassen enthält. Alle klassen, die nicht erlaubt sind werden als __PHP_Incomplete_Class instanziert.
[!info] PHP Magic Methods PHP Magic Methods sind methoden, die das PHP standard Verhalten ändern. Mit ihnen können Standard Aktionen von PHP geändert werden, wenn bestimmte Aktionen ausgeführt werden.
Interessante magic methods sind __wakeup() und __destruct().
Wird ein PHP Objekt serialized werden alle Eigenschaften gespeichert, nicht jedoch die Methoden der Klasse nur der Klassenname. Um ein Objekt zu deserialisieren, muss die Klasse des Objektes im Voraus definiert werden oder automatisch geladen werden. Ist dies nicht der Fall wird das Objekt als __PHP_Incomplete_Class instanziert. Dieses hat keine Methoden, wodurch es nutzlos wird.
Nachdem ein objekt unserialisiert wurde, wird die magic method __wakeup() aufgerufen und ausgeführt. Diese ist dazu da, Resourcen die das Objekt hat zu rekonstruieren. Nachdem das Objekt genutzt wurde, also keine referenz mehr auf das Objekt existiert wird die nächste magic method __destruct() gerufen.
PHAR Dateien
Phar steht für PHP Archive, und ist für die Distribution von mehreren PHP Dateien gedacht, ähnlich eines Archives wie zip. Die Metadaten dieser Phar Dateien werden in einem serialisierten Format gespeichert. Wird eine Datei Operation auf einer Phar Datei ausgeführt, werden die Metadaten unserialisiert. Dadurch ist es möglich PHP objekt injection attacken auszuführen. Erstellung einer Phar Datei:
// some PHP code
$phar = new Phar(‘exploit.phar’); // create phar file// some PHP code
// add a dummy file to stay within phar specifications
$phar->addFromString("test.txt", "test");// add any object as metadata
$phar->setMetadata($object);
phar:// wrapper zu spezifizieren. Die unserialize() Funktion wird dann bei jeder Datei operation, wie file(), file_exist(), file_get_contents(), fopen(), rename(), unlink() und include() ausgelöst.
Phar archive format
- Stub ist ein Code Teil, der ausgeführt wird, wenn auf die Datei in einem ausführbaren Kontext zugegriffen wird. Als Minimum muss der Stub
__HALT_COMPILER()enthalten. Andere Restriktionen gibt es nicht. - Manifest enthält die Metadaten, über das Archiv und seine Inhalte.
- Datei inhalt, enthält die eigentliche Datei im Archiv
- Signatur (Optional) zur Verifizierung der Integrität. Eine Polyglot Datei wird von verschiedenen Checks als gültige Datei erkannt. Dabei kann eine Polyglot Datei gültig für mehrere Formate erkannt werden.
Erstellen einer Phar-JPEG
Da der Stub einer Phar Datei, fast keine Einschränkungen hat, kann dieser dafür genutzt werden um den Check auf eine Bilddatei zu bestehen.