Artikel ini terutamanya memperkenalkan anda kepada pengetahuan yang berkaitan tentang PHP sebenarnya menukar data kepada struktur data boleh balik Sememangnya, proses terbalik dipanggil penyahserilan. PHP menggunakan dua fungsi untuk mensiri dan menyahsiri data: bersiri memformat objek ke dalam rentetan tertib, dan unserialize memulihkan rentetan kepada objek asal saya harap ia akan membantu semua orang.
(Tutorial yang disyorkan: Tutorial video PHP)
Tujuan siri adalah untuk memudahkan data Penghantaran dan storan Dalam PHP, pensirilan dan penyahserikan biasanya digunakan untuk caching, seperti caching sesi, kuki, dsb.
__wakeup() //Apabila melaksanakan unserialize(), fungsi ini akan dipanggil dahulu
__sleep() //Apabila melaksanakan serialize(), fungsi ini akan dipanggil dahulu
__destruct() //Dicetuskan apabila objek dimusnahkan
__call() //Dicetuskan apabila kaedah tidak boleh diakses dipanggil dalam konteks objek
__callStatic() //Dicetuskan apabila kaedah tidak boleh diakses dipanggil dalam konteks statik
__get() //Kaedah ini akan dipanggil apabila membaca data daripada atribut yang tidak boleh diakses atau jika kunci tidak wujud
__set() // Digunakan untuk menulis data kepada sifat yang tidak boleh diakses
__isset() // Dicetuskan dengan memanggil isset() atau empty() pada sifat yang tidak boleh diakses
__unset () //Dicetuskan apabila menggunakan unset() pada sifat tidak boleh diakses
__toString() //Dicetuskan apabila menggunakan kelas sebagai rentetan
__invoke() //Dicetuskan apabila cuba memanggil objek sebagai fungsi
php7 .1 Penyahserialisasian tidak sensitif kepada atribut kelas
Seperti yang kami katakan sebelum ini, jika pembolehubah dilindungi, hasil bersiri akan didahului oleh x00*x00
tetapi dalam versi tertentu 7.1 atau lebih tinggi Ia tidak sensitif kepada atribut kelas contoh berikut masih akan mengeluarkan versi x00*x00
abc
<?php class test{ protected $a; public function __construct(){ $this->a = 'abc'; } public function __destruct(){ echo $this->a; } } unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');
:
PHP5 < ; 5.6.25
PHP7 < 7.0.10
Kaedah penggunaan: Nilai yang menunjukkan bilangan atribut objek dalam rentetan bersiri adalah lebih besar daripada atribut sebenar Pelaksanaan __wakeup akan dilangkau apabila terdapat Tingkatkan nilai bilangan atribut objek dan laksanakan
Hasil output ialah<?php class test{ public $a; public function __construct(){ $this->a = 'abc'; } public function __wakeup(){ $this->a='666'; } public function __destruct(){ echo $this->a; } }
unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');
666
untuk memadankan sama ada rentetan bersiri. bermula dengan rentetan objek Ini juga merupakan titik ujian yang serupa dalam CTF sebelumnya
Gunakan tanda tambah untuk memintas (perhatikan bahawa apabila menghantar parameter dalam URL, ia mesti dikodkan sebagai +) unserialize('O:4:"test":2:{s:1:"a";s:3:"abc";}');
abc
Gunakan rujukanpreg_match('/^O:d /')
Contoh di atas akan
Ditetapkan sebagai rujukan kepada, anda boleh menjadikan serialize(array(a ) ) ; / / a));//a));
sentiasa sama dengan
<?php class test{ public $a; public function __construct(){ $this->a = 'abc'; } public function __destruct(){ echo $this->a.PHP_EOL; } } function match($data){ if (preg_match('/^O:\d+/',$data)){ die('you lose!'); }else{ return $data; } } $a = 'O:4:"test":1:{s:1:"a";s:3:"abc";}'; // +号绕过 $b = str_replace('O:4','O:+4', $a); unserialize(match($b)); // serialize(array($a)); unserialize('a:1:{i:0;O:4:"test":1:{s:1:"a";s:3:"abc";}}');
<?php class test{ public $a; public $b; public function __construct(){ $this->a = 'abc'; $this->b= &$this->a; } public function __destruct(){ if($this->a===$this->b){ echo 666; } } } $a = serialize(new test());
Atas ialah kandungan terperinci Analisis ringkas PHP tentang mata pengetahuan struktur penyahserikatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!