Rumah >pembangunan bahagian belakang >masalah PHP >Analisis ringkas PHP tentang mata pengetahuan struktur penyahserikatan

Analisis ringkas PHP tentang mata pengetahuan struktur penyahserikatan

WBOY
WBOYke hadapan
2022-07-29 15:18:582083semak imbas

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.

Analisis ringkas PHP tentang mata pengetahuan struktur penyahserikatan

(Tutorial yang disyorkan: Tutorial video PHP)

Pengenalan

Tujuan siri adalah untuk memudahkan data Penghantaran dan storan Dalam PHP, pensirilan dan penyahserikan biasanya digunakan untuk caching, seperti caching sesi, kuki, dsb.

Kaedah sihir biasa dalam penyahserialisasian

  • __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

Helah kecil pintasan penyahserialisasian

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*x00abc

<?php
class test{
    protected $a;
    public function __construct(){
        $this->a = &#39;abc&#39;;
    }
    public function  __destruct(){
        echo $this->a;
    }
}
unserialize(&#39;O:4:"test":1:{s:1:"a";s:3:"abc";}&#39;);
bypass_wakeup (CVE-2016-7124)

walaupun tiada

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 = &#39;abc&#39;;
    }
    public function __wakeup(){
        $this->a=&#39;666&#39;;
    }
    public function  __destruct(){
        echo $this->a;
    }
}
memintas beberapa peraturan biasa

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

//a bermaksud objek Desiri (hasil bersiri bermula dengan a, yang tidak menjejaskan pemusnahan $a sebagai elemen tatasusunan)

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 = &#39;abc&#39;;
    }
    public function  __destruct(){
        echo $this->a.PHP_EOL;
    }
}
function match($data){
    if (preg_match(&#39;/^O:\d+/&#39;,$data)){
        die(&#39;you lose!&#39;);
    }else{
        return $data;
    }
}
$a = &#39;O:4:"test":1:{s:1:"a";s:3:"abc";}&#39;;
// +号绕过
$b = str_replace(&#39;O:4&#39;,&#39;O:+4&#39;, $a);
unserialize(match($b));
// serialize(array($a));
unserialize(&#39;a:1:{i:0;O:4:"test":1:{s:1:"a";s:3:"abc";}}&#39;);

Penapisan aksara pintasan heksadesimal

<?php
class test{
    public $a;
    public $b;
    public function __construct(){
        $this->a = &#39;abc&#39;;
        $this->b= &$this->a;
    }
    public function  __destruct(){

        if($this->a===$this->b){
            echo 666;
        }
    }
}
$a = serialize(new test());
O:4: "ujian":2 :{s:4:“

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!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam