首先了解一下一些魔術方法
__construct(), __destruct(), __call(), __callstatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __tostring(),
__invoke(), __set_state(), __clone() 和 __debuginfo() 等方法在 php 中被稱為魔術方法(magic methods)。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術功能
注意:php 將所有以 __(兩個下劃線)開頭的類方法保留為魔術方法。所以在定義類方法時,除了上述魔術方法,建議不要以 __ 為字首。
__sleep() 和 __wakeup()
public __sleep ( void ) : array
__wakeup ( void ) : void
serialize() 函式會檢查類中是否存在乙個魔術方法 __sleep()。如果存在,該方法會先被呼叫,然後才執行序列化操作。此功能可以用於清理物件,
並返回乙個包含物件中所有應被序列化的變數名稱的陣列。如果該方法未返回任何內容,則 null 被序列化,並產生乙個 e_notice 級別的錯誤。
note:
(1)__sleep() 不能返回父類的私有成員的名字。這樣做會產生乙個 e_notice 級別的錯誤。可以用 serializable 介面來替代。
(2)__sleep() 方法常用於提交未提交的資料,或類似的清理操作。同時,如果有一些很大的物件,但不需要全部儲存,這個功能就很好用。
(3)與之相反,unserialize() 會檢查是否存在乙個 __wakeup() 方法。如果存在,則會先呼叫 __wakeup 方法,預先準備物件需要的資源。
(4)__wakeup() 經常用在反序列化操作中,例如重新建立資料庫連線,或執行其它初始化操作。
訪問控制
__wakeup()是用在反序列化操作中。unserialize()會檢查存在乙個__wakeup()方法。如果存在,則先會呼叫__wakeup()方法。
class
xctf
?code=
**中__wakeup()方法如果使用就是和unserialize()反序列化函式結合使用,這裡沒有序列化字串,那我們就對這個類進行序列化。
得到如下
o:4:"xctf":1:
所以我們要反序列化xctf類還要同時繞過__wakeup()方法的執行(如果繞不過的話,那麼將輸出bad requests指令碼),那麼就要修改序列化字串的屬性個數;當我們將上述的序列化字串中的物件屬性個數由真實值從1修改到2
xctf類後面有乙個1,整個1表示的是xctf類中只有1個屬性 __wakeup()漏洞就是與序列化字串的整個屬性個數有關。當序列化字串所表示的物件, 其序列化字串中屬性個數大於真實屬性個數時就會跳過__wakeup的執行,從而造成__wakeup()漏洞
攻防世界mfw 攻防世界 Web mfw
題目資訊 image.png 工具 githack,dirsearch 知識點 git漏洞 審計 開啟題目場景,檢查 發現這樣乙個頁面 image.png 訪問.git目錄,疑似存在git原始碼洩露 image.png 再用dirsearch掃瞄,發現git原始碼洩露 使用 githack獲取原始碼...
攻防世界Web lottery
開心!雖然第一次遇到git原始碼洩露寫了好久,但是寫出來了就很開心 開啟介面我們知道,要拿到flag,就要贏到足夠的錢,其實一開始我以為可以找到乙個地方直接修改餘額什麼的,把網頁源 中的檔案看了幾個都沒發現突破口 然後又沒思路了 嘗試了一下robots.txt,想看看有沒有什麼檔案,然後發現了 瞬間...
攻防世界 xctf Guess writeup
本題的解析官網上有,這裡是乙個自動化的指令碼,完成的是自動上傳乙個ant.jpg的檔案 ant.jpg是乙個ant.zip壓縮包重新命名的檔案,裡面是乙個ant.php的一句話木馬 執行返回的是在web後台這個檔案重新命名後的檔案的url。可通過zip偽協議訪問這個木馬。指令碼如下 import r...