| Stored Path Traversal Açıklığı (CWE-36) | |||||
| Bu makalede Stored Path Traversal Açıklığı (CWE-36), yani Depolu Dizin Gezinme açıklığı anlatılacaktır.
Açıklık Önem Derecesi: Orta Açıklığın Etkisi: Hassas Dosyaların Çalınması, SSRF saldırısı düzenlenmesi Açıklığın Açıklaması: Uygulamalar tasarımları gereği bazen “sistem içerisinden” bir dosya yolu bilgisi alabilmektedirler. Bu şekilde sistemin yerel diskindeki dosyalara erişerek kullanabilmektedirler. Saldırganlar bu tarz uygulamalarda bu işleyişleri eğer dosya yolu bilgisi kontrol edilmiyorsa kötü yönde kullanabilirler. Saldırganlar çeşitli farklı zafiyetler yoluyla sisteme başarılı bir şekilde sızdıklarında girdikleri özel hazırlanmış dosya yolları ile uygulamanın zararlı dosya yolu girdisini kullanmasını sağlayabilirler. Bu şekilde saldırganlar mevcut elde ettikleri sızma derinliğinde olmayan, uygulamanın kullanıcılarına hizmet olarak sunduğu uygulama sunucusunun yerel diskindeki dosyalarla birlikte ayrıca uygulamanın kullanıcılarına hizmet olarak sunmadığı uygulama sunucusunun yerel diskindeki dosyalara da erişim imkanı elde edebilirler. Bu ise geliştiricileri ciddi bilgi ifşalarıyla veya teknik problemlerle başbaşa bırakabilir. Saldırganlar uygulamanın kullanması adına keyfi (rastgele) dosya yolu girdisi girerek;
Uygulamalar kullanıcı girdisi olarak dosya yolu aldıklarında ve bu girdi denetlenmeden / filtrelenmeden uygulamada kullanıldığında buna “Depolu Dizin Gezinme (CWE-36)” açıklığı adı verilir. Açıklığı somutlaştırmak adına bazı teknolojilerde örnekler verilmiştir: Java - Güvensiz Kod Bloğu: // ENG: Stored Path Traversal from DB // TUR: Veri tabanından Çekilen Dosya // Yolu ile Depolu Dizin Gezinme String query = "SELECT username FROM users WHERE id = ?"; PreparedStatement pstmt = con.prepareStatement(query); pstmt.setInt(userID, 1); ResultSet resultSet = pstmt.executeQuery(); resultSet.next(); path = resultSet.getString(1); con.close(); File file = new File(path); Scanner scanner = new Scanner(file); System.out.println(scanner.nextLine()); scanner.close(); Java - Güvenli Kod Bloğu:
// TUR: Veri Tabanından Çekilen Dosya Yolu
// Üzerinde Paths.get() ve getName()
// Kullanarak Dosya Yolunu Ayrıştırarak
// Giderilmiş Depolu Dizin Gezinme
// ENG: Stored Path Traversal from DB
// Mitigated by Utilizing Paths.get()
// and getName()
String query = "SELECT username FROM users WHERE id = ?";
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setInt(userID, 1);
ResultSet resultSet = pstmt.executeQuery();
resultSet.next();
path = resultSet.getString(1);
con.close();
File file = new File(path);
String fileName = file.getName();
Path safePath = Paths.get("userFiles", fileName);
file = new File(safePath.toString());
Scanner scanner = new Scanner(file);
System.out.println(scanner.nextLine());
scanner.close();
Güvensiz java kod örneğinde veri tabanına bir sorgu yapılmaktadır ve bir dosya yolu path nesnesine aktarılmaktadır. Ardından bu dosya yolu kullanılarak scanner sınıfı ile dosyayı açma işlemi uygulanmaktadır. Bu noktada dosya yolu (path nesnesi) doğrulama / kontrol adımları uygulanmadan dosya açma işleminde kullanıldığından güvensiz kabul edilir. Güvenli java kod örneğinde veri tabanına bir sorgu yapılmaktadır ve bir dosya yolu path nesnesine aktarılmaktadır. Ardından dosya yolu parse edilmektedir (ayrıştırılmaktadır) ve getName() metoduyla dosya yolundaki “dosya adı” cımbızlanmaktadır. Daha sonra Paths.get() metoduyla cımbızlanan dosya adının başına belirli bir path (userFiles/) eklenmektedir. Son olarak inşa edilen dosya yolu (path nesnesi) Scanner() ile dosya açma işleminde kullanılmaktadır. Bu örnekte dosya yolu parse edildiğinden ( ayrıştırıldığından ) güvenli kabul edilmektedir. PHP - Güvensiz Kod Bloğu (1):
<?php
// ENG: Stored Absolute Path Traversal from DB
// TUR: Veri tabanından Çekilen Dosya Yolu
// ile Depolu Mutlak Dizin Gezinme
...
$pstmt = $con->prepare("SELECT username FROM users WHERE id = ?");
$pstmt -> bind_param("i", $userID);
$pstmt -> execute();
$pstmt -> bind_result($path);
$pstmt -> fetch();
if(is_readable($path)){
$file = fopen($path, 'rb');
fpassthru($file);
}
else {
//return 404
}
?>
Güvensiz php kod örneğinde veri tabanına bir sorgu yapılmaktadır ve bir dosya yolu $path nesnesine aktarılmaktadır. Ardından bu dosya yolu kullanılarak fopen() metodu ile dosyayı açma işlemi uygulanmaktadır. Bu noktada dosya yolu (path nesnesi) doğrulama / kontrol adımları uygulanmadan dosya açma işleminde kullanıldığından güvensiz kabul edilir. PHP - Güvensiz Kod Bloğu (2):
<?php
// ENG: Stored Relative Path Traversal from DB
// TUR: Veri tabanından Çekilen Dosya Yolu
// ile Depolu Göreceli Dizin Gezinme
...
$pstmt = $con->prepare("SELECT username FROM users WHERE id = ?");
$pstmt -> bind_param("i", $userID);
$pstmt -> execute();
$pstmt -> bind_result($path);
$pstmt -> fetch();
$filename = "public_files/" . $path;
if(is_readable($filename)){
$file = fopen($filename, 'rb');
fpassthru($filename);
}
else {
//return 404
}
?>
Güvensiz php kod örneğinde veri tabanına bir sorgu yapılmaktadır ve bir dosya yolu $path nesnesine aktarılmaktadır. Ardından bu dosya yolu public_files/ dosya yolu sonuna eklenmektedir. Son olarak fopen() metodu ile mevcut dosya yolundaki dosyayı açma işlemi uygulanmaktadır. Bu noktada dosya yolu (path nesnesi) doğrulama / kontrol adımları uygulanmadan dosya açma işleminde kullanıldığından güvensiz kabul edilir. PHP - Güvenli Kod Bloğu:
<?php
// TUR: basename() Kullanarak Giderilmiş
// Depolu Göreceli Gezinme Zafiyeti
// ENG: Stored Relative Path Traversal
// from DB Mitigated by Utilizing
// basename()
...
$pstmt = $con->prepare("SELECT username FROM users WHERE id = ?");
$pstmt -> bind_param("i", $userID);
$pstmt -> execute();
$pstmt -> bind_result($path);
$pstmt -> fetch();
$fileName = "public_files/" . basename($path);
if(is_readable($fileName)){
$file = fopen($fileName, 'rb');
fpassthru($file);
}
else {
//return 404
}
?>
Güvenli php kod örneğinde veri tabanına bir sorgu yapılmaktadır ve bir dosya yolu $path nesnesine aktarılmaktadır. Ardından dosya yolu public_files/ dosya yolu sonuna eklenmektedir, fakat eklenirken parse edilmektedir (ayrıştırılmaktadır) ve basename() metoduyla dosya yolundaki “dosya adı” cımbızlanmaktadır. Daha sonra dosya adının başına belirli bir path (public_files/) eklenmektedir. Son olarak inşa edilen dosya yolu ($filename nesnesi) fopen() ile dosya açma işleminde kullanılmaktadır. Bu örnekte dosya yolu parse edildiğinden (ayrıştırıldığından) güvenli kabul edilmektedir.
Not:
Depolu dizin gezinme zafiyetinin var olması için veritabanından dosya yolunun alınması şart değildir. Sadece sistemin kaynaklarından bir yerden gelmesi önemlidir. Örneğin uygulama sunucu sistemindeki environment variable’dan (ortam değişkeninden) gelen dosya yolları ile de ayrıştırma uygulanmıyorsa depolu dizin gezinme zafiyeti vardır denir. Açıklığın Önlemi: Tavsiyeler şu şekildedir:
Yararlanılan Kaynaklar:
|
|||||
Bu yazı 26.01.2026 tarihinde, saat 14:02:43'de yazılmıştır.
|
|||||
|
|||||
| Yorumlar |
|||||
| Henüz yorum girilmemiştir. | |||||
| Yorum Ekle | |||||
Bu yazı 26.01.2026 tarihinde, saat 14:02:43'de yazılmıştır.