Arif ARI
16 min readFeb 15, 2022

PORTSWIGGER WEB SECURITY - FILE UPLOAD LAB ÇÖZÜMLERİ

File Upload (Dosya Yükleme), kullanıcının bir web sunucusuna dosya yüklemesine denir. Web sayfaları kullanıcıdan dosya yüklemesi için çeşitli formatlarda yapılandırılmış olabilir ve farklı uzantılara sahip (word, pdf, jpeg vs.) dosyaların yüklenmesine imkan sağlayabilir. Fakat bu durum kullanıcı tarafından kötüye kullanılabileceği için web uygulamasının yüklenecek dosyayı kontrol etmesi ve bu durumu engelleyecek çözümler üretmesi gerekmektedir. File upload zafiyetine örnek verecek olursak, bir web sayfasında kullanıcı bilgileriyle beraber bir resim dosyasının istendiğini varsayalım. Web sayfası yüklenecek bu resim dosyasını doğrulamıyorsa burada bir file upload zafiyeti meydana gelmektedir. Saldırgan bu resim dosyası yerine shell almaya olanak tanıyan zararlı bir php dosyası yükleyebilir. Bu file upload zafiyetine verilen yalnızca bir örnek. Bunun gibi daha birçok senaryo söz konusu olabilir.

Bu laboratuvarda bahsedilen File Upload zafiyeti için tüm laboratuvar çözümleri ele alınmıştır. Keyifli okumalar..

Lab 1: Remote code execution via web shell upload

Bir web uygulamasının, php, java veya python gibi komut çalıştırmaya olanak tanıyan dosyaları sunucuya yüklenmesi için kabul etmesi olabilecek en kötü senaryodur. Örneğin php formatında bir web shell yüklediğimizde sunucu üzerinde tam kontrole sahip oluruz. Bunun sonucunda saldırgan, çalıştıracağı koda bağlı olarak dosyaları okuyup değişebilir, hassas verileri ele geçirebilir ve daha birçok saldırı gerçekleştirebilir.

Bu laboratuvarda, web sunucusu dosyayı kaydetmeden önce herhangi bir doğrulama gerçekleştirmediği için, saldırgan bir resim dosyası yerine web shell yükleyebilmektedir. Bu web shell ile herhangi bir dosyanın içeriğini görüntüleyebilir.

Burp Suite aracı aktiften Laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olalım. Karşımıza email adresini güncelleyebileceğimiz ve resim dosyası yükleyebileceğimiz bir panel çıkmaktadır.

İlk olarak herhangi bir resim dosyası (hacker.jpg) upload edelim ve resmin yüklendiğini gözlemleyelim.

Şimdi Burp aracında images dosyalarını dahil etmemiz gerekmektedir. Bunun için sırasıyla Proxy > HTTP history > Filter settings adımlarını izleyerek Filter by MIME type başlığı altında images seçeneğine onay verelim ve Apply edelim.

Ayarları tamamladığımıza göre yapacağımız ilk işlem upload edilen resim dosyasının path’ini öğrenmek olacaktır. HTTP history bölümünden gerçekleşen istekleri incelediğimizde /files/avatars/hacker.jpg dosya path’ine bir GET isteği yapıldığını göreceğiz. Upload edilen dosya /files/avatars/ konumunda yer almaktadır.

Artık web shell’i yükleyebiliriz. Bunun için önce php uzantılı ve içerisinde <?php echo file_get_contents(‘/home/carlos/secret’); ?> kod satırını barındıran bir web shell dosyası (exploit.php) oluşturuyoruz. Bu kod satırı carlos kullanıcısına ait secret dosyası içeriğini okumamızı sağlamaktadır. Exploit dosyamızı upload edelim ve isteği burp ile yakalayalım.

Gönderilen istek repeaterda send edildiğinde web shell’in başarıyla yüklendiği görülecektir.

Web shell dosyası sunucuya yüklendi. Şimdi elde etmek istediğimiz secret dosyasının içeriği için, yüklediğimiz php dosyasının konumuna gidelim. Bunun için başlığı /files/avatars/exploit.php olarak değişip isteği send edelim. İstek metodundan dolayı izin verilmediğini görüyoruz.

