Web for Pentester-Directory Traversal Çözümleri

Bilge Güngör
5 min readAug 11, 2024

--

Web for Pentester’ın yeni bölümüne hoş geldiniz!

Eğer XSS (Cross-Site Scripting) bölümünün çözümüne göz atmak veya Web for Pentester’ın kurulumunu görmek isterseniz, buradan ulaşabilirsiniz.

Bugünkü konumuz, web güvenliği dünyasında oldukça önemli bir yer tutan “Directory Traversal” zafiyetleri olacak. Bu yazıda, directory traversal saldırılarının temel kavramlarını ele alacağız ve üç farklı örnek üzerinden bu zafiyetlerin nasıl ortaya çıktığını ve nasıl çalıştığını inceleyeceğiz.

İlk olarak, directory traversal zafiyetlerinin ne olduğunu kısaca açıklayalım: Bu tür bir zafiyet, bir saldırganın web uygulamasının dosya sisteminde erişim sınırlarını aşarak, yetkisiz dosyalara ve dizinlere ulaşmasına olanak tanır. Genellikle, bu tür saldırılar, uygulamanın kullanıcıdan gelen verileri yeterince iyi doğrulamadığı veya temizlemediği durumlarda ortaya çıkar.

Bu yazıda, directory traversal zafiyetlerini derinlemesine inceleyip, çeşitli senaryolar üzerinden nasıl oluştuğunu ve potansiyel riskleri daha iyi anlamaya çalışacağız. Hazırsanız, başlayalım!

Ana sayfamıza geldiğimizde tıklayabileceğimiz bir alan olmadığını görüyoruz. Yapmamız gereken sağ tıklayıp resim adresini kopyalayıp ardından yeni bir pencereden kopyaladığımız resim adresini yapıştırıyoruz. Evet şimdi tam olarak hazırız. 1. örneğimize geçebiliriz.

Example 1

İlk olarak kaynak kodlarını inceleyelim.

Bu kodda, file parametresi ile belirtilen dosyanın yolunu oluşturuyoruz ve dosyanın sistemde var olup olmadığını kontrol ediyoruz. Eğer dosya mevcutsa, HTTP başlıkları ile dosya içeriğini sunuyoruz. Ancak, bu kodda bir directory traversal zafiyeti bulunuyor, bu da saldırganların üst dizinlere erişim sağlayabileceği anlamına geliyor.

Açılan yeni sayfada şu şekilde bir URL ile karşılaşıyoruz:

…/dirtrav/example1.php?file=hacker.png

Bu URL’de, file parametresi dosya yolunu belirler. Şimdi, istediğimiz dosyanın içeriğini görüntülemek için file parametresine uygun bir dosya yolu vermemiz gerekiyor.

Örneğin, sistemdeki önemli bir dosya olan passwd dosyasını görüntülemek istiyorsak, file parametresine şu değeri giriyoruz:

../../../../../../../../etc/passwd

Burada, ../ ifadesi bir üst dizine çıkmamızı sağlar. Bu şekilde dizin yapısında yukarı doğru hareket edebiliriz. Ancak, önemli bir nokta var: ne kadar çok ../ kullanırsak kullanalım, sistem kök (root) dizininden (/) daha yukarı çıkamayız. Yani, ../ dizin seviyelerini artırarak kök dizininin ötesine geçmek mümkün değildir. Bu nedenle, ../ dizinlerini güvenli bir şekilde kullanabiliriz çünkü kök dizininin üzerine çıkılamaz.

Sonuç olarak, sayfa bizi /etc/passwd dosyasının içeriğini gösteren bir ekranla karşılıyor. Bu dosya, sistemdeki kullanıcı bilgilerini içerir ve directory traversal saldırılarıyla bu tür önemli dosyaların içeriği açığa çıkarılabilir.

Example 2

İlk olarak kaynak kodlarını inceleyelim.

Bu kodda, file parametresi ile belirtilen dosyanın yolunu kontrol ediyoruz ve aşağıdaki adımları içeriyor:

  1. Dosya Parametresi Kontrolü: İlk olarak, file parametresinin mevcut olup olmadığını kontrol ediyoruz. Eğer parametre mevcut değilse, işlem sonlandırılıyor.
  2. Dosya Yolu Doğrulaması: Eğer file parametresi mevcutsa, dosya yolunun ../files/ dizini içinde olup olmadığını kontrol ediyoruz. Bu, yalnızca belirli bir dizinden dosya erişimine izin verir ve diğer dizinlere erişimi engeller. Eğer dosya yolu bu dizin içinde değilse, işlem sonlandırılıyor.
  3. Dosya Mevcudiyeti Kontrolü: Belirtilen dosyanın gerçekten var olup olmadığını kontrol ediyoruz. Dosya mevcut değilse, işlem sonlandırılıyor.
  4. Dosya Sunumu: Dosya mevcutsa, HTTP başlıkları ayarlanıyor ve dosya içeriği kullanıcıya sunuluyor. Dosya içeriği parça parça okunarak ekrana yazdırılıyor.

