phpdestruct
❶ PHP中常用的11個魔術方法
在PHP中,常用的11個魔術方法及其功能概述如下:
__get 和 __set
- __get:用於獲取未聲明的屬性。
- __set:用於設置未聲明的屬性。
- 這兩個方法特別適用於處理私有或受保護屬性的訪問。
__isset 和 __unset
- __isset:用於檢查未定義的屬性是否存在。
- __unset:用於刪除未定義的屬性。
- 這兩個方法也處理私有或受保護屬性的訪問控制。
__call
- 當嘗試調用未聲明的方法時,此方法會被調用。
- 對於實現方法重載或執行自定義行為非常有用。
__autoload
- 自動載入類的功能。
- 當嘗試使用尚未定義的類時,此方法會被調用,允許在類未被直接載入前載入它們。
__construct 和 __destruct
- __construct:構造方法,在實例創建時執行,用於初始化對象。
- __destruct:析構方法,在對象銷毀時執行,用於釋放資源。
__clone
- 在對象復制時,此方法被自動調用。
- 使用clone語句復制對象時,用於執行任何額外的初始化操作。
__toString
- 當嘗試將對象轉換為字元串時,此方法會被調用。
- 確保對象可以被正確顯示。
__sleep 和 __wakeup
- __sleep:在對象序列化前執行,用於清理不需要存儲的對象狀態。
- __wakeup:在反序列化後執行,用於重建任何被序列化時丟失的資源。
__set_state
- 當調用var_export函數時,此方法被調用。
- 用於反序列化對象狀態。
__invoke
- 當嘗試以函數調用方式調用對象時,此方法被自動調用。
- 實現對象作為函數的使用。
__callStatic
- 與__call方法類似,但用於處理靜態方法的調用。
- 確保靜態方法的正確執行。
這些魔術方法極大地增強了PHP類的靈活性和功能,允許開發者以更簡潔的方式實現復雜的功能。在使用時,應確保所有魔術方法都被定義為公共的,以確保它們的正確執行。
❷ PHP反序列化新手入門學習總結
開始學習PHP反序列化的基礎知識,首先要理解序列化和反序列化的過程。序列化是將變數或對象轉換為字元串,便於存儲或跨過程傳遞,而反序列化則是將這些字元串還原為原始的對象或變數。
PHP中,序列化使用serialize()函數,常見的字母標識如'a'代表數組,'b'代表布爾值,'d'代表雙精度浮點數等。在進行實際操作時,例如購買商品的拆包和組裝例子,序列化就像打包,反序列化則是組裝過程。
魔術方法在PHP反序列化中扮演重要角色,如__construct和__destruct用於構造函數和析構函數,__wakeup和__sleep則在unserialize和serialize時觸發。理解這些方法的觸發條件和行為對解題至關重要。
例如,通過SWPUCTF 2021新生賽的ez_unserialize,需要理解構造方法和destruct方法的交互,以及如何利用__wakeup繞過。在[NISACTF 2022]babyserialize中,理解__invoke和__toString的觸發機制是關鍵,通過構造POP鏈進行漏洞利用。
進一步,phar反序列化涉及到了PHP的包裝文件格式,它可以將多個文件合並成一個獨立的壓縮包。通過理解phar文件的結構,特別是stub部分的序列化數據,可以找到利用文件上傳漏洞的方法。
在babyunser phar反序列化挑戰中,需要構造正確的鏈子,如aa::destruct()->zz::toString(),並巧妙地使用write函數訪問不可訪問的屬性,以觸發__get()方法。
對於session反序列化,利用session文件的解析特性,可以構造惡意的序列化字元串,以執行惡意代碼。在ctfshowWEB263的登錄挑戰中,需要理解session文件的處理邏輯和字元過濾規則。
在tricks總結中,提到16進制繞過字元過濾和PHP類名大小寫不敏感,以及+號繞過和利用&使兩值恆等的技巧,這些都是在實際挑戰中的實用策略。
總的來說,PHP反序列化涉及到一系列的技術點,包括序列化規則、魔術方法的使用、文件格式的理解和字元過濾的繞過。通過實際操作和理解這些原理,才能在CTF競賽中解決相關問題。