<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>
文件包含:开发人员一般会把重复使用的函数写到单个文件中,当需要使用这个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。那正常来说包含的文件是固定的、写死的就不会存在文件包含漏洞,但是这样的话又不够便捷,所以开发人员为了使代码调用更加灵活,就会将被包含的文件设置为变量,用来进行动态调用。但正是由于这种灵活性,允许用户从客户端提交一个变量值来作为文件包含的变量值,当这个值是段恶意代码时,并且服务端又没有对用户的输入进行一个很好的过滤,就会造成文件包含漏洞。
实现文件包含功能的函数:include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readline。
本题利用filename参数带一段恶意代码进去,然后include函数执行恶意代码进而找到flag。不过会遇到很多过滤,要想办绕过去。
源码分析:
没什么好说的
简单补充一下:
- " . " 表示当前目录
- " .. " 表示当前目录的上一级目录。
- " ./ " 表示当前目录下的某个文件或文件夹,视后面跟着的名字而定
- " ../ " 表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定
URL 链接中 井号#、问号?、连接符& 分别有什么作用?_url里的问号-CSDN博客
文件包含一般都想到伪协议
伪协议种类
php://input:用于访问请求的原始POST数据。这在处理非表单编码的数据(如JSON、XML等)时非常有用。
php://output:用于将数据写入输出流,通常用于动态生成文件或发送数据到客户端。
php://filter:用于对读取的数据应用一系列过滤器。例如,你可以使用此伪协议来读取并转换文件的编码或进行压缩/解压缩操作。
file://:用于访问本地文件系统中的文件。通过此伪协议,你可以直接操作本地文件,如读取、写入等。
http:// 和 https://:用于发送HTTP请求并获取远程资源的内容。这可以用于获取远程网页的HTML内容或发送POST请求等。
ftp://:用于访问和操作FTP服务器上的文件。通过此伪协议,你可以实现与FTP服务器的交互,如上传、下载、删除文件等
PHP伪协议总结 - 个人文章 - SegmentFault 思否
尝试一些poc
filename=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpPz4=
是一个 data:
URL,它用于嵌入小文件内容在URLs中。这里的内容是Base64编码的,并且表示一个文本文件。
data:
- 表示这是一个data URL。text/plain
- 表示文件的内容是纯文本。base64
- 表示接下来的内容是用Base64编码的。
Base64编码的内容 PD9waHAgc3lzdGVtKCJscyIpPz4=
解码后是 <?php system("ls");?>
。
php://filter,用于读取源码,?filename=php://filter/read=convert.base64/resource=/etc/passwd
URL 参数表示尝试通过 PHP 的 php://filter
流来读取 /etc/passwd
文件的内容,并将内容以 Base64 编码的形式返回。这里,/etc/passwd
是一个常见的 Unix/Linux 系统文件,它包含了系统上所有用户的基本信息。
php://filter
:这是 PHP 的流封装器,用于应用过滤器到流。read=convert.base64
:这是应用的过滤器,表示读取流的内容并将其转换为 Base64 编码。resource=/etc/passwd
:这指定了要读取的文件的路径,即/etc/passwd
php://filter的各种过滤器_php://filter过滤器种类-CSDN博客
用 convert.iconv.[]
过滤器绕过,[]
中支持以下字符编码(* 表示该编码也可以在正则表达式中使用)
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
...
\\具体支持的编码可见php官方文档
\\https://www.php.net/manual/zh/mbstring.supported-encodings.php
依次遍历