

这道题很好,记录一下。
get填写2个变量,变量ac非空,且ac的值等于读取的fn文件内容。所以要么读取服务器上已存在的文件,要么构造一个文件
解题思路一:
dirsearch扫描目录,发现存在/flag.txt ,访问得到文本内容bugku,于是
?/ac=bugku&fn=flag.txt
解题思路二:
看到file_get_contents立刻想到伪协议绕过。
php://input允许读取原始的http post数据流,直接ac=post值即可
?ac=1&fn=php://input

data:// 允许将实际数据直接嵌入到url字符串本身中,而不是提供一个指向外部资源的链接,ac=data://即可
?ac=1&fn=data://,1

data:[<mediatype>][;base64],<data>
将其分解:
-
data:- 协议标识符,固定开头。 -
[<mediatype>]- 可选的媒体类型(MIME type)。例如text/plain,image/png,application/json。这用于说明嵌入数据的类型。如果省略,默认值为text/plain;charset=US-ASCII。 -
[;base64]- 可选的标识符。如果出现,则表示<data>部分是用 Base64 编码的。这是关键所在,因为它允许在数据中安全地使用特殊字符(如<?php ?>)。 -
,- 一个逗号,用于分隔头部和数据部分。 -
<data>- 实际的数据内容。
php://filter读取文件内容
该协议处理器会识别php://filter/...这一部分,并将其后面的resourse=指定的路径作为要读取的文件。可以用来绕过一些路径过滤代码,直接读取文件
最常用的情况是用base64读取
php://filter/convert.base64-encode/resource=/etc/passwd

479

被折叠的 条评论
为什么被折叠?



