發現在ctf中,關於php幾大魔法函式的考點還是很多的,也是很基礎的,也有很多的安全問題也是這些魔法函式造成的,簡單記錄一下關於魔法函式的理解以及在發現安全過程中遇到後怎麼進行繞過。
1、__wakeup()
__wakeup()是在反序列化操作中起作用的魔法函式,當unserialize的時候,會檢查時候存在__wakeup()函式,如果存在的話,會優先呼叫__wakeup()函式。舉個簡單例子:
<?php
class xctf
}$test = new xctf();
$t = serialize($test);
unserialize($t);
?>
這樣在最後反序列化的時候,直接就呼叫了__wakeup()這個函式:
放上這個ctf原型,簡單記錄一下:
<?php
class xctf
}//?code=
?>
這是題目的**,乙個非常簡單的繞過。在code後面輸入serialize過後的**,然後會進行反序列化,如果呼叫了__wakeup()就會直接退出,所以需要繞過__wakeup()函式。
回到第乙個例子:
他的序列化後的字串是:
o:4:"xctf":1:
裡面有個數字 1 ,這個 1 代表的是物件的屬性個數,這裡只有$flag這乙個屬性。
而__wakeup()函式漏洞就是與物件的屬性個數有關,如果序列化後的字串中表示屬性個數的數字與真實屬性個數一致,那麼i就呼叫__wakeup()函式,如果該數字大於真實屬性個數,就會繞過__wakeup()函式。
2、__construct()
例項化物件時被呼叫。__construct()是建構函式,同時當函式名和類名相同的時候,也是建構函式,建構函式有兩種表達方式。
但是當__construct和以類名為函式名的函式同時存在的時候,__construct將被呼叫,而以類名作為函式名的建構函式不被呼叫。
3、__destruct()
當刪除乙個物件或物件操作終止時被呼叫。
4、__call()
當物件呼叫某個方法的時候,若方法存在,則直接呼叫;若不存在,則會去呼叫__call函式。
5、__get()
讀取乙個物件的屬性時,若屬性存在,則直接返回屬性值;若不存在,則會呼叫__get函式。
6、__set()
設定乙個物件的屬性時,若屬性存在,則直接賦值;若不存在,則會呼叫__set函式。
7、__tostring()
列印乙個物件的時被呼叫。如 echo $obj ,或 print $obj;
8、__clone()
轉殖物件時被呼叫。如:$t=new test(),$t1=clone $t;
9、__sleep()
serialize之前被呼叫。若物件比較大,想刪減一點東東再序列化,可考慮一下此函式。
10、__isset()
檢測乙個物件的屬性是否存在時被呼叫。如:isset($c->name)。
11、__unset()
unset乙個物件的屬性時被呼叫。如:unset($c->name)。
12、__set_state()
呼叫var_export時,被呼叫。用__set_state的返回值做為var_export的返回值。
13、__autoload()
例項化乙個物件時,如果對應的類不存在,則該方法被呼叫。
很多時候關於php魔法函式爆出的安全問題,其實很多都是他們之間的乙個組合的過程中忽略了它們之間的關係而造成的繞過,從而形成的安全問題。
這裡先記錄一下這些魔法函式的作用,關於他們在ctf中,以及在**審計**現的安全問題,後續遇到會再做補充。
文章不足之處請多包涵。
php 魔法函式 autoload
php在魔術函式 autoload 方法出現以前,如果你要在乙個程式檔案中例項化100個物件,那麼你必須用include或者require包含進來100個類檔案,或者你把這100個類定義在同乙個類檔案中 相信這個檔案一定會非常大。但是 autoload 方法出來了,以後就不必為此大傷腦筋了,這個類會...
php5 魔法函式 魔法變數
魔術函式 1。construct 例項化物件時被呼叫,當 construct和以類名為函式名的函式同時存在時,construct將被呼叫,另乙個不被呼叫。2。destruct 當刪除乙個物件或物件操作終止時被呼叫。3。call 物件呼叫某個方法,若方法存在,則直接呼叫 若不存在,則會去呼叫 call...
php魔法函式與魔法常量使用介紹
php 魔術函式 1。construct 例項化物件時被呼叫,當 construct和以類名為函式名的函式同時存在時,construct將被呼叫,另乙個不被呼叫。2。destruct 當刪除乙個物件或物件操作終止時被呼叫。3。call 物件呼叫某個方法,若方法存在,則直接呼叫 若不存在,則會去呼叫 ...