这是一道非常典型的 PHP 伪协议绕过LFI/文件包含 类型的 CTF 题目。代码的核心目的是让你读取到服务器上的某个文件但它设置了严格的过滤。if(!is_file($file)){highlight_file(filter($file));}else{echohacker!;}逻辑反转 注意这里的 !取反。代码要求 is_file($file) 必须返回 false 才能进入文件读取的分支含义 如果你直接传入一个真实存在的文件路径例如 fileflag.phpis_file() 会返回 true取反后变成 false直接触发 echo “hacker!”;突破思路 我们需要传入一个既能让 is_file() 检查给定路径是否为一个常规文件认为是目录或不存在的路径但又能被 highlight_file() 正常解析并读取的特殊字符串if(preg_match(/compress|root|zip|convert|\.\.\/|http|https|data|data|rot13|base64|string/i,$file)){die(hacker!);}并且对输入的内容进行正则过滤这里php://filter过滤器有部分被限制但是在旧版本或特定环境的 PHP 中有些过滤器不需要显式写 convert.或者可以用特殊组合所以我们尝试构造payload?filephp://filter/resource./flag.php为什么能成功绕过 is_file() 代码中的第一道关卡是if(!is_file($file)){// 必须让 is_file 返回 false 才能进去highlight_file(filter($file));}在 PHP 中is_file() 是用来检查一个本地常规文件是否存在的函数。当你传入 $file “php://filter/resource./flag.php” 时is_file() 无法直接识别 php:// 这种内存伪协议流为一个普通的本地磁盘文件。对于这种流或伪协议路径is_file() 拿不到标准的操作系统文件状态因此会直接返回 false。!false 变成了 true成功顺理成章地进入了 if 分支内部为什么 highlight_file() 依然能读到文件进入分支后代码执行highlight_file(filter($file));虽然 is_file() 不认伪协议但 PHP 的文件包含和读取函数如 highlight_file()、include、file_get_contents()却原生支持 PHP 伪协议包装器Wrappers。当 highlight_file() 接收到 php://filter/resource./flag.php 时PHP 底层会这样处理解析协议识别出 php://filter 协议知道这是一个过滤器流。定位资源看到 resource./flag.phpPHP 包装器会在底层把它解析为当前目录下的 flag.php 文件。读取并高亮尽管没有使用 base64 等编码过滤器这个协议的本质依然是“去读取 resource 指定的文件”。所以它会直接把 flag.php 的源码读取出来并通过 highlight_file() 以高亮文本的形式渲染在屏幕上