Daha önce yüklenen resim dosyasının path’ini öğrenmek için inceleme yaptığımızda bir GET isteğinin yapıldığını gözlemlemiştik. Dolayısıyla istek metodunu da GET olarak değişmemiz gerekmektedir. İsteği bu şekilde send ettiğimizde response üzerinden carlos kullanıcısına ait secret bilgisini öğrenmiş olacağız.

Submit solution sekmesinden secret dosyasının içeriğini doğrulattıktan sonra laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

Lab 2: Web shell upload via Content-Type restriction bypass

Web sayfaları kullanıcı tarafından yüklenen dosyayı kontrol etmek amacıyla birçok farklı yol izleyebilir. Örneğin Content-Type başlığının MIME türüyle (farklı uzantılarda ki dosyaları tanımlar) eşleşip eşleşmediğini kontrol edebilir. Ancak sadece bu doğrulamanın yapılması yetersiz kalmaktadır. Çünkü saldırgan Content-Type değerini kontrol edebiliyorsa, duruma bağlı olarak farklı değerler tanımlayabilir ve saldırı gerçekleştirebilir.

Bu web sayfası kullanıcıdan bir resim (jpeg yada png uzantılı) dosya yüklemesini istemektedir ve bunu da Content-Type başlığı üzerinden doğrulamaktadır. Content-Type değerini değişerek istenilen formatta bir istek gerçekleştireceğiz ve görüntülemek istediğimiz dosyanın içeriğini keşfedeceğiz.

Burp Suite aracı aktiften laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olalım. Karşımıza email adresini güncelleyebileceğimiz ve resim dosyası yükleyebileceğimiz bir panel çıkmaktadır. İlk olarak herhangi bir resim dosyası (hacker.jpg) upload edelim ve resmin yüklendiğini gözlemleyelim.

Şimdi upload edilen resim dosyasının path’ini öğreneceğiz. HTTP history bölümünden gerçekleşen istekleri incelediğimizde /files/avatars/hacker.jpg dosya path’ine bir GET isteği yapıldığını görebiliriz. Upload edilen dosya /files/avatars/ konumunda yer almaktadır.

Artık web shell’i yükleyebiliriz. Bunun için php uzantılı ve içerisinde <?php echo file_get_contents(‘/home/carlos/secret’); ?> kod satırını barındıran bir web shell dosyası (exploit.php) kullanıyoruz. Bu kod satırı carlos kullanıcısına ait secret dosyası içeriğini okumamızı sağlamaktadır. Exploit dosyamızı upload edelim ve isteği burp ile yakalayalım.

Gönderilen isteği repeaterda send ettiğimizde, sadece jpeg ve png dosyalarına izin verildiğini bildiren bir hata mesajı almaktayız. Uygulama burada kontrolü Content-Type başlığı üzerinden sağlamaktadır. Bu değeri değişmemiz halinde başarılı olabilirsek dosyayı upload etmiş olacağız.

İstek üzerinde application/octet-stream olarak tanımlanmış content-type başlığını image/jpeg şeklinde değişip isteği send ettiğimizde web shell başarıyla yüklenmiş olacaktır. Bu şekilde istenilen formata uygun bir istek göndermiş olduk.

Web shell dosyası sunucuya yüklendi. Şimdi elde etmek istediğimiz secret dosyasının içeriği için, yüklediğimiz php dosyasının konumuna gidelim. Bunun için başlığı /files/avatars/exploit.php olarak değişip isteği send edelim. İstek metodundan dolayı izin verilmediğini görüyoruz.

Daha önce yüklenen resim dosyasının path’ini öğrenmek için inceleme yaptığımızda bir GET isteğinin yapıldığını gözlemlemiştik. Dolayısıyla istek metodunu da GET olarak değişmemiz gerekmektedir. İsteği bu şekilde send ettiğimizde response üzerinden carlos kullanıcısına ait secret bilgisini öğrenmiş olacağız.

Submit solution sekmesinden secret dosyasının içeriğini doğrulattıktan sonra laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

Lab 3: Web shell upload via path traversal

Web sayfaları bazen upload edilen zararlı (örneğin php web shell gibi) dosyalara izin verebilir fakat bu dosyaların içeriğini çalıştırmaz ve kullanıcıya string değeri olarak döndürür. Genelde filtreleme teknikleri kullanılarak bu tarz önlemler alınmaktadır. Dolayısıyla saldırgan dosyanın konumunu değişerek yada encoding teknikleri (veya her iki yöntemi birden) kullanarak bu durumu bypass edebilir.

