打开靶场代码逻辑如下if(!preg_match(“/\ |/|cat/i”, $c))它过滤了三个关键内容\ (空格)你不能直接在命令中使用空格例如 ls -l 或 cat flag 都会失败。/ (正斜杠)你不能使用路径符号例如 /flag 这种绝对路径会被拦截。cat读取文件的常用命令被禁用了。/i 表示不区分大小写所以 CAT、caT 也不行。/dev/null 21依然存在所以还是需要用分隔符截断且不能看到直接回显我们可以尝试使用换行符%0a强制换行让重定向的内容在下一行不再影响上一行的内容我们先尝试查看当前目录下有什么文件构造flag为?cls%0a发现了当前目录下包含的文件flag.php,所以我们尝试构造payload来读取该文件我们发现cat函数被禁用了但是有很多cat命令过滤有很多命令可以替代 cat 来读取文件内容tac反向列出内容。more / less分页显示。head / tail查看开头或结尾。nl带行号列出内容常用。vi / vim虽然是编辑器但在某些 system 调用中也能读取。sort排序显示。grep搜索读取。我们尝试使用tac来反向列出内容构造的payload为?ctac flag.php%0a得到flag