赛后复现

官方wp:https://ctf-show.feishu.cn/docx/IZh0deravoLG66xCrJ6caezNnKc

1、源码

highlight_file(__FILE__);
error_reporting(2);


extract($_GET);
ini_set($name,$value);


system(
"ls '".filter($_GET[1])."'"
);

function filter($cmd){
$cmd = str_replace("'","",$cmd);
$cmd = str_replace("\\","",$cmd);
$cmd = str_replace("`","",$cmd);
$cmd = str_replace("$","",$cmd);
return $cmd;
}

2、题目解析

1.存在extract($_GET);可以变量覆盖,ini_set可以修改php.ini的部分配置信息,filter函数将 ‘ (单引号)、 \ (反斜杠)、` (反引号) 、$ 都替换成空。

2.常规思路是闭合掉 ‘ (单引号),然后利用 ; (分号)执行其他bash命令,但 ‘ (单引号)用不了,无法闭合,因此此方法不行。

3.修改error_log的保存路径为/var/www/html/3.php,利用报错将报错信息写入,在报错信息中包含想要执行的php代码,从而实现getshell。

4.system刚好可以用0字节进行截断来触发异常,在异常中加入php代码。

5.之后访问3.php,即可看到flag。