Upload Script i Geliştirme ve Güvenlik

cebir

Özel Üye
3 Tem 2007
85
2
İstanbul
Upload Script i Geliştirme ve Güvenlik

Bu yazı orta seviyede PHP bilgi düzeyine sahip olduğunuz varsayılarak hazırlanmıştır.

a) 'Upload' Edilecek Olan İçeriğin www Root Dışında Olması


En basit ve öncelikli kural 'upload' edilecek olan içeriğin WWW root dışında (Cpanel için public_html plesk için httpdocs) olmasını sağlamaktır. Bu sayede yazılabilir olan klasörünüzün barındırdığı içerik dışarıdan gözlenemeyecektir.


Bunun için 'uploads' adında klasör oluşturuyoruz. Tabi bu yeterli bir önlem değil, çünkü şu anda server'a başkası tarafından zararlı bir içerik yüklenebilir. Bu meseleyi ileride 'uploads' dizinindeki '.htaccess' dosyasını CGI scriptlerinin çalışmasını önlemek için kullanarak ele alacağız.



b) Dosya Türüne Kısıtlamalar Getirme


Upload.php adında aşağıdaki satırları içeren bir php dosyası oluşturalım.
PHP:
<?php
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { 
    echo "Dosya Geçerli ve Upload Edildi.\n";
} else {
    echo "Hata Oluştu.\n";
}
?>

uploadForm.html dosyasıda aşağıdaki gibi olsun.

Kod:
<form name="upload" action="upload.php" method="POST" ENCTYPE="multipart/form-data"> 
Select the file to upload: <input type="file" name="userfile">
<input type="submit" name="upload" value="upload">
</form>


Yukarıdaki satırlar büyük bir güvenlik açığı barındırıyor. Kullanıcı sisteme form aracılığıyla istediği dosyayı upload edebilir hatta forma dahi ihtiyaç duymadan perl scripti ile bunu yapabilir.


PHP:
<?php 
system($_GET['cebir']);
?>


Eğer kullanıcı sisteme yukarıdaki php dosyasını(shell.php) yüklerse
https://tik.lat/foV8m şeklinde sisteme kolayca sızabilir.

Bu script'e aşağıdaki kodları ekleyerek buna bazı engellemeler getirebiliriz.
PHP:
<?php 
if($_FILES['userfile']['type'] != "image/gif") {
    echo "Hata! Sadece .gif Dosyaları Upload Edilebilir.";
    exit;
}
?>

c)Content-Type Doğrulaması

upload.php dosyamıza bazı yenilikler getirerek upload edilecek dosya türlerine sınırlama getirebilir ve bazı dosyaların (.php) gibi zararlı amaçla kullanılması engellenebilir.

PHP:
<?php 
if($_FILES['userfile']['type'] != "image/gif") {
    echo "Hata! Sadece .gif Dosyaları Upload Edilebilir.";
    exit;
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { 
    echo "Dosya Geçerli ve Upload Edildi.\n";
} else {
    echo "Hata Oluştu.\n";
}
?>


Yukarıdaki kod ile kullanıcılar direk olarak shell.php dosyasını(önceki örnekte verilen) sisteme upload edemeyebilirler. Fakat saldırgan aşağıdaki saldiri.pl perl dosyasını kullanarak content-type i image/gif olarak değiştirip sisteme shell.php'i upload edebilir.


Kod:
use LWP;
use HTTP::Request::Common;

$ua = $ua = LWP::UserAgent->new;; 
$ua->proxy('http', 'http://deneme.com/');

$res = $ua->request(POST 'http://deneme.com/upload.php', 
             Content_Type => 'form-data',
         Content => [
          userfile => ["shell.php", "shell.php", "Content-Type" => "image/gif"],
         ],
        );
print $res->as_string();



d) Resim Dosyalarındaki Yorum Satırları


Şuana kadar alınan önlemler yeterli gelebilir fakat değil. Bazı resim dosyaları(.gif, .jpeg) bir php dosyası olarak değerlendirilebiliyor ve bu resimlere bazı yorumlar girebiliyorsunuz. Bu yüzden bu resimlerdeki yorumlara girilen php kodlarıyla sisteme zarar verilebiliniyor. getimagesize() işlevi ise yetersiz kalıyor ve bunları tamamen bir resim dosyası olarak algılıyor.

Kod:
use LWP;
use HTTP::Request::Common;

$ua = $ua = LWP::UserAgent->new;;

$res = $ua->request(POST 'http://localhost/upload3.php',
             Content_Type => 'form-data',
         Content => [
          userfile => ["cebir.gif", "cebirphp", "Content-Type" => "image/gif"],
         ],
        );
print $res->as_string();
Yukarıdaki perl script'i ile özel hazırlanmış cebir.gif dosyası sisteme cebir.php olarak upload edilebilir. Sonrada tabiki çalışıtırılırsa eğer, saldırgan sisteme sızmayı başarabilir.

