CTF文件上傳

一、CTF文件上傳漏洞

CTF文件上傳漏洞是指在網站文件上傳功能中,未對用戶上傳的文件類型、大小、路徑進行限制,或者對用戶上傳的文件沒有做充分的過濾和檢查,從而導致攻擊者可以上傳一些惡意文件(如WebShell)或進行目錄遍歷等攻擊行為,最終達到獲取系統許可權、敏感信息或非法操作等目的。

攻擊者可以通過上傳惡意腳本實現以下攻擊:

  • 網站藉此被攻擊者利用,例如進行DDoS攻擊、挖礦等
  • 攻擊者注入WebShell,竊取管理員密碼或者直接控制伺服器
  • 攻擊者上傳病毒文件,破壞伺服器穩定性

在防範CTF文件上傳漏洞的過程中,需要注意以下幾點:

  • 在上傳文件時,需要確保對文件的格式、大小、路徑等進行正確的限制和過濾檢查。
  • 服務端需要對上傳文件的後綴名、文件類型進行檢查,防止上傳腳本或其他惡意文件。
  • 服務端需要設置上傳目錄,避免攻擊者利用路徑遍歷漏洞上傳文件到指定的目錄。
  • 開啟SELinux或者AppArmor,限制文件上傳的許可權。

二、CTF文件上傳如何找路徑

攻擊者可以通過文件上傳功能找到路徑,這就需要進行一些黑盒測試。通過對目錄遍歷的理解,攻擊者可以在上傳文件時的文件名中攜帶一些相對路徑或者絕對路徑,從而繞過服務端的限制,訪問到一些敏感目錄。

以下是一些路徑遍歷的常用技巧示例:

..\\..\\..\\..\\..\\..\\..\\windows\win.ini
../../../../../windows/win.ini
../../../../../../../etc/passwd
..%2F..%2F..%2F..%2F..%2F..%2Fetc/passwd

如果上傳路徑存在漏洞,攻擊者可以通過這種方式逐層遍歷上級目錄,進而獲取到更敏感的信息。

三、CTF文件上傳繞過JS

很多前端在文件上傳時會檢查一些文件的擴展名來做一層判斷,避免上傳不安全的文件。比如,常見的圖片文件的擴展名包括jpg、gif、png等,如果用戶上傳的文件不是這些類型之一,前端會提示用戶上傳不合法。

攻擊者可以通過繞過JS進行上傳防護機制:「上傳」按鈕可禁用,但用戶可以通過其他方式上傳文件。

例如:在輸入框中上傳文件及上傳後將文件內容複製進去,在本地端編寫包涵圖片鏈接的html文件,最後將html文件上傳到伺服器。這樣,即使前端對圖片格式做了限定,攻擊者也可以通過反編譯html代碼獲取圖片鏈接,進而獲取到敏感信息。

四、CTF文件上傳繞過

除了JS限制外,還有其他一些方法可以繞過文件上傳檢測。例如,有些伺服器會忽略文件名後綴而判斷MIME類型,如果攻擊者修改了文件的擴展名並禁止MIME類型檢測,即可進行文件上傳繞過。

此外,有時候攻擊者會在上傳時篡改Content-Type,並攜帶危險的文件類型。

以下是常見的上傳繞過方式:

  • 修改文件後綴名
  • 篡改Content-Type
  • 使用Content-Disposition以替換文件名
  • 通過Content-Transfer-Encoding實現文件上傳

五、CTF文件上傳題目

CTF比賽中,文件上傳題目是一個常見的考點。需要選手通過上傳惡意文件來獲取網站的flag,從而贏得比賽。

以下是一個簡單的CTF文件上傳題目的 PHP 代碼:

<?php
   if(isset($_POST['submit'])){
      $target_dir = "uploads/";
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
      $uploadOk = 1;
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
      if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
      && $imageFileType != "gif" ) {
         echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
         $uploadOk = 0;
      }
      if ($uploadOk == 0) {
         echo "Sorry, your file was not uploaded.";
      } else {
         if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
         } else {
            echo "Sorry, there was an error uploading your file.";
         }
      }
   }
?>

這個例子中,文件上傳路徑為uploads目錄,僅允許上傳JPG、PNG、JPEG和GIF格式的文件。如果上傳成功,頁面會提示上傳成功信息,否則會提示上傳失敗。

六、CTF文件上傳只能是圖片

在有些情況下,只允許上傳圖片時,可以使用以下方式實現上傳圖片功能。

<?php
   if(isset($_POST['submit'])){
      $target_dir = "uploads/";
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
      $uploadOk = 1;
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

      // Check if image file is a actual image or fake image
      if(isset($_POST["submit"])) {
         $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
         if($check !== false) {
            echo "File is an image - " . $check["mime"] . ".";
            $uploadOk = 1;
         } else {
            echo "File is not an image.";
            $uploadOk = 0;
         }
      }

      // Check if file already exists
      if (file_exists($target_file)) {
         echo "Sorry, file already exists.";
         $uploadOk = 0;
      }

      // Check file size
      if ($_FILES["fileToUpload"]["size"] > 500000) {
         echo "Sorry, your file is too large.";
         $uploadOk = 0;
      }

      // Allow certain file formats
      if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
      && $imageFileType != "gif" ) {
         echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
         $uploadOk = 0;
      }

      // Check if $uploadOk is set to 0 by an error
      if ($uploadOk == 0) {
         echo "Sorry, your file was not uploaded.";
      } else {
         if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
         } else {
            echo "Sorry, there was an error uploading your file.";
         }
      }
   }
?>

除了支持JPG、PNG、JPEG和GIF格式外,上面的代碼還支持檢查文件是否存在、文件大小限制等。在檢查到上傳文件不是圖片時,前端會提示用戶上傳不合法。

七、CTF文件上傳經典題目

以下是一個基於文件上傳漏洞的CTF經典題目:上傳並執行WebShell。

這個題目的思路是在文件上傳的同時,通過一些漏洞透過文件系統進行WebShell注入,最終獲取到伺服器的許可權。

以下是一個PHP代碼示例:

<?php
$uploadfile=$_FILES["file"]["tmp_name"];
$target = "/uploads" . basename($_FILES['uploaded']['name']) ;
if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target)) {
  echo "The file has been uploaded.";
  exec($uploadfile);
} else{
  echo "Sorry, there was a problem uploading your file.";
}
?>

以上代碼中,通過move_uploaded_file()將上傳的文件移動到伺服器的/uploads目錄中,並利用exec()來執行上傳的文件,即可在伺服器上執行惡意代碼(WebShell),攻擊者可通過WebShell獲取Web目錄下文件、伺服器系統信息和管理員許可權等。

八、CTF文件上傳無限制

如果伺服器端不存在對上傳文件的限制,那麼攻擊者將有機會上傳一個超級大的文件,從而導致伺服器出現拒絕服務(DOS)現象。

以下是PHP上傳腳本無限制代碼示例:

<?php
$folder = "uploads/";
move_uploaded_file($_FILES["file"]["tmp_name"], "$folder".$_FILES["file"]["name"]);
echo "File uploaded successfully.";
?>

如果在沒有限制的情況下,可以使用關於「Part file upload」或「範圍請求」之類的HTTP POST請求,將文件分塊上傳,從而上傳非常大的文件。

九、CTF文件上傳無限制找flag

以下是一種通用的無限制找flag的方法,設置PHP文件上傳路徑與上傳flag,可以獲取到伺服器上的flag文件。

以下是PHP代碼示例:

<?php
   if(isset($_POST['submit'])){
      $target_dir = "uploads/";
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
      $uploadOk = 1;
      $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

      if ($uploadOk == 0) {
         echo "Sorry, your file was not uploaded.";
      } else {
         if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
            $content = file_get_contents('flag.txt');
            echo $content;
         } else {
            echo "Sorry, there was an error uploading your file.";
         }
      }
   }
?>

上述代碼中,當上傳文件成功時,會列印出flag文件的內容。這個方法完全依賴於伺服器的漏洞,需要在存儲flag的目錄中加入php上傳腳本,在提交文件時獲取flag文件內容。

原創文章,作者:MPSHR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/317677.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
MPSHR的頭像MPSHR
上一篇 2025-01-11 16:27
下一篇 2025-01-11 16:27

相關推薦

  • 使用 DRF 實現文件上傳

    文件上傳是 web 應用程序中最常見的需求之一,本文將介紹如何使用 Django Rest Framework (DRF) 來實現文件上傳。通過本文,你將學習到如何使用 DRF 中…

    編程 2025-04-28
  • SpringBoot文件上傳詳解

    一、前言 隨著互聯網的發展,文件上傳成為了必備的功能之一,而SpringBoot作為目前最流行的開發框架之一,為文件上傳提供了便捷而強大的解決方案。 二、使用multipart/f…

    編程 2025-04-24
  • 從多個方面詳細闡述postman文件上傳的介面測試

    一、介面測試基礎 了解介面測試的基礎是進行postman文件上傳介面測試的前提。 首先,需要了解什麼是介面測試。 介面測試是對軟體系統中介面的測試,包括介面的功能測試、性能測試、安…

    編程 2025-04-24
  • CTF 載入程序詳解

    CTF (Capture the Flag) 比賽是信息安全領域的一種比賽形式,旨在檢驗參賽者在網路攻防、漏洞挖掘、密碼破解等方面的技能。CTF 載入程序作為比賽的關鍵組成部分之一…

    編程 2025-04-23
  • 阿里雲OSS文件上傳詳解

    一、OSS介紹 OSS,全稱 Object Storage Service,是阿里雲提供的一種海量、安全、低成本、高可靠的雲存儲服務。可以用來存儲和處理各種非結構化數據(如圖片、音…

    編程 2025-02-24
  • 微信小程序文件上傳詳解

    一、微信小程序文件上傳和下載 微信小程序提供了上傳和下載文件的API,可以方便地在開發中使用到。 文件上傳使用wx.uploadFile()方法,文件下載使用wx.download…

    編程 2025-02-15
  • Vulnhub——CTF攻防比賽的平台

    Vulnhub是一款專門用於CTF攻防比賽的漏洞模擬測試平台,裡面收錄了大量的虛擬機鏡像,鏡像中包含了各種各樣的漏洞,用於供安全從業者和安全愛好者進行攻防實踐,提高安全技術水平。以…

    編程 2025-02-01
  • 基於Springboot的MultipartFile多文件上傳

    一、MultipartFile簡介 MultipartFile是Springframework中的介面,它代表了上傳文件的數據類型。MultipartFile允許我們獲取文件名、大…

    編程 2025-01-27
  • Flask文件上傳指南

    一、Flask文件上傳運行 Flask是一個基於Python的Web應用程序開發框架,其中包括文件上傳功能。在使用Flask進行文件上傳之前,需要安裝Flask並創建Flask應用…

    編程 2025-01-24
  • 使用Spring Boot實現文件上傳

    一、Spring Boot文件上傳的介紹 在Web開發中,文件上傳功能是一個比較基礎且常見的功能,利用Spring Boot可以快速實現文件上傳,並且可以實現大小、格式等限制。在本…

    編程 2025-01-21

發表回復

登錄後才能評論