Açılan yeni sayfada şu şekilde bir URL ile karşılaşıyoruz:

../dirtrav/example2.php?file=/var/www/files/hacker.png

Örneğin, sistemdeki önemli bir dosya olan passwd dosyasını görüntülemek istiyorsak, file parametresine şu değeri giriyoruz:

/var/www/files/../../../../../../../../../../../etc/passwd

Bu URL ile, file parametresi içinde ../ kullanarak dizinler arasında yukarı doğru hareket ettik ve kök dizine (/) erişim sağladık. Kod, belirtilen dizinlerin geçerli olduğunu doğrulasa da, ../ dizinleri kullanarak dosya yolunun üst dizinlere çıkılmasına olanak tanıyor. Bu durum, dosyanın /etc/passwd gibi önemli bir sistem dosyasına erişim sağlamış oluyor.

Sonuç olarak, bu URL ile /etc/passwd dosyasının içeriğini görüntüleyebildik. Bu, kodun directory traversal zafiyetine karşı yeterince güvenli olmadığı ve saldırganların kök dizine (/) çıkabileceklerini gösterir.

Example 3

İlk olarak kaynak kodlarını inceleyelim.

Bu kodda, file parametresi ile belirtilen dosyanın yolunu oluşturuyoruz ve aşağıdaki adımları takip ediyoruz:

  1. Dosya Parametresi Kontrolü: İlk olarak, file parametresinin mevcut olup olmadığını kontrol ediyoruz. Eğer parametre mevcut değilse, işlem sonlandırılıyor.
  2. Dosya Yolunun Oluşturulması ve Null-Byte Sorunu: Dosya adını alıp, $UploadDir dizini ile birleştirerek dosya yolunu oluşturuyoruz. Ardından, eski PHP dosya işleme işlevlerinde ortaya çıkan null-byte (null karakter) sorununu simüle etmek için preg_replace fonksiyonunu kullanarak dosya yolundan olası null-byte karakterlerini temizliyoruz. Bu, null-byte karakterlerinin dosya yoluna eklenmesini engeller.
  3. Dosya Mevcudiyeti Kontrolü: Oluşturulan dosya yolunun geçerli olup olmadığını kontrol ediyoruz. Eğer dosya mevcut değilse, işlem sonlandırılıyor.
  4. Dosya Sunumu: Dosya mevcutsa, HTTP başlıkları ayarlanıyor ve dosya içeriği kullanıcıya sunuluyor. Dosya içeriği parça parça okunarak ekrana yazdırılıyor.

Açılan yeni sayfada şu şekilde bir URL ile karşılaşıyoruz:

../dirtrav/example3.php?file=hacker

Bu URL’de, file parametresinde sadece dosya adı (hacker) belirtilmiştir ve uzantısı .png olarak arka planda eklenir. Kodda, dosya uzantısı otomatik olarak eklenir ve dosya yolunun şu şekilde olmasını sağlar

../files/hacker.png

Null-Byte İle Sömürü

Ancak, dosya adının sonuna %00 (null byte) eklediğimizde, bu karakter dosya yolunun sonunu belirleyebilir. Bu teknik, PHP’nin eski dosya işleme işlevlerinde kullanılan bir zayıflık olarak bilinir ve dosya yolunu bu karakterle sonlandırarak istenmeyen uzantıların engellenmesini sağlar. URL şu şekilde olmalıdır:

../dirtrav/example3.php?file=../../../../../../../../../etc/passwd%00

Bu URL ile, dosya adının sonuna %00 ekleyerek, dosya yolunun tamamlanmasını ve belirli bir dosyanın (/etc/passwd) içeriğinin görüntülenmesini sağlayabiliriz. %00 karakteri, dosya yolunun sonunu belirleyerek, .png uzantısının eklenmesini engeller ve bu şekilde doğrudan kök dizinindeki dosyaları erişimimize sunar.

Bu, eski PHP dosya işleme işlevlerinde ortaya çıkan bir zafiyeti gösterir ve preg_replace ile null-byte karakterlerini temizleme çabalarına rağmen, bu tür bir güvenlik açığının hala etkili olduğunu kanıtlar. Bu tür açıklar, hassas dosyalara yetkisiz erişime yol açabilir.

Ve bir yazının daha sonuna geldik. Umarım içerik sizler için faydalı olmuş ve ilginizi çekmiştir. Web for Pentester serisine devam edeceğim. Ayrıca Mehmet İncenin Directory Traversal videosunu da izlemenizi tavsiye ederim. Bir sonraki yazılarda görüşmek üzere, sağlıcakla kalın! :)

--

--