Ders 12 - File Upload (Medium Level) | |||||
Bu yazıda güvenlik düzeyi Medium seviyesine yükseltilmiş DVWA'da shell tehditine karşı ne gibi bir önlem alındığına ve bu önlemin aşılıp aşılamayacağına değinilecektir.
Dersin HedefiHedefiniz Medium seviyesindeki güvenliği keşfedip nasıl aşabileceğinizi öğrenmektir.Shell'e Karşı ÖnlemÖnceki derste nasıl shell dosyası upload ederek siteyi hack'leyebileceğimizden bahsetmiştik. O derste DVWA'nın zafiyet barındıran sayfasının kullandığı kaynak kod şuydu:Low Level: <?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // Can we move the file to the upload folder? if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) { // No echo 'Your image was not uploaded.'; } else { // Yes! echo "{$target_path} succesfully uploaded!"; } } ?> Kaynak kodun 9. satırında upload için seçilen dosyanın belirlenen dizine transfer edildiğini görmektesiniz. Eğer transfer sırasında bir hata yaşanırsa if'e girilir ve bir hata bildirimi ekrana yansıtılır, eğer bir hata yaşanmazsa else'e girilir ve dosyanın sorunsuz bir şekilde yüklendiğine dair bildirim ekrana yansıtılır. Dikkat ettiyseniz bu kaynak koda kullanıcıdan gelen dosyalar için hiçbir kısıtlama konulmamıştır. Şimdi güvenlik seviyesi Medium iken kaynak kodda nasıl bir güvenlik metodolojisi güdülmüş ona bakalım: Medium Level: <?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // File information $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ]; $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; // Is it an image? if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && ( $uploaded_size < 100000 ) ) { // Can we move the file to the upload folder? if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) { // No echo 'Your image was not uploaded.'; } else { // Yes! echo "{$target_path} succesfully uploaded!"; } } else { // Invalid file echo 'Your image was not uploaded. We can only accept JPEG or PNG images.'; } } ?> Yukarıdaki kaynak koddaki 10. satıra bakacak olursanız kullanıcının upload için verdiği dosyanın tipi $uploaded_type değişkenine atanmaktadır. Ardından bu değişkenin tuttuğu değer 14. satırda sınanmaktadır. Eğer dosyanın tipini tutan değişken image/jpg ya da image/png değerine sahipse bu durumda sunucu gelen dosyanın resim olduğunu anlayacaktır ve upload işlemine izin verip if koşuluna girilecektir. Eğer değişken başka bir değere sahipse dosya upload edilmeyecektir ve else koşuluyla ekrana hata bildirimi gönderilecektir. Medium level'daki bahsedilen güvenlik barikatını önceki derste oluşturduğunuz shell ile bir sınayın. Yani shell.php dosyasını güvenlik seviyesi Medium Level iken upload'lamaya çalışın. Göreceğiniz üzere upload işlemi başarısız olacaktır ve ekrana "Your image was not uploaded. We can only accept JPEG or PNG images" bildirimi gelecektir. İlk bakışta güvenlik sağlandı gibi görünür. Peki aşılabilir mi? Cevap evet. Şimdi sunucuya yüklemeye çalıştığımız shell.php dosyasının bir resim olduğuna inandıralım. Yani sunucuyu kandıralım. Bunun için bir proxy yazılımına ihtiyacımız var. Bu derste bu iş için BurpSuite yazılımını kullanacağız. NOT: BurpSuite ve tarayıcınızın senkron haline gelmesi için yapılması gereken ayarlamaları şu yazının içerisinde bulabilirsiniz. İlk olarak normal bir resim yüklemesinde bulunalım ve sunucuya gönderdiğimiz talebin (paketin) header bilgilerini ekranımıza gelen BurpSuite popup penceresinden inceleyelim. Resimde sarı ile vurgulanmış Content-Type header'ına dikkat edin. Değer olarak image/png almış. Bu size bir yerden tanıdık geliyor mu? Yukarıda bahsettiğimiz Medium Level kaynak kodunda hatırlarsanız yüklenen dosyanın tipi bir değişkene atanıyordu ve bu değişken if koşulu içerisinde bazı değerlerle sınanıyordu. İşte o sınama değerlerinden biri image/png dir. Sınama başarılı olunca if'in içine girilecektir ve dosya upload edilecektir. Upload işlemini tamamlamak için BurpSuite ekranındaki Forward butonuna tıklamanız yeterlidir. Böylece resmi sunucuya upload'lamış olursunuz. Eğer önceki derste oluşturduğumuz shell.php dosyasını BurpSuite aktifken upload'lamaya çalışırsak ekrana şu popup penceresi gelecektir: Bu sefer yaptığımız talebin Content-Type header'ı dikkat ederseniz application/x-php değerini almış. İşte kritik nokta burasıdır. Sunucu, yani kullanılan PHP kodları aldığı dosyanın tipini gelen paketin Content-Type header değerine bakarak anlamaktadır. Eğer biz yukarıdaki popup penceresinden elimizle bu değeri değiştirip image/png yaparsak sunucu gelen dosyanın (shell.php'nin) resim olduğunu sanacaktır. Böylelikle güvenlik aşılıp shell dosyası sunucuya yüklenecektir. Şimdi elinizle popup penceresindeki application/x-php yazısını silin ve image/png yapın. Ardından Forward tuşuna basarak talebin (paketin) sunucuya gitmesine izin verin. Ekrana dosyanın yüklendiğinde dair bir bildirim mesajı gelecektir. Böyelikle shell dosyasına tarayıcınızdan erişerek tıpkı önceki derste anlatıldığı gibi siteyi hack'leyebilirsiniz. SonuçBu derste hem bir güvenlik önlemi koda nasıl yansırı görmüş oldunuz hem de bir güvenlik önlemi nasıl aşılabiliri görmüş oldunuz. Eğer shell tehlikesine karşı daha etkili bir güvenlik önlemi görmek isterseniz sıradaki yazıyı okuyabilirsiniz: Ders 13 - File Upload (High Level) |
|||||
Bu yazı 17.01.2016 tarihinde, saat 06:53:59'de yazılmıştır. 13.08.2018 tarihi ve 03:51:07 saatinde ise güncellenmiştir. | |||||
|
|||||
Yorumlar |
|||||
|
|||||
|
|||||
|
|||||
Yorum Ekle | |||||