| Unrestricted File Upload with Dangerous Type Açıklığı (CWE-434) | |||||
| Bu makalede Unrestricted File Upload with Dangerous Type (CWE-434), yani Tehlikeli Dosya Yükleme açıklığı anlatılacaktır.
Açıklık Önem Derecesi: Yüksek Açıklığın Etkisi: Uzaktan kod çalıştırma Açıklığın Açıklaması: Uygulamalar özellik olarak kullanıcılarına dosya yüklemelerine (upload’a) izin verebilirler. Uygulamalar eğer kullanıcılarının yüklediği dosyalarda içerik ve/veya uzantı doğrulama kontrolü uygulamazlarsa bu durum saldırganlara çalıştırılabilir .asp, .php, .jsp, .jsf v.b. belirli web sunucu kodları yüklemelerine imkan verebilir. Bu ise saldırganlara doğrudan web sunucuda komut çalıştırma ortamına erişim sunabilir. Bir uygulama kısıtlanmamış bir dosya yüklemesi mekanizmasına sahipse “Tehlikeli Dosya Yükleme Mekanizması (CWE-434)” açıklığı var şeklinde ele alınır. Bu açıklığı ifade edebilmek adına çeşitli teknolojilerde örnek kod bloklarına yer verilmiştir: C# - Güvensiz Kod Bloğu:
/*
Güvensiz Kod
EN: File Uploading Without Checking Its Extension - ASP.NET MVC 5
TR: Uzantı Kontrolü Olmadan Dosya Yükleme - ASP.NET MVC 5
*/
//Controller:
[HttpPost]
[ValidateAntiForgeryToken]
public bool DangerousFileUpload(HttpPostedFileBase fileUpload)
{
string fileName, path;
try
{
if (fileUpload != null && fileUpload.ContentLength > 0 && Request.ContentType.Contains("multipart/form-data"))
{
fileName = Path.GetFileName(fileUpload.FileName);
path = System.Web.HttpContext.Current.Server.MapPath("~/Content/" + fileName);
fileUpload.SaveAs(path);
return true;
}
}
catch (Exception e)
{
//Handle Exceptions
return false;
}
return false;
}
//View:
@using (Html.BeginForm("DangerousFileUpload", "Cx", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<input type="file" name="fileUpload">
<input type="submit" value="Create" class="btn btn-default" />
}
C# - Güvenli Kod Bloğu:
/*
Güvenli Kod
EN: Uploading File With Proper Extension Check - ASP.NET MVC 5
TR: Düzgün Uzantı Kontrolü ile Dosya Yükleme - ASP.NET MVC 5
*/
//Controller:
[HttpPost]
[ValidateAntiForgeryToken]
public bool DangerousFileUpload(HttpPostedFileBase fileUpload)
{
string fileName, fileExt, path;
try
{
if (fileUpload != null && fileUpload.ContentLength > 0 && Request.ContentType.Contains("multipart/form-data"))
{
fileName = Path.GetFileName(fileUpload.FileName);
path = System.Web.HttpContext.Current.Server.MapPath("~/Content/" + fileName);
fileExt = Path.GetExtension(path);
if (fileExt == ".jpg" || fileExt == ".png")
{
fileUpload.SaveAs(path);
return true;
}
}
}
catch (Exception e)
{
//Handle Exceptions
return false;
}
return false;
}
// View:
// View katmanı güvensiz kod bloğundaki ile aynı. Kod uzamasın diye yazılmadı.
// ...
// ...
C# güvensiz kod örneğinde controller katmanı try bloğunda önce upload’lanan içeriği tutan http POST parametresi / nesnesi fileUpload gelmiş mi kontrolü, fileUpload parametresi / nesnesi 0 karakterden fazla içeriğe sahip mi kontrolü ve gelen istekte Content-Type başlığı multipart/form-data değerine sahip mi kontrolü yapılmaktadır. Eğer bu şartlar sağlanırsa sonra http POST parametresi / nesnesi fileUpload üzerinden dosyanın adı alınır, kaydedileceği path belirlenir ve dosya sunucuya kaydedilir. View katmanında http post metoduyla, multipart/form-data encytype’ı ile DangerousFileUpload controller metoduna dosya yükleme talebi yapmaya hazır form alanı arayüz olarak paylaşılır. Controller katmanında görüldüğü üzere herhangi bir kısıt konmadan dosya olduğu gibi alınıp sunucuya kaydedilmektedir. Bu durum güvensiz kabul edilir. C# güvenli kod örneğinde controller katmanı try bloğunda önce yine upload’lanan içeriği tutan http POST parametresi / nesnesi fileUpload gelmiş mi kontrolü, fileUpload parametresi / nesnesi 0 karakterden fazla içeriğe sahip mi kontrolü ve gelen istekte Content-Type başlığı multipart/form-data değerine sahip mi kontrolü yapılmaktadır. Eğer bu şartlar sağlanırsa sonra http POST parametresi / nesnesi fileUpload üzerinden dosyanın adı alınır, kaydedileceği path belirlenir ve bu sefer ekstradan uzantısı da alınır. Alınan uzantı if koşulu ile kıyaslanır ve belirlenmiş uzantılardan biriyse dosya sunucu diskine kaydedilir. View katmanında ise yine http post metoduyla, multipart/form-data encytype’ı ile DangerousFileUpload controller metoduna dosya yükleme talebi yapmaya hazır form alanı arayüz olarak paylaşılır. Controller katmanında bu sefer uzantı kontrolü koşulu eklemesi nedeniyle bu dosya yükleme mekanizması güvenli kabul edilir. PHP - Güvensiz Kod Bloğu:
<?php
/*
Güvensiz Kod
EN: Checking a File's MIME Type Based on Data Sent by The Browser
TR: Tarayıcıdan Gönderilen Veri Temel Alınarak Dosyanın
MIME Türünü Kontrol Etme
*/
if ($_FILES['file_name']['type'] == "image/jpeg"){
move_uploaded_file($_FILES['file_name']['tmp_name'] , $destination);
};
PHP - Güvenli Kod Bloğu:
<?php
/*
Güvenli Kod
EN: Validating Real MIME Type of Uploaded File
TR: Yüklenen Dosyanın Gerçek MIME Türünü Doğrulama
*/
//Verify file was uploaded via HTTP POST
if (is_uploaded_file($_FILES['file_name']['tmp_name'])) {
//Get real MIME type
$mime_type = mime_content_type($_FILES['file_name']['tmp_name']);
// Generate Allowed MIME Types List
$allowed_file_types = ['image/png', 'image/jpeg'];
//Verify that the real MIME type is allowed
if (! in_array($mime_type, $allowed_file_types)) {
// File type is NOT allowed
}
// Set up destination of the file
$destination = '/path/to/file/';
// Save File into Disk
move_uploaded_file($_FILES['file_name']['tmp_name'] , $destination);
}
PHP güvensiz kod örneğinde istemci tarafından gönderilen paketteki Content-Type başlığında yer alan dosya türü bilgisine göre izin verilen dosya türü kıyaslaması yapılmaktadır ve kıyaslamada koşul sağlanırsa dosya sunucu diskine kaydedilmektedir. Kötü niyetli bir kullanıcı Content-Type değerini manipüle ederek sunucuya farklı türlerde dosyaları gönderebileceği için bu durum güvensiz kabul edilir. PHP güvenli kod örneğinde ise istemci tarafından gönderilen paketteki Content-Type başlığında yer alan dosya türü bilgisine göre izin verilen dosya türü kıyaslaması yapılmaz. Bunun yerine istekle gelen dosya önce geçici olarak belleğe alınır. Ardından sunucu taraflı dosya türü belirleme fonksiyonu (mime_content_type) ile dosya türü belirlemesine tabi tutulur. Sonra belirlenen dosya türü izin verilen dosya türlerinden biri mi if koşulu kıyaslamasına tabi tutulur ve dosya bu şartı geçerse diske move_uploaded_file () ile kaydedilir. Bu durum güvenli kabul edilir. Çünkü dosya türü kontrolü istemciden gelen bilgiye göre değil de sunucu taraflı yapılmaktadır. VisualBasic.NET - Güvensiz Kod Bloğu:
' Güvensiz Kod Bloğu
' --------------------------------------------------
' EN: Uploading File Without Extension Validation
' TR: Uzantı Doğrulaması Olmadan Dosya Yükleme
' --------------------------------------------------
Public Function UploadFile(fileUpload As HttpPostedFileBase)
Dim fileName, Path As String
Try
If (fileUpload IsNot Nothing And
fileUpload.ContentLength > 0 And
Request.ContentType.Contains("multipart/form-data")) Then
fileName = Path.GetFileName(fileUpload.FileName)
Path = Web.HttpContext.Current.Server.MapPath("~/Content/" + fileName)
fileUpload.SaveAs(Path)
Return True
End If
Catch
'Handle Exceptions
Return False
End Try
'If we got so far, something failed.
Return False
End Function
VisualBasic.NET - Güvenli Kod Bloğu:
' Güvenli Kod Bloğu
' --------------------------------------------------
' EN: Validation of File Extension Before Uploading
' TR: Dosya Yüklenmeden Önce Dosya Uzantısı Doğrulaması
' --------------------------------------------------
Public Function UploadFile(fileUpload As HttpPostedFileBase)
Dim fileName, fileExt, Path As String
Try
If (fileUpload IsNot Nothing And
fileUpload.ContentLength > 0 And
Request.ContentType.Contains("multipart/form-data")) Then
fileName = Path.GetFileName(fileUpload.FileName)
Path = Web.HttpContext.Current.Server.MapPath("~/Content/" + fileName)
'''''''''''''
'Remediation:
fileExt = Path.GetExtension(fileName)
If (fileExt = ".jpg" Or fileExt = ".png") Then
fileUpload.SaveAs(Path)
Return True
End If
'End of Remediation.
''''''''''''''''''''
End If
Catch
'Handle Exceptions
Return False
End Try
'If we got so far, something failed.
Return False
End Function
VisualBasic.NET güvensiz kod örneğinde önce upload’lanan içeriği tutan http POST parametresi / nesnesi fileUpload gelmiş mi kontrolü, fileUpload parametresi / nesnesi 0 karakterden fazla içeriğe sahip mi kontrolü ve gelen istekte Content-Type başlığı multipart/form-data değerine sahip mi kontrolü yapılmaktadır. Eğer bu şartlar sağlanırsa http POST parametresi / nesnesi fileUpload üzerinden dosyanın adı alınır, kaydedileceği path belirlenir ve dosya sunucuya kaydedilir. Görüldüğü üzere herhangi bir kısıt konmadan dosya olduğu gibi alınıp sunucuya kaydedilmektedir. Bu durum güvensiz kabul edilir. VisualBasic.NET güvenli kod örneğinde önce yine upload’lanan içeriği tutan http POST parametresi / nesnesi fileUpload gelmiş mi kontrolü, fileUpload parametresi / nesnesi 0 karakterden fazla içeriğe sahip mi kontrolü ve gelen istekte Content-Type başlığı multipart/form-data değerine sahip mi kontrolü yapılmaktadır. Eğer bu şartlar sağlanırsa http POST parametresi / nesnesi fileUpload üzerinden dosyanın adı alınır, kaydedileceği path belirlenir ve bu sefer ekstradan uzantısı da alınır. Alınan uzantı if koşulu ile kıyaslanır ve belirlenmiş uzantılardan biriyse dosya sunucu diskine kaydedilir. Bu sefer uzantı kontrolü koşulu eklemesi nedeniyle bu dosya yükleme mekanizması güvenli kabul edilir. Açıklığın Önlemi: Bu açıklığın giderilmesi noktasında tavsiyeler şu şekildedir:
|
|||||
Bu yazı 27.10.2025 tarihinde, saat 01:05:23'de yazılmıştır.
26.10.2025 tarihi ve 22:19:41 saatinde ise güncellenmiştir. |
|||||
|
|||||
| Yorumlar |
|||||
| Henüz yorum girilmemiştir. | |||||
| Yorum Ekle | |||||
Bu yazı 27.10.2025 tarihinde, saat 01:05:23'de yazılmıştır.
26.10.2025 tarihi ve 22:19:41 saatinde ise güncellenmiştir.