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.
Dersin Hedefi
Shell'e karşı nasıl etkili bir güvenlik temin edilebileceğ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. Şu şartlar altında bu güvenlik önlemi aşılamayacaktır. |