29mu2ix.jpg


Yukarıda da görüldüğü gibi php yorumlayıcısı sadece cebir.gif dosyasında bulunan yorumun içindeki <?php phpinfo(); ?> satırını okuyor ve çalıştırıyor.

Bu açığa çözümü 'f' bölümünde inceleyeceğiz.

e).htaccess ile Kısıtlamalar Getirme


'Uploads' klasörünün içinde '.htaccess' dosyasını zararlı scriptlerin çalışmasını önlemek için oluşturuyoruz. Uploads klasörünün içeriğini gizleme, güvenliği sağlamada bize yardımcı olabilecek etmenlerden ve bunun için .htaccess'in içerisindeki Options -Indexes satırı bize yardımcı olacak.


Kod:
Options -Indexes 
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi


Bu satırlar ile belirlediğimiz dosya uzantılarına artık erişim kısıtlanmış oldu. Belirnenen uzantılara sahip dosyaların çalıştırılmasını önlemek güvenlik adına bize önemli bir katkısı olacaktır.

Yada biz kullanıcılara sadece fotoğraf dosyaları için izin verebilir ve diğer dosya türlerinin erişimini engelleyebiliriz. Bunun için aşağıdaki satırları önce verilen kodun devamına ekleyebilirsiniz.

Kod:
<Files ^(*.jpeg|*.jpg|*.png|*.gif)> 
order deny,allow
deny from all
</Files>


Bu satılar ile sadece .jpeg, .jpg, .png, ve .gif uzantılarının erişimine izin sağladık.
Diğer uzantılar için aşağıdaki gibi bir hata alacaktır.

2hgv21h.jpg


f) Php Fonksiyonlarıyla Upload Edilen Dosyayı Kontrol Etme


Şuanda dosya izinimiz 777 ve kullanıcılar her türlü zararlı içeriği sistemimize yükleyebilir. Buna karşı tabiki bir takım önlemler almalıyız.

Öncelikli olarak dosya türünü kontrol etmeliyiz ve eğer belirlediğimiz dosyanın dışında bir dosya ise upload işlemini engelleyeceğiz.
İkinci olarak dosya boyutunu denetleyeceğiz.

Eğer kullanıcılara sadece resim dosyalarını(.jpeg, .gif, .png) yüklemelerine izin vereceğimiz takdirde yüklenen içeriğin gerçekten bir resim dosyası olup olmadığını denetlememiz gerekecektir. Bunun içinde
getimagesize() işlevini kullanacağız. Eğer resim dosyası ise true değil ise false döndürecektir ve ayrıca resmin yüksekliğini, genişliğini ve resim dosyasının türüne kısıtlamalar getirerek sadece belli boyuta sahip olmayanları engelleyebiliriz.

PHP:
<?php 
// Upload Edilecek Olan Dosyayının Boyutunu Denetlemek İçin

if ($_FILES['imagefile']['size'] > 50000 ) { 
    die ("ERROR: Large File Size");
}

// Gerçekten Resim Dosyası Olup Olmadığını Denetlemek İçin 

if (!getimagesize($_FILES['imagefile']['tmp_name'])) { 
    echo "Geçersiz Resim Dosyası";
exit();
}

// Eğer Resim Dosyası İse Boyutuna Kısıtlamalar Getirmek İçin 

list($width, $height, $type, $attr) = getimagesize($_FILES['imagefile']['tmp_name']); 
if ($width > 100 || $height > 100) {
    echo "Lütfen 100x100 px den daha düşük boyutlarda içerik yükleyiniz.";
exit();
}

// Bazı Dosyaların Upload Edilmesinin Kısıtlanması 

$blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py"); 
foreach ($blacklist as $file) {
    if(preg_match("/$file\$/i", $_FILES['userfile']['name'])) {
        echo "Hata! Geçersiz Dosya Upload Edilme Girişimi Tespit Edildi.";
        exit;
    }
}
?>


g) Rastgele Dosya İsmi üretilmesi

Upload edilmiş dosyalara farklı bir ad verebilir ve veritabanıyla takip edibilirsiniz. Dosya adları tercihinize göre tarih veya md5 hash'ı olabilir.

Eklemem gereken bir kaç madde daha var. Eğer yararlı olduysa ve talep gelirse onlarıda eklerim. Umarım yardımcı olmuştur.

Sorularınızı ve görüşlerinizi konu altında paylaşabilirsiniz.

Arge Team
cebir

 

carexumar

Yeni üye
25 Haz 2008
36
0
bayağı kapsamlı anlatım olmuş, ama kimse yorum yazmamış eline sağlık cebir
devamını bekliyoruz
 

wheel

Yeni üye
22 Eyl 2010
1
0
Çok sağol Cebir epey işime yaradı.Daha başka açıklar varsa bu konuda paylaşırsan sevinirim.Bir de yeniden isimlendirme konusunu da işlersen çok iyi olur.Sağolasın.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.