Bu web sayfası, kullanıcıların yüklediği zararlı kod barındıran dosyaların çalıştırılmasına engel olmaktadır. Dosya içeriğini elde etmek için, çalıştırılacak exploit dosyasının okunacağı konumu değişerek basit bir encoding işlemi gerçekleştireceğiz.

Burp Suite aracı aktiften laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olalım. Karşımıza email adresini güncelleyebileceğimiz ve resim dosyası yükleyebileceğimiz bir panel çıkmaktadır. İlk olarak herhangi bir resim dosyası (hacker.jpg) upload edelim ve resmin yüklendiğini gözlemleyelim.

Şimdi upload edilen resim dosyasının path’ini öğreneceğiz. HTTP history bölümünden gerçekleşen istekleri incelediğimizde /files/avatars/hacker.jpg dosya path’ine bir GET isteği yapıldığını görebiliriz. Upload edilen dosya /files/avatars/ konumunda yer almaktadır.

Artık bir web shell yükleyebiliriz. Bunun için php uzantılı ve içerisinde <?php echo file_get_contents(‘/home/carlos/secret’); ?> kod satırını barındıran bir web shell dosyası (exploit.php) kullanıyoruz. Bu kod satırı carlos kullanıcısına ait secret dosyası içeriğini okumamızı sağlamaktadır. Exploit dosyamızı upload edelim ve isteği burp ile yakalayalım.

Gönderilen istek repeaterda send edildiğinde web shell’in başarıyla yüklendiği görülecektir.

Web shell dosyası sunucuya yüklendi. Şimdi elde etmek istediğimiz secret dosyasının içeriği için, yüklediğimiz php dosyasının konumuna gidelim. Bunun için başlığı GET /files/avatars/exploit.php olarak değişip isteği send ediyoruz. Yanıtı incelediğimizde exploit dosyası içeriğindeki kod satırının çalışmadığını ve string olarak döndürüldüğünü görmekteyiz.

NOT: Daha önce yüklenen resim dosyasının path’ini öğrenmek için inceleme yaptığımızda bir GET isteğinin yapıldığını gözlemlemiştik. Bundan dolayı istek metodunu GET olarak değiştirdik.

Exploit dosyasının yürütülmesi için filtrelemeyi bypass edecek şekilde sunucuya yüklememiz gerekmektedir. filename parametresini ../exploit.php şeklinde tanımlayıp dosya konumunu bir üst dizinden okumasını belirtiyoruz. İsteği send ettiğimizde yanıtta ../ karakterlerinin silindiğini göreceğiz yani bu durumda da bir filtreleme söz konusu ve başarılı olamadık.

NOT: Dosyanın içeriğini görüntülemek istediğimizde istek başlığını GET /files/avatars/exploit.php olarak değişmiştik ancak bunun dışında gerçekleşen tüm eylemlerde POST /my-account/avatar başlıklı isteği kullanıyoruz. (Tüm laboratuvarlar için durum bu şekilde)

Bir encoding tekniği uygulayabiliriz. Exploit dosyasının önündeki slash karakterini URL encode ederek isteği send edelim. Bu şekilde dosyamızın ../exploit.php olarak sunucuya yüklemiş olacağız.

Exploit dosyası sunucuya yüklendiğine göre artık dosyayı çalıştırabiliriz. Dosya içeriğini alacağımız için istek metodunu önceki laboratuvarlarda olduğu gibi GET olarak değiştiriyoruz. Dosya konumunu ise filtrelemeden ötürü /files/avatars/..%2fexploit.php şeklinde tanımlıyoruz. İsteği bu şekilde send ettiğimizde response üzerinden carlos kullanıcısına ait secret bilgisini öğrenmiş olacağız.

Submit solution sekmesinden secret dosyasının içeriğini doğrulattıktan sonra laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

NOT: Web sunucuları, dosyanın kaydedileceği adı ve konumu belirlemek için genellikle multipart/form-data isteklerinde filename alanını kullanır.

Lab 4: Web shell upload via extension blacklist bypass

