CTFHub_技能樹_文件上傳


文件上傳

無限制

UPload_0_1

直接上傳一句話后門,使用蟻劍連接:

UPload_0_2

獲得flag:

UPload_0_3

前端驗證

嘗試直接上傳后門,發現被攔截,經過判斷為Javascript前端驗證:

UPload_1_1

這里可以使用Firefox瀏覽器插件禁用頁面js代碼,或者使用burp suite繞過前端驗證。

這里展示如何使用burp suite繞過前端驗證

UPload_1_3

先將文件名改為1.jpg,上傳時通過burp suite將文件名修改為1.php,即可繞過驗證。

UPload_1_2

使用蟻劍獲得flag。

.htaccess

.heaccess是什么

​ .htaccess文件(或者"分布式配置文件")提供了針對目錄改變配置的方法, 即,在一個特定的文檔目錄中放置一個包含一個或多個指令的文件, 以作用於此目錄及其所有子目錄。作為用戶,所能使用的命令受到限制。

​ 概述來說,htaccess文件是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配置。通過htaccess文件,可以幫我們實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。

​ 簡單來說,就是我上傳了一個.htaccess文件到服務器,那么服務器之后就會將特定格式的文件以php格式解析。

.htaccess漏洞利用

//方法一
SetHandler application/x-httpd-php  	//所有的文件當做php文件來解析
//方法二
AddType application/x-httpd-php .jpg	//.jpg文件當作php文件解析

題解過程

構造.htaccess文件並上傳。

UPload_2_1

上傳一句話后門,使用蟻劍類工具連接,獲得flag:

UPload_2_2

MIME驗證

MIME是什么

​ 多用途互聯網郵件擴展類型。它設計的最初目的是為了在發送電子郵件時附加多媒體數據,讓郵件客戶程序能根據其類型進行處理。然而當它被HTTP協議支持之后,它的意義就更為顯著了。它使得HTTP傳輸的不僅是普通的文本,而變得豐富多彩。

每個MIME類型由兩部分組成,前面是數據的大類別,例如聲音audio、圖象image等,后面定義具體的種類。

常見的MIME類型

超文本標記語言文本 .html text/html
普通文本 .txt text/plain
GIF圖形 .gif image/gif
JPEG圖形 .jpeg,.jpg image/jpeg

​ 服務端MIME類型檢測是通過檢查http包的Content-Type字段中的值來判斷上傳文件是否合法的。那就好辦了,不管我上傳什么類型的文件,我只要修改Content-Type字段來讓檢測通過就行了。

題解過程

上傳php文件,提示:

UPload_4_0

查看源代碼,發現沒有前端驗證,猜測為MIME驗證。

修改Content-Type

UPload_4_1

上傳成功:

UPload_4_2

使用蟻劍連接,得到flag

UPload_4_3

文件頭檢測

上傳php文件,顯示錯誤,提示如下:

UPload_3_1

修改MIME為jpg格式上傳:

UPload_3_2

顯示錯誤,提示如下:

UPload_3_5

猜測應該是對文件內容檢測。

制作圖片馬:

copy 原圖片.jpg/b + 后門.php/a 圖片馬.php
b表示二進制文件
a表示ASCII碼文件

UPload_3_3

使用蟻劍連接,得到flag

UPload_3_4

00截斷

詳細內容查看這篇文章

00截斷原理

​ 0x00是十六進制表示方法,是ascii碼為0的字符,在有些函數處理時,會把這個字符當做結束符。這個可以用在對文件類型名的繞過上。

00截斷的利用方法

我以前以為所謂00截斷就是在文件名中加%00進行截斷,但這種方式是不對的,為什么呢?比如攻擊者構造文件名:admintony.php%00a.jpg,在提取后綴名的時候遇到%00則認為字符串結束了,那么他提取到的后綴名會是.php.php后綴又不允許上傳所以上傳失敗了。

​ 應該在數據包中必須含有上傳后文件的目錄情況才可以用,比如數據包中存在path: uploads/,那么攻擊者可以通過修改path的值來構造paylod: uploads/aa.php%00

​ 為什么修改path才可以,因為程序中檢測的是文件的后綴名,如果后綴合法則拼接路徑和文件名,那么攻擊者修改了path以后的拼接結果為:uploads/aaa.php%00/2018051413370000.php,移動文件的時候會將文件保存為uploads/aaa.php,從而達到Getshell效果。

題解過程

上傳php文件,進行測試

UPload_5_1

發現url中包含上傳路徑,猜測是文件名拼接在目錄名后再進行后綴的驗證。

使用00截斷,%00是被服務器解碼為0x00發揮了截斷作用

UPload_5_2

蟻劍,flag:

UPload_5_3

源碼分析

<?php
header("Content-type: text/html;charset=utf-8");
error_reporting(0);

//設置上傳目錄
define("UPLOAD_PATH", dirname(__FILE__) . "/upload/");
define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH));

if (!file_exists(UPLOAD_PATH)) {
    mkdir(UPLOAD_PATH, 0755);
}

if (!empty($_POST['submit'])) {
    $name = basename($_FILES['file']['name']);
    $info = pathinfo($name);
    $ext = $info['extension'];
    $whitelist = array("jpg", "png", "gif");
    if (in_array($ext, $whitelist)) {
        $des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
        if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
            echo "<script>alert('上傳成功')</script>";
        } else {
            echo "<script>alert('上傳失敗')</script>";
        }
    } else {
        echo "文件類型不匹配";
    }
}

?>
basename(path,suffix)  //函數返回路徑中的文件名部分。
參數 描述
path 必需。規定要檢查的路徑。
suffix 可選。規定文件擴展名。如果文件有 suffix,則不會輸出這個擴展名。
pathinfo() 	//返回一個關聯數組包含有 path 的信息。

<?php
print_r(pathinfo("/testweb/test.txt"));
?>
/*
Array
(
[dirname] => /testweb
[basename] => test.txt
[extension] => txt
)
*/

將上傳的文件統一重新命名,在這里發生了截斷,實現了攻擊。

雙寫后綴

$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);

代碼僅將黑名單替換為空白,只需要構造:.pphphp,就可以繞過。

上傳后門,蟻劍,flag


免責聲明!

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



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