可以看到题目打开的界面里
注意这里:?file=flag.php;可以联想到文件包含漏洞,然后我们就可以用php://filter协议来查看源文件内容;
构造:php://filter/read=convert.base64-encode/recource=flag.php;
这句话的意思是我们用base64编码的方式来读文件flag.php;这时页面会显示出源文件flag.php经过base64编码后的内容,然后经过base64解码就可以看到flag;
flag{fec4d37c-dd85-43ec-bd42-4c95e44ac35f}
解题完成~
说说其中的原理
php://filter 协议
1是格式
2是可选参数,有read和write,字面意思就是读和写
3是过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开),这也为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php里的代码转换(convert)为base64编码(encode)
4是必选参数,后面写你要处理的文件名
这里举例一个大写(转换)过滤器:string.toupper
?file=php://filter/read=string.toupper/resource=flag.php
如果不写可选参数2(read或write),那么网页会自动匹配一个合适的read或write:
?file=php://filter/convert.base64-encode/resource=flag.php
再说说为什么要先编码后解码
这不是多此一举吗?
认真看解码结果的小伙伴就会发现
flag是个注释
flag前是有\的,如果直接显示源码的话…好吧我还不知道有什么操作可以直接显示源码。就是切合了它的意思Can you find out the flag?找嘛。就这样找。
好的,破案了。
php://filter还可以绕过,大概就是把不希望执行的语句先编码,这个编码类型可以破坏语句的正常执行
(比如base64编码只有64个字符,如果被编码的语句字符在64个字符里找不到对应的,就会忽略,略过它继续编码)
,然后再解码,这样就可以绕过这个语句了。