lostyazilim
tr.link

Dosya uzantısını alma explodesiz? (Çözüldü)

15 Mesajlar 2.735 Okunma
lstbozum
tr.link

65116 65116 WM Aracı Anonim Üyelik
  • Üyelik 20.06.2016
  • Yaş/Cinsiyet - /
  • Meslek
  • Konum
  • Ad Soyad ** **
  • Mesajlar 632
  • Beğeniler 0 / 196
  • Ticaret 9, (%89)
patates+domates+Köfte = hamburger;
if(!ketchap){
echo "fakir";
}else {
echo "10 numara";
}
 

 

wmaraci
reklam

0ktay 0ktay strdex Kullanıcı
  • Üyelik 01.02.2018
  • Yaş/Cinsiyet 26 / E
  • Meslek Yazılım öğrencisi
  • Konum Antalya
  • Ad Soyad O** Ş**
  • Mesajlar 603
  • Beğeniler 25 / 155
  • Ticaret 2, (%100)

Decimas adlı üyeden alıntı

Regex ile dosya uzantısı mı kontrol ediyorsun, bu zamanda kimse direkt çalıştırılabilir bir dosya yüklemez :D virüs.jpg ama arkaplanda virüs.php gömülü olabilir, resim çağrıldığı an puff. PHP'de bu tip durumları daha derinden mime type denen kavrama yaklaşarak çözmek gerek. Extension değil dosya içeriği, formatı önemli. Örneğin şu küçük kütüphane güzel bir örnek.

Eskiden kullandığım ufak bir fonksiyon, örrnek olması amacıyla bırakayım.


public function imageUpload(){
$query = $this->db->prepare("SELECT * FROM limits WHERE id=1");
$query->execute(array());
$limits != null ? $query->fetch(PDO::FETCH_ASSOC) : 7;

$image = new Bulletproof\Image($_FILES);
$upname = $image->getName();
$svname = hash('sha512', date("d-m-Y H:i:s", time())).rand(222, 222222);

preg_match_all('/[0-9]+/', $limits['max_up_file_resolution'], $matches, PREG_SET_ORDER);
$maxwidth = $matches[0][0];
$maxheight = $matches[1][0];

$image->setName($svname)
->setLocation(__DIR__ . "/../../uploads")
->setMime(array('png', 'jpg', 'jpeg', 'gif'))
->setDimension($maxwidth, $maxheight)
->setSize('1', $limits['max_up_file_size']);

if($image["pictures"]){
if($image->upload()){
$query = $this->db->prepare("INSERT uploads SET userid=:userid, date=:date, ip=:ip, upname=:upname, svname=:svname, ext=:ext, size=:size, resolution=:resolution");
$addvalue = $query->execute(array(
"userid" => $this->common->post('userid'),
"date" => date("d-m-Y H:i:s", time()),
"ip" => $this->getIP(),
"upname" => $upname,
"svname" => $svname,
"ext" => $image->getMime(),
"size" => $image->getSize(),
"resolution" => $image->getWidth().'x'.$image->getHeight()
));

if ($addvalue)
return true;
else
return false;
} else{
return $image["error"];
}
}
}


Görüldüğü üzere dosya ismi değiştirilmesi önemli, en azından saldırgan sonraki adımı resmin yeni ismini öğrenmek olacaktır. Biraz terletmek için.

Resimlerin yüklendiği veya kullanıldığı klasörler için .htaccess ile belirli sınırlamalar getirilmeli, çalıştırılabilir dosyalara izin verilmemeli, mesela PHP veya flash içerikli dosyalar.


Cevabın için teşekkürler.

Resim(png) olayını örnek verdiğim siteme yüklenen dosyalar daha farklı .txt .wad gibi 8-9 çeşit dosya yükleniyor.

Söylediğin benimde aklımdan geçmişti örnek olarak; .wad içerisinde sisteme enjekte edeceği bir kod varsa ne yapacağım diye ama bir türlü bu konu hakkında çözüm bulamadım ?

Aklıma bir yol geldi sadece .htaccess dosyasında sadece benim belirttiğim .php dosyalarının işleme alınması gibi ? (böyle bir işlem yapılabiliyormu bilmiyorum)

Fakat .so gibi sistem dosyalarını yüklerse sistemi kontol edebilecek bu sefer :)
Arada derede kaldım :D

Bununla ilgili bir çözüm varmıdır ?
 

 

