一、源码
<?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";
}
}
二、解题步骤
- 主需要把
public $isVip=true
即可。
- 主要代码如下,当
$this->username===$u、$this->password===$P
,之后就会将$this->isVip=true
。
public function login($u,$p){
if($this->username===$u&&$this->password===$p){
$this->isVip=true;
}
- 也就可以触发以下代码,判断
$this->isVip
是否为真,然后输出flag。
public function vipOneKeyGetFlag(){
if($this->isVip){
global $flag;
echo "your flag is ".$flag;
}else{
echo "no vip, no flag";
}
}
三、payload
- 直接GET传入,
/?username=xxxxxx&password=xxxxxx