3. CTFshow 反序列化 web254

一、源码

<?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;
    }
    public function login($u,$p){  
        if($this->username===$u&&$this->password===$p){  # 3.1 如果username=u,password=p会将isVip设置为真
            $this->isVip=true;
        }
        return $this->isVip;
    }
    public function vipOneKeyGetFlag(){  
        if($this->isVip){  # 5.1 isVip为真,就会输出flag值。
            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 = new ctfShowUser();  	   # 2. 然后实例化ctfShowUser()类
    if($user->login($username,$password)){ # 3. 将username和password传入对象user里的login函数,并判断user对象里的login函数是否为真。
        if($user->checkVip()){  	   # 4. 判断对象user里的checkVip函数是否为真,在第三步的时候已经将siVip设置为真。
            $user->vipOneKeyGetFlag();     # 5. 判断对象user里的vipOneKeyGetFlag()函数是否为真。
        }
    }else{
        echo "no vip,no flag";
    }
}

二、解题步骤

  1. 主需要把public $isVip=true 即可。
  2. 主要代码如下,当$this->username===$u、$this->password===$P,之后就会将$this->isVip=true
    public function login($u,$p){  
        if($this->username===$u&&$this->password===$p){
            $this->isVip=true;
        }
  1. 也就可以触发以下代码,判断$this->isVip 是否为真,然后输出flag。
    public function vipOneKeyGetFlag(){  
        if($this->isVip){
            global $flag;
            echo "your flag is ".$flag;
        }else{
            echo "no vip, no flag";
        }
    }

三、payload

  1. 直接GET传入,/?username=xxxxxx&password=xxxxxx
posted @ 2023-02-01 14:28  LuckMeteor  阅读(66)  评论(0编辑  收藏  举报