Web sunucuları komut çalıştırılmasını engellemek için upload edilen php uzantılı dosyaları kara listeleye alıyor olabilir. Bu durumda .php5, .shtml gibi dosya uzantıları kullanılarak bypass işlemi gerçekleştirebiliriz. Ancak web uygulamaları önlemler almak adına bazende yapılandırma dosyaları kullanmaktadırlar. Örneğin bir php dosyasının yürütülmesi için /etc/apache2/apache2.conf dosyasında LoadModule php_module /usr/lib/apache2/modules/libphp.so AddType application/x-httpd-php .php şeklinde bir komut satırı configure edilebilir. Eğer herhangi bir yapılandırma söz konusu değilse upload edilen dosya genelde çalıştırılmaz.

Bu web sayfasında upload edilen bazı dosyalar uzantıları nedeniyle kara listeye alınmaktadır. Fakat bir yapılandırma zafiyeti mevcuttur ve dolayısıyla bu durum bypass edilebilmektedir.

Burp Suite aracı aktiften laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olalım. Karşımıza email adresini güncelleyebileceğimiz ve resim dosyası yükleyebileceğimiz bir panel çıkmaktadır. İlk olarak herhangi bir resim dosyası (hacker.jpg) upload edelim ve resmin yüklendiğini gözlemleyelim.

Şimdi upload edilen resim dosyasının path’ini öğreneceğiz. HTTP history bölümünden gerçekleşen istekleri incelediğimizde /files/avatars/hacker.jpg dosya path’ine bir GET isteği yapıldığını görebiliriz. Upload edilen dosya /files/avatars/ konumunda yer almaktadır.

Artık bir web shell yükleyebiliriz. Bunun için php uzantılı ve içerisinde <?php echo file_get_contents(‘/home/carlos/secret’); ?> kod satırını barındıran bir web shell dosyası (exploit.php) kullanıyoruz. Bu kod satırı carlos kullanıcısına ait secret dosyası içeriğini okumamızı sağlamaktadır. Exploit dosyamızı upload edelim ve isteği burp ile yakalayalım.

Gönderilen istek repeaterda send edildiğinde php dosyalarına izin verilmediğini bildiren bir hata mesajı alıyoruz. Ayrıca response üzerinden görüleceği üzeri bu sayfa bir Apache sunucusu kullanmaktadır.

Developerlar, sunucuların birçok genel ayarı geçersiz kılması yada bu ayarlara ekleme yapabilmesi adına bireysel dizinler içinde özel yapılandırma dosyaları oluştururlar. Örneğin Apache sunucularında, .htaccess adlı bir dosya bulunduğu dizine özgü bir yapılandırma sağlamaktadır. Bu nedenle .htaccess dosyasını php uzantılı dosyamızın yükleneceği dizinde yapılandırdığımız zaman php dosyamızı çalıştırabileceğiz.

Bazen bir Apache sunucusunun, istemci tarafından talep edilen PHP dosyalarını çalıştırması için, developerların /etc/apache2/apache2.conf dosyasına AddType application/x-httpd-php .php yönergesini tanımlamış olmaları gerekir. Bundan dolayı php uzantılı exploit dosyamızı çalıştırabilmek için ilk önce .htaccess dosyasını tanımlayacağız. Ardından kod satırını AddType application/x-httpd-php .l33t şeklinde değişeceğiz ve Content-Type başlığını da text/plain olarak tanımlayacağız. Daha sonradan exploit dosyasının uzantısını .l33t şeklinde değişeceğimiz için yönerge üzerinde .php uzantısını .l33t olarak tanımladık. Bunu da uygulamayı yanıltma amacıyla yapmaktayız. İstek üzerindeki tüm bu işlemlerden sonra isteği send ettiğimizde .htaccess dosyasının başarıyla yüklendiğini göreceğiz.

Dosya yükleme panelinde exploit.php dosyasını upload ederek tekrardan bir istek gönderelim. Bu daha önce gönderilen orjinal istektir. Daha önce bahsettiğimiz gibi bu exploit dosyasının uzantısını .l33t olarak değişelim ve repeaterda send edelim. exploit.l33t dosyası başarıyla yüklenecektir.

