姿势
题目描述:好多file呀!
代码的功能是检查通过GET请求传递的两个参数"file1"和"file2"。如果这两个参数都存在且非空,它将读取"file2"文件的内容,如果内容等于"hello ctf",则会执行"file1"文件。
解题思路:使file2的内容为hello ctf,这样读取file2之后即可执行file1文件的内容,我们可以构造file1文件的内容为:读取flag.php文件。
这里涉及到PHP伪协议的利用,PHP伪协议可以进行数据过滤和流处理。
基本语法为
php://filter/标准输入输出流标识=过滤器
其中,[标准输入输出流标识] 可以是以下字符串之一:
read: 表示标准输入流(stdin)
write: 表示标准输出流(stdout)
其它文件系统可用流标识符,比如 php://temp (临时流)和 php://memory(内存流)等。
对于file1,我们可以使用 convert.base64-encode 过滤器来读取位于 flag.php 文件中的内容,并将其转换为 base64 编码的形式
对于file2,需要了解什么是数据URI
数据URI(Uniform Resource Identifier),也叫统一资源标识符。数据URI是一种用于在URI中嵌入数据的方案。
在这个例子中,data:// 指示使用数据协议,text/plain 表示数据的MIME类型是纯文本类型,hello%20ctf 是URL编码后的字符串 “hello ctf”。这个数据URI表示一个纯文本字符串 “hello ctf”。
方法一
Payload:
?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=data://text/plain,hello%20ctf
回显如下:
将其base64解码得到:
方法二
知识点扩展:
php://input 是一个 PHP 的内置流(stream)封装器,用于从请求的正文(body)中获取原始的输入数据。
由于file2为纯文本输入,因此我们可以利用该协议并进行POST处理:
同样可得到flag
总结
以上为[CTF/网络安全] 攻防世界 fileclude 解题详析(php伪协议),考察php伪协议及相关GET、POST知识,读者可躬身实践。
我是秋说,我们下次见。
版权归原作者 秋说 所有, 如有侵权,请联系我们删除。