1. 程式人生 > 實用技巧 >CTF-WEB:檔案上傳

CTF-WEB:檔案上傳

目錄

檔案上傳

一句話木馬

利用檔案上傳漏洞往目標網站中上傳一句話木馬,然後就可以在本地獲取和控制整個網站目錄。利用一句話木馬進行入侵時需要滿足木馬上傳成功未被查殺,知道木馬的路徑在哪並保證上傳的木馬能正常執行。一個簡單的 PHP 一句話木馬如下:

<?php @eval($_POST['flag']) ?>

@ 表示後面即使執行錯誤也不報錯,eval()函式表示括號內的語句字串什麼的全都當做程式碼執行,$_POST['flag']表示從頁面中獲得 flag 這個引數值。

上傳過濾

為了使得網頁不容易被攻擊,網頁經常需要通過一些手段來過濾不希望接收的檔案。首先是 multipart/form-data 過濾

,該過濾需要在表單中進行檔案上傳時,就需要使用該格式,意思是他通過表單會對檔案格式再進行一次判斷,並會在後端進行判斷。這種過濾只支援小寫字元,因此繞過方法為將抓到的包中的 Content-Type 欄位中的 “multipart/form-data” 中隨便一個字母改為大寫。
第二是檔案型別過濾,為了不讓使用者隨便傳些檔案,只是要讓使用者上傳圖片時,就可以限制只能上傳圖片。還有一種是檔案字尾名過濾,例如字尾名是 “.php” 的檔案都攔截不能上傳,如果是在解題的情況下可以嘗試用 PHP 其他字尾進行上傳例如:php2, php3, php4, php5,phps, pht, phtm, phtml。

webshell

當網頁已經上傳過一句話木馬時,說明可以利用該木馬連線到網頁上,例如下面這個網頁。

“web” 的含義是顯然需要伺服器開放 web 服務,“shell” 的含義是取得對伺服器某種程度上操作許可權。webshell 常常被稱為入侵者通過網站埠對網站伺服器的某種程度上操作的許可權,可以使用蟻劍或者菜刀等工具進行提權。以蟻劍為例,開啟蟻劍後右鍵選擇新增資料。

然後填入需要提權的網頁 url,以及一句話木馬的連線密碼。

新增之後可以右鍵進行一系列操作,例如可以檢視網頁的檔案,選擇檔案管理。

之後就可以檢視並操作網頁的檔案了,例如這個網頁的 html 目錄下就有 flag。

例題:求 getshell

開啟網頁,這個明顯是檔案上傳漏洞,題目要求傳入一個圖片,不能是 php。

這是字尾名黑名單檢測,注意到使用了 multipart/form-data,所以通過對請求頭中的 Content-Type 進行大小寫繞過,將 multipart/form-data 隨便一個字母改成大寫。然後這個網頁只能上傳檔案,因此把 Content-Type 欄位的值改為 “image/jpeg”。最後還有個副檔名過濾,測試後發現 “.php5” 字尾沒有被過濾。綜上所述檔案上傳的包修改如下,上傳獲得 flag。

例題:upload1

開啟網頁,看到一個檔案上傳的按鈕,考慮上傳一句話木馬之後用蟻劍連線。

首先先看一下原始碼,原始碼會對傳入的檔案的型別進行過濾,也就是說如果傳的不是圖片,上傳按鈕會被禁用並彈窗報錯。

Array.prototype.contains = function (obj) {  
    var i = this.length;  
    while (i--) {  
        if (this[i] === obj) {  
            return true;  
        }  
    }  
    return false;  
}  

function check()
{
    upfile = document.getElementById("upfile");
    submit = document.getElementById("submit");
    name = upfile.value;
    ext = name.replace(/^.+\./,'');      //刪除檔案的名稱

    if(['jpg','png'].contains(ext))      //檢查字尾是否為 jpg 或 png
    {
        submit.disabled = false;
    }
    else
    {
        submit.disabled = true;
        alert('請選擇一張圖片檔案上傳!');
    }
}

由此可見過濾是在前端,我們只需要繞過前端的過濾就照樣能提交一句話木馬。先將一句話木馬的字尾名改為 jpg,然後上傳到網頁。接著按上傳按鈕,然後用 Burp 抓包,修改檔名的字尾為 “.php”。

上傳成功後會返回一個檔名,直接訪問是沒有用的,使用蟻劍進行連線。


連線之後在 html 目錄下有個 flag.php,開啟就能看到 flag 了。