Exploit dosyası sunucuya yüklendiğine göre artık dosyayı çalıştırabiliriz. Dosya içeriğini alacağımız için istek metodunu önceki laboratuvarlarda olduğu gibi GET olarak değiştiriyoruz. Dosya konumunu ise /files/avatars/exploit.l33t şeklinde tanımlıyoruz. İsteği bu şekilde send ettiğimizde response üzerinden carlos kullanıcısına ait secret bilgisini öğrenmiş olacağız.

Submit solution sekmesinden secret dosyasının içeriğini doğrulattıktan sonra laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

Lab 5: Web shell upload via obfuscated file extension

Web uygulamaları saldırıları engellemek için oldukça kapsamlı kara listeler kullanabilirler ancak bu kara listeler şaşırtma teknikleri kullanılarak atlatılabilmektedir. Örneğin php uzantılı dosyaları kabul etmeyen bir web sayfası düşünelim. Bu web sayfasına shell.pHp adlı bir dosya yüklediğimizde dosyanın uzantısında yer alan büyük ‘H’ harfi nedeniyle bu durumu basitçe atlatabiliriz. Bu sadece bir örnek ve bunun gibi (duruma bağlı olarak) daha birçok teknik uygulanabilir.

Bu web sayfası kullanıcıdan jpg yada png uzantılı bir dosya yüklemesini istemektedir ve php uzantılı dosyaları kara listeleye almaktadır. Bir şaşırtma tekniği kullanarak bu durumu bpass edeceğiz ve upload edilecek php uzantılı exploit dosyasının çalıştırılmasını sağlayacağız.

Burp Suite aracı aktiften laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olalım. Karşımıza email adresini güncelleyebileceğimiz ve resim dosyası yükleyebileceğimiz bir panel çıkmaktadır. İlk olarak herhangi bir resim dosyası (hacker.jpg) upload edelim ve resmin yüklendiğini gözlemleyelim.

Şimdi upload edilen resim dosyasının path’ini öğreneceğiz. HTTP history bölümünden gerçekleşen istekleri incelediğimizde /files/avatars/hacker.jpg dosya path’ine bir GET isteği yapıldığını görebiliriz. Upload edilen dosya /files/avatars/ konumunda yer almaktadır.

Artık bir web shell yükleyebiliriz. Bunun için php uzantılı ve içerisinde <?php echo file_get_contents(‘/home/carlos/secret’); ?> kod satırını barındıran bir web shell dosyası (exploit.php) kullanıyoruz. Bu kod satırı carlos kullanıcısına ait secret dosyası içeriğini okumamızı sağlamaktadır. Exploit dosyamızı upload edelim ve isteği burp ile yakalayalım.

Gönderilen isteği repeaterda send ettiğimizde, sadece jpeg ve png dosyalarına izin verildiğini bildiren bir hata mesajı almaktayız. Bu adımı atlatabilmenin birçok yolu vardır. Bunlardan bir tanesi, boş bayt değeri ve ardından jpg uzantısını kullanmaktır.

filename değerini exploit.php%00.jpg şeklinde değişip isteği send ettiğimizde zararlı dosyamızın exploit.php şeklinde upload edildiğini görmüş olacağız. Burada %00.jpg değeri uygulama sunucusu tarafından çıkarıldığı için dosyamız exploit.php şeklinde yüklenmiştir.

Exploit dosyası sunucuya yüklendiğine göre artık dosyayı çalıştırabiliriz. Dosya içeriğini alacağımız için istek metodunu önceki laboratuvarlarda olduğu gibi GET olarak değiştiriyoruz ve dosya konumunu /files/avatars/exploit.php şeklinde tanımlıyoruz. Dosyamız da exploit.php olarak yüklendiği için filename değerini bu şekilde değişiyoruz. İsteği send ettiğimizde response üzerinden carlos kullanıcısına ait secret bilgisini öğrenmiş olacağız.

Submit solution sekmesinden secret dosyasının içeriğini doğrulattıktan sonra laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

Lab 6: Remote code execution via polyglot web shell upload

Güvenli sunucular, bir istekte belirtilen Content-Type parametresine göre değilde yüklenilen dosya içeriğinin beklenenle eşleştiğini doğrulamaya çalışırlar. Örneğin bir resim dosyası yüklendiğinde bu resim dosyasının boyutu ile bir doğrulama sağlanabilir fakat bir php betiği yüklendiğinde boyut olmadığı için dosyanın yüklenmesi reddedilebilir.

