• 28-01-2017, 14:29:11
    #1
    Merhabalar,
    Hazırladığım scriptin, firmalar bölümü için eklenen firmaların logosunu ekleye bilmesi için basit bir betik yazdım. İhtiyacı olan arkadaşlar olabilir diye ek açıklamalar da girdim, sizce bu betikte güvenlik açığı var mı? Kullanıcının örneğin r99 shell exploit v.b. kötü amaçlı dosya yüklemesine olanak tanır mı?

    Kodlar:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <?php
    if (!isset($_FILES['logo'])) {
    ?>
    <form action="deneme.php" method="post" enctype="multipart/form-data">
        <input type="file" name="logo">
        <input type="submit" value="yolla">
    </form>
    <?php
    }else{
         $hata=array();//hataları eklemek için boş bir dizi oluşturuyoruz
         $uzanti=end(explode(".", $_FILES['logo']['name']));//kullanıcıdan gelen dosyanın uzanrısını kırpıyoruz end fonksiyonunu kullanmamızın sebebi logo.01.jpg gibi isme sahip dosya yuklerlerse 01 kısmını almaması için kırpmaya sondan başlıyoruz.
         $if=array("image/jpg", "image/jpeg", "image/png");//izin vereceğimiz dosya formatlarını array dizisine ekliyoruz.
         $iu=array("jpg", "jpeg", "png");//izin verdiğimiz uzantıları giriyoruz.
         $ib="512000";//yüklenmesini istediğimiz en fazla dosya boyutunu bayte cinsinden yazıyoruz ben 500KB yazdım
         $ad="logo";//yuklenecek dosya adını yazıyoruz.
         $dizin="dosya/firma/logo/";//dosyanın yukleneceği dizini yazıyoruz
         $tmp=$_FILES['logo']['tmp_name'];//yuklenen dosyanın geçici dizindeki adını alıyoruz dosyayı yuklerken lazım olacak.
         $type=$_FILES['logo']['type'];//yuklenen dosyanın formatını alıyoruz.
         $size=$_FILES['logo']['size'];//yuklenen dosyanın boyutunu alıyoruz.
       
         if ($size > $ib) {//yuklenen dosya izin verilen boyunttan büyükmü diye kontrol ediyoruz.
             $hata[]="izin_verilenden_buyuk_dosya";//eğer büyükse hata dizisine hata ekliyoruz
             echo "<p>Firma logosu en fazla 500kb boyutunda olabilir.</p>";
         }
         if (in_array($uzanti, $iu)===FALSE) {//dosya uzantısı izin verdiğimiz uzatntılardan başka bir uzantıya sahipmi diye bakıyoruz
             $hata[]="izin_verilmeyen_uzanti";//izin vermediğimiz bir uzantıya sahipse hata dizisine hata mesajı ekliyoruz.
             echo "<p>Firma logosu sadece jpg, jpeg, png uzantısına sahip olabilir.";
         }
         if (in_array($type, $if)===FALSE) {//dosya izin verdiğimiz formatlardan birine uyuyormu diye kontrol ediyoruz
             $hata[]="bilinmeyen_dosya";//izin verilen formatlardan başka bir formata sahipse hata dizi sine eleman ektiyoruz
             echo "<p>Yüklemeye çalıştığınız dosyanın resim/fotoğraf olmadığını tesbit ettik. Sadece image/jpg, image/jpeg, image/png formatına sahip logo yükleyebilirsiniz";
         }
         if (empty($hata)=="TRUE") {//hata dizisinin içeriği boşsa dosyayı yüklüyoruz
             move_uploaded_file($tmp, $dizin.$ad.".".$uzanti);
             echo "<p>Firma logosunu başarı ile eklediniz.</p>";
         }
    }
    ?>
    </body>
    </html>
  • 28-01-2017, 16:05:08
    #2
    VeLi33 adlı üyeden alıntı: mesajı görüntüle
    Merhabalar,
    Hazırladığım scriptin, firmalar bölümü için eklenen firmaların logosunu ekleye bilmesi için basit bir betik yazdım. İhtiyacı olan arkadaşlar olabilir diye ek açıklamalar da girdim, sizce bu betikte güvenlik açığı var mı? Kullanıcının örneğin r99 shell exploit v.b. kötü amaçlı dosya yüklemesine olanak tanır mı?

    Kodlar:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <?php
    if (!isset($_FILES['logo'])) {
    ?>
    <form action="deneme.php" method="post" enctype="multipart/form-data">
        <input type="file" name="logo">
        <input type="submit" value="yolla">
    </form>
    <?php
    }else{
         $hata=array();//hataları eklemek için boş bir dizi oluşturuyoruz
         $uzanti=end(explode(".", $_FILES['logo']['name']));//kullanıcıdan gelen dosyanın uzanrısını kırpıyoruz end fonksiyonunu kullanmamızın sebebi logo.01.jpg gibi isme sahip dosya yuklerlerse 01 kısmını almaması için kırpmaya sondan başlıyoruz.
         $if=array("image/jpg", "image/jpeg", "image/png");//izin vereceğimiz dosya formatlarını array dizisine ekliyoruz.
         $iu=array("jpg", "jpeg", "png");//izin verdiğimiz uzantıları giriyoruz.
         $ib="512000";//yüklenmesini istediğimiz en fazla dosya boyutunu bayte cinsinden yazıyoruz ben 500KB yazdım
         $ad="logo";//yuklenecek dosya adını yazıyoruz.
         $dizin="dosya/firma/logo/";//dosyanın yukleneceği dizini yazıyoruz
         $tmp=$_FILES['logo']['tmp_name'];//yuklenen dosyanın geçici dizindeki adını alıyoruz dosyayı yuklerken lazım olacak.
         $type=$_FILES['logo']['type'];//yuklenen dosyanın formatını alıyoruz.
         $size=$_FILES['logo']['size'];//yuklenen dosyanın boyutunu alıyoruz.
       
         if ($size > $ib) {//yuklenen dosya izin verilen boyunttan büyükmü diye kontrol ediyoruz.
             $hata[]="izin_verilenden_buyuk_dosya";//eğer büyükse hata dizisine hata ekliyoruz
             echo "<p>Firma logosu en fazla 500kb boyutunda olabilir.</p>";
         }
         if (in_array($uzanti, $iu)===FALSE) {//dosya uzantısı izin verdiğimiz uzatntılardan başka bir uzantıya sahipmi diye bakıyoruz
             $hata[]="izin_verilmeyen_uzanti";//izin vermediğimiz bir uzantıya sahipse hata dizisine hata mesajı ekliyoruz.
             echo "<p>Firma logosu sadece jpg, jpeg, png uzantısına sahip olabilir.";
         }
         if (in_array($type, $if)===FALSE) {//dosya izin verdiğimiz formatlardan birine uyuyormu diye kontrol ediyoruz
             $hata[]="bilinmeyen_dosya";//izin verilen formatlardan başka bir formata sahipse hata dizi sine eleman ektiyoruz
             echo "<p>Yüklemeye çalıştığınız dosyanın resim/fotoğraf olmadığını tesbit ettik. Sadece image/jpg, image/jpeg, image/png formatına sahip logo yükleyebilirsiniz";
         }
         if (empty($hata)=="TRUE") {//hata dizisinin içeriği boşsa dosyayı yüklüyoruz
             move_uploaded_file($tmp, $dizin.$ad.".".$uzanti);
             echo "<p>Firma logosunu başarı ile eklediniz.</p>";
         }
    }
    ?>
    </body>
    </html>
    dosya kontrolleri için sadece uzantı kontrolü yaparsanız FSO açığı ile shell dosyaları yüklenebilir. Bu sorunun çözümü için mime type kontrolü yapmanız lazım. Bunlarla uğraşmamak için de verot.net upload class'ını tavsiye edebilirim.

    ---- edit ----

    Type kontrolü zaten varmış sorun çıkartmaz.
  • 28-01-2017, 17:16:23
    #3
    Big_Turk adlı üyeden alıntı: mesajı görüntüle
    dosya kontrolleri için sadece uzantı kontrolü yaparsanız FSO açığı ile shell dosyaları yüklenebilir. Bu sorunun çözümü için mime type kontrolü yapmanız lazım. Bunlarla uğraşmamak için de verot.net upload class'ını tavsiye edebilirim.

    ---- edit ----

    Type kontrolü zaten varmış sorun çıkartmaz.
    evet ek olarak $_FILES['logo']['type'] kontrolü yaptım ama yeterli olur mu kafama takıldı forumda bir danışayım dedim.
  • 01-02-2017, 02:51:31
    #4
    Yüklenen dosya içeriğini okutup içinde neler olduğunu kontrol ettirirseniz shell sokma olayını büyük ölçüde önlersiniz. Bunun kod biçimini de isterseniz yardımcı olabilirim.