Eğitimin pahalı olduğunu düşünüyorsanız, cehaletin bedelini hesaplayın.

Decimas Decimas WM Aracı Kullanıcı
  • Üyelik 19.04.2015
  • Yaş/Cinsiyet 26 / E
  • Meslek Developer
  • Konum İstanbul Avrupa
  • Ad Soyad E** E**
  • Mesajlar 820
  • Beğeniler 1 / 302
  • Ticaret 1, (%100)
Aklıma gelen en mantıklı yol subdomainde (img.siteadi.com gibi) depolanması yönünde. Eğer çalıştırılabilir bir dosya yüklenirse en fazla subdomain'i etkiler, main domain sadece dosyayı html kısmında döküp göstereceği için çok sorun yaratmayacaktır.

Ama veritabanı kımına gelecek olursak hala risk var, bu yüzden görselleri başka bir kullanıcı adı ve şifresi ile bilikte başka bir veritabanında saklanması uygun olur. Main domain sorgularını yaparken iki vt kullanacak, binlerce ziyaretçin yoksa performans farkını pek hisssetmezsin.

Son olarak görsel ne amaçla yükleniyor bilmiyorum ama içeriğini yeniden şekillendirmek bir çözüm olabilir. Örneğin profil resimleri için mutlaka sunucu tarafından kırpılması gerek ya da normal resimler için de uygun olan bir şekilde en ve boydan 1 piksellik kısmı atıp yeni bir formatta kaydedersin.

.htaccess sihirli bir değnek gibi resmen, sadece belirli dosyaların çalışmasını sağlayabilirsin. Eğer root yetkisine de sahipsen subdomain için bir kullanıcı oluşturup yetkilerini sınırlandırabilirsin. Bir kod/komut çalıştırılsa da en azından dosyaları komple silemez.
 

 

no time for caution

gokhanweb gokhanweb WM Aracı Kullanıcı
  • Üyelik 11.01.2018
  • Yaş/Cinsiyet 40 / E
  • Meslek Yazılım Geliştiricisi
  • Konum Kırşehir
  • Ad Soyad G** B**
  • Mesajlar 1
  • Beğeniler 0 / 1
  • Ticaret 0, (%0)
Merhaba. regex fonksiyonları bu basit işlem için fazla yorucudur. C stdlib ile gelen fonksiyonlar diğerlerine göre çok daha hızlı çalışırlar.
Şöyle basit bir fonksiyon ile almanız daha doğrudur.

function uzanti($dosya)
{
if (false !== $pos = strrpos($dosya, ".")) {
return substr($dosya, $pos + 1);
}
return null;
}


Alternatif olarak aşağıdaki fonksiyonu da kullanabilirsiniz. Yukarıdaki fonksiyon aşağıdakinden %95 oranında daha hızlı çalışır (8 çekirdekli ryzen cpu ile test edilmiştir).

function uzanti2($dosya)
{
$arr = explode(".", $dosya);
if (count($arr) < 2) {
return null;
}
return end($arr);
}


Yukarıdaki her iki fonksiyon da uzantısı olmayan dosyalar için null döndürür. Son karakteri "." olan dosyalar için ise boş string döndürür. Bu yüzden dönen değerler aşağıdaki gibi kontrol edilmelidir:

$ext = uzanti("dosya.jpg.exe");
if ($ext == "") {
exit("uzantisiz dosya girilmis.");
}
0ktay

kişi bu mesajı beğendi.

wmaraci
wmaraci

0ktay 0ktay strdex Kullanıcı
  • Üyelik 01.02.2018
  • Yaş/Cinsiyet 26 / E
  • Meslek Yazılım öğrencisi
  • Konum Antalya
  • Ad Soyad O** Ş**
  • Mesajlar 603
  • Beğeniler 25 / 155
  • Ticaret 2, (%100)
Teşekkürler arkadaşlar daha kolay bir yol buldum.

Yüklenen dosyaların içeriğini okutup her satırı diziye atıyorum in_array ile dizinin indislerinde Yasaklı kod varmı diye baktırıyorum. Var ise else döndürüyorum.

Yasaklı listemde ise 30'dan fazla kod var bunlardan iki tanesi shell_exec ile exec fonksiyonları.

gokhanweb , Decimas Teşekkürler.
 

 

Eğitimin pahalı olduğunu düşünüyorsanız, cehaletin bedelini hesaplayın.
wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al