[ZJCTF 2019]NiZhuanSiWei1

打开靶机,看到这里,大概就知道是要代码审计了,整体浏览了一下,还涉及反序列化的一些知识。一共要绕过三关,第一关就是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。因为我们已经不需要去读取这个页面的源码了,反而是包含这个页面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值