打开靶机,看到这里,大概就知道是要代码审计了,整体浏览了一下,还涉及反序列化的一些知识。一共要绕过三关,第一关就是file_get_contents。
这里的意思是就是要读一个文件,并且内容为:welcome to the zjctf
知道这个,我们就要考虑怎么来满足条件,考虑我们文件包含里面用到的data协议:
data://text/plain,welcome to the zjctf。构造第一关的payload就是:
?text=data://text/plain,welcome to the zjctf得到的结果就是:
第一关结束,然后我们看第二关,有一个preg_match函数:
大致意思就是会过滤掉flag。但是这个和我们要执行的并没有关系,我们想要执行的在else语句里面,再根据注释,我们先尝试读一下useless.php页面,因为后续是要包含这个页面的。使用php的filter协议,构造的payload为:php://filter/convert.base64-encode/resource=./useless.php
就是:
得到base64编码的useless.php源码,解码以后,发现是:
当然这里的$file='flag.php'是我后续为了序列化给的值,根据提示我们也知道是flag.php然后构造pop链,这个反序列化比较简单,我们只需要触发tostring魔术方法就行了。触发这个方法也很简单,只需要创建一个对象就行,于是就有了下面的obj。输出序列化字符串:
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:
这里需要注意,将我们原本的&file=php://filter/convert.base64-encode/resource=./useless.php改为:&file=useless.php。因为我们已经不需要去读取这个页面的源码了,反而是包含这个页面。