0x00
在介绍漏洞之前,我们需要去了解一些基本的知识点
1.php://filter
php://filter用于读取网站源码。读取php文件源码内容(直接包含脚本格式文件会解析无法直接获取文件源码)。用法:
?file=php://filter/read=convert.base64-encode/resource=1.php
通常将代码构造成这样,(这里的read可以不用),代码运行成功之后,我们将得到经base64编码后的编码解码就可以了
这里附上常用的解码网站:https://www.qqxiuzi.cn/bianma/base64.htm
2.php://input
是个可以访问请求的原始数据的只读流。(php://input可以读取没有处理过的POST数据)
所以我们可以利用这个伪协议来传输POST请求数据
3.data:URL
data:,<文本数据>
data:text/plain,<文本数据>
data:text/html,<html代码>
data:text/html;base64,<base64编码的html代码>
data:text/css,<css代码>
data:text/css;base64,<base64编码的css代码>
data:text/javascript,<javascript代码>
data:text/javascript;base64,<base64编码的javascript代码>
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据
上面是一些常用的类型,我们可以通过上述的方法将想要的数据导入到文件或是其他当中,在后面我们会有举例
0x01
有了上面的知识,我们可以来做一些简单的题目了:
1.fileclude
进入网站后,映入眼帘的是上述的代码。
我们先来介绍一下file_get_contents()这个函数:
file_get_contents() 是一个 PHP 内置函数,用于以字符串的形式获取指定文件的内容。使用该函数可以读取本地的文件、远程文件和 HTTP 请求的响应等内容。
通过代码审计,我们可以提取出两个关键的信息:
1.我们需要的flag就在flag.php里面
2.我们需要让file2传输的文件的值要为hello ctf
这下就比较好办了,构造如下的payload(建议大家还是手敲代码来加深印象):
?file1=php://filter/convert.base64-encode/resource=flag.php&file2=data://text/plain,hello ctf
为此,我们得到了flag.php文件经过加密的内容,通过解密就可以得到flag了
cyberpeace{1e4ad390cdb6cf3ac37897730e997d25}
2.fileinclude
我们看到这个网页的时候,发现除了flag is in flag.php这句话有用外,就没什么有用的消息了,所以我们查看一下网页源码:
网页源码如上图所示:
在这里我们可以看出:这里是通过传输cookie的值来实现注入的
所以我们只需要构建一下payload就行了:
php://filter/convert.base64-encode/resource=flag.php
在这里将值存入cookie当中,就可以得到base64的编码:
为此,我们成功的获得了flag。