Bu web sayfası yüklenen dosyanın içeriğini kontrol ederek dosyanın bir resim dosyası olup olmadığını doğrulamaktadır. Ancak Burp aracıyla yüklenecek resim dosyasının içeriğini değişerek bu durumu bypass edebiliyoruz.

Laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olalım. Karşımıza email adresini güncelleyebileceğimiz ve resim dosyası yükleyebileceğimiz bir panel çıkmaktadır. İlk önce php uzantılı ve içerisinde <?php echo file_get_contents(‘/home/carlos/secret’); ?> kod satırını barındıran bir web shell dosyası (exploit.php) upload edeceğiz. Bu kod satırı carlos kullanıcısına ait secret dosyası içeriğini okumamızı sağlamaktadır.

Exploit dosyamızı upload edelim ve isteği burp ile yakalayalım. İsteği repeaterda send ettiğimizde uygulamanın resim haricinde dosya kabul etmediğini bildiren bir hata mesajı almaktayız.

Şimdi dosya yükleme panelinde herhangi bir resim dosyası (hacker.jpg) upload edelim ve isteği repeaterda send ederek resmin yüklendiğini gözlemleyelim.

Normalde php uzantılı bir dosya upload etmeye çalıştığımızda başarılı olamamıştık ama burada kontrol image dosyasının içeriğine göre yapıldığı için dosya uzantısını .php olarak değişip isteği send ettiğimizde hacker.php dosyasının upload edildiğini göreceğiz. php dosyası bu şekilde yüklenebildiği için içeriğine bir kod satırı enjekte edebiliriz.

İstekte yer alan ve kırmızı renkle temsil edilen karışık yapı yüklediğimiz resim dosyasının içerdiği bayt dizisini temsil etmektedir. Bu bayt dizisi içerisine exploit.php dosyası içerisindeki kod satırını tanımlayalım ve isteği send edelim. Dosyamız başarıyla yüklendi. Artık yapmamız gereken tek şey kod satırında yer alan carlos kullanıcısına ait secret bilgisini öğrenmek.

Dosya içeriğini alacağımız için istek metodunu önceki laboratuvarlarda olduğu gibi GET olarak değiştiriyoruz ve dosya konumunu /files/avatars/hacker.php şeklinde tanımlıyoruz. İsteği send ettiğimizde response üzerinden carlos kullanıcısına ait secret bilgisini öğrenmiş olacağız.

Submit solution sekmesinden secret dosyasının içeriğini doğrulattıktan sonra laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

NOT: Resim dosyası içeriğine kod satırını burp suite üzerinden tanımlamıştık. Bunu exiftool aracını kullanarak da yapabilmekteyiz.

Lab 7: Web shell upload via race condition

Web uygulamalarının birçoğu genellikle, dosyaları doğrudan dosya sistemine yüklemek yerine, önce geçici olarak korumalı bir dizine yüklerler. Daha sonra bu dosya üzerinde bir doğrulama gerçekleştirirler ve yalnızca güvenli olduğuna kanaat getirdiklerinde ana hedefe aktarırlar. Eğer doğrulama başarısız olursa dosya kaldırılır. Bu tarz önlemler zararlı yazılımları kontrol etmek amacıyla alınmaktadır. Bu doğrulama süreci yalnızca birkaç milisaniye sürebilir, ancak dosyanın sunucuda bulunduğu bu kısa süre içerisinde saldırgan dosyayı çalıştırabilir.

Bahsedilen güvenlik zafiyetleri sayfanın iyice irdelenmesini gerektiren zafiyetlerdir ve genellikle sayfanın geliştirici tarafında ki kaynak kodu incelenerek bulunabilmektedir. Bu web sayfasında geliştirici tarafında ki kaynak kodu ipucu olarak verilmiştir. Gerçek testlerde geliştirici tarafında ki kaynak kodu ancak ele geçirilerek incelenebilir.

Bu web sayfası yüklenen dosyaları önce bir doğrulama sürecinden geçirmektedir ve ancak bu doğrulama süreci içerisinde zararlı dosya çalıştırabiliyoruz. Bunun için Turbo Intruder kullanarak saldırı gerçekleştireceğiz.

