一、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