[极客大挑战 2019]Secret File
题目
分析
不难,可以看出进行了多次链接跳转
但是,没有找到我们想要的东西!
猜测中间有个很快的跳转,重定向或者直接跳转
Archive_room.php --> action.php --> end.php
验证
根据提示下一步、分别访问secr3t.php和flag.php:
解题
没有其他猫腻了、由此可见、在前端找不到flag
stristr()函数搜索字符串在另一字符串中的第一次出现。
strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE,区分大小写。
file:// — 访问本地文件系统、文件系统 是 PHP 使用的默认封装协议,展现了本地文件系统。 当指定了一个相对路径(不以/、\、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。 在很多情况下是脚本所在的目录,除非被修改了。 使用 CLI 的时候,目录默认是脚本被调用时所在的目录
php:// — 访问各个输入/输出流(I/O streams)
php://input 是个可以访问请求的原始数据的只读流。php://filter 是一种设计用来允许过滤器程序在打开时成为流的封装协议。这对于单独具有完整功能的文件函数非常有用,否则就没有机会在读取内容之前将过滤器应用于流之上。
参数 功能 read 读取 write 写入 resource 数据来源
审计代码,回到secr3t.php,尝试构造payload来获取flag
http://64406e9c-7d5f-49d4-b917-80321f5d26e6.node3.buuoj.cn/secr3t.php?file=php://filter/resource=flag.php
失败+1
重新构造、原理请查看资料部分过滤器
成功+1
flag进行base64解码==>> $flag = ‘flag{8925bb03-bca4-4039-9b8f-6e734b4bd772}’;
资料
要注意,先把php.ini的allow_url_fopen
和allow_url_include
设置为On,不然会影响伪协议的使用
php://
php:// — 访问各个输入/输出流(I/O streams)
php://input
访问请求的原始数据的只读流
php://input可以获取到POST的数据,这一点在CTF中常常用到。
php://output
只写的数据流
php://output允许你以
echo
一样的方式 写入到输出缓冲区。
php://filter
重点来了,php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。
我们先看看它的语法:
resource=<要过滤的数据流> //这个参数是必须的。它指定了你要筛选过滤的数据流。 read=<读链的筛选列表> //该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 write=<写链的筛选列表> //该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 <;两个链的筛选列表> //任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
我们平时是这样利用它来读取任意文件的:
php://filter/read=convert.base64-encode/resource=flag.php
在这个payload里,
convert.base64-encode
就是一个过滤器,而flag.php就是要过滤的数据流,也就是要读取的文件。转换过滤器 convert.*
convert.* 是PHP 5.0.0 添加的,作用顾名思义就是转换==
base64
convert.base64-encode和 convert.base64-decode使用这两个过滤器等同于分别用 base64_encode()和 base64_decode()函数处理所有的流数据。
字符串过滤器 string.*
这个过滤器的作用是对字符串进行各种转换。
有加密的,转换大小写的等等。