Burp Suite aracı aktiften laba erişim öncesi tanımlanmış wiener:peter hesabıyla login olalım. Karşımıza email adresini güncelleyebileceğimiz ve resim dosyası yükleyebileceğimiz bir panel çıkmaktadır. İlk olarak herhangi bir resim dosyası (hacker.jpg) upload edelim ve resmin yüklendiğini gözlemleyelim.

Şimdi upload edilen resim dosyasının path’ini öğreneceğiz. HTTP history bölümünden gerçekleşen istekleri incelediğimizde /files/avatars/hacker.jpg dosya path’ine bir GET isteği yapıldığını görebiliriz. Upload edilen dosya /files/avatars/ konumunda yer almaktadır.

Artık bir web shell yükleyebiliriz. Bunun için php uzantılı ve içerisinde <?php echo file_get_contents(‘/home/carlos/secret’); ?> kod satırını barındıran bir web shell dosyası (exploit.php) kullanıyoruz. Bu kod satırı carlos kullanıcısına ait secret dosyası içeriğini okumamızı sağlamaktadır. Exploit dosyamızı upload edelim ve isteği burp ile yakalayalım.

Gönderilen isteği repeaterda send ettiğimizde, sadece jpeg ve png dosyalarına izin verildiğini bildiren bir hata mesajı almaktayız. Daha önce bu durumla karşılaşmıştık ancak burada daha önce kullandığımız hiçbir bypass tekniği işe yaramamaktadır çünkü sayfa upload edilen dosyayı bir doğrulama sürecine tabi tutmaktadır. Bundan dolayı farklı bir yöntem kullanacağız.

Bizde php kod satırını çalıştırabilmek için Turbo Intruder kullanacağız. İsteğe sağ tıklayalım ve sonra “Extensions > Turbo Intruder > Send to turbo intruder” adımlarını izleyelim.

NOT: Eğer Burp aracınızda Turbo Intruder uzantısı yüklü değil ise “Extender > BApp store” adımları izlenerek Turbo Intruder uzantısı install edilebilir.

Açılan Turbo Intruder penceresinde ki python editörüne,

def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,)

request1 = ‘’’<YOUR-POST-REQUEST>’’’

request2 = ‘’’<YOUR-GET-REQUEST>\r\n\r\n’’’

# the ‘gate’ argument blocks the final byte of each request until openGate is invoked
engine.queue(request1, gate=’race1')
for x in range(5):
engine.queue(request2, gate=’race1')

# wait until every ‘race1’ tagged request is ready
# then send the final byte of each request
# (this method is non-blocking, just like queue)
engine.openGate(‘race1’)

engine.complete(timeout=60)

def handleResponse(req, interesting):
table.add(req)

şeklinde bir kod enjekte edelim. Kod üzerinde bir kaç değişiklik yapmamız gerekmektedir. İlk request alanına POST /my-account isteğini, ikinci request alanına dosya path’ini öğrenmek için inceleme yaptığımız GET /files/avatars/hacker.jpg isteğini baştan sona copy-paste edelim. Ardından ikinci istekteki dosya adını exploit.php olarak değişelim ve atağı başlatalım.

NOT: Enjekte edilen bu kod parçası, exploit.php dosyasını yüklemek için bir POST isteği gönderecek ve ardından /files/avatars/exploit.php konumuna 5 GET isteği gönderecektir.

Atak sonucunda bazı GET isteklerine 200 durum kodunun döndüğünü ve bu isteklerin carlos’a ait secret bilgisini içerdiğini görebiliriz. Turbo intruder kullanmamızın amacı istekleri olabildiğince hızlı göndermekti. Bu sayede zararlı dosyamızı uygulama doğrulama yapamadan sunucuya yüklemiş olduk.

Elde ettiğimiz secret dosyasının içeriğini Submit solution sekmesinden doğrulattıktan sonra laboratuvarı çözmüş olacağız.

Congratulations, you solved the lab!

NOT 1: Bilinmelidir ki laboratuvarlar, kullanıcının isteğine bağlı olarak farklı formatlarda çözümlenebilir.

NOT 2: File Upload laboratuvarlarının tamamında aynı exploit kodunu kullandık ve amaç hep aynıydı. Fakat web uygulamasının almış olduğu önlemler nedeniyle farklı teknikler kullanarak amacımıza ulaştık.