• Bugün, 04:34:47
    #1
    LFI (Local File Inclusion), bir web uygulamasının kullanıcıdan aldığı dosya veya sayfa bilgisini yeterli kontrol yapmadan sunucudaki dosyalara erişmek için kullanması sonucu oluşan güvenlik açığıdır.

    Örneğin bir PHP sayfasında şu tarz bir yapı varsa;

    include($_GET['page'] . '.php');
    normal kullanım şu şekilde olabilir;

    ?page=anasayfa
    Ancak kullanıcı tarafından gönderilen page değeri yeterince kontrol edilmiyorsa, saldırgan dizinler arasında gezinmeye çalışarak uygulamanın erişmemesi gereken yerel dosyaları okutmayı deneyebilir.

    Örneğin mantık olarak şu tür bir giriş denenebilir;

    ?page=../../../../dosya
    Buradaki ../ ifadesi bir üst dizine çıkmayı ifade eder. Eğer uygulama bu değeri doğrudan dosya yoluna ekliyorsa beklenmeyen dosyalara erişim riski oluşabilir.

    Sadece ".php" eklemek veya birkaç karakteri engellemek LFI açığını tamamen önlemek için yeterli değildir.

    LFI açıklarını önlemek için kullanıcıdan doğrudan dosya yolu alınmamalı, izin verilen sayfalar whitelist mantığıyla önceden tanımlanmalı ve include/require işlemlerinde yalnızca güvenilir sabit yollar kullanılmalıdır.
  • Bugün, 08:10:14
    #2
    Hocam, açıklayıcı konu için teşekkürler. Birkaç ek:
    Dosya yolu kullanılacaksa realpath() ile çözümlenen yolun izin verilen dizinin içinde kaldığı doğrulanmalı; yalnız basename() kullanmak tek başına yeterli bir güvenlik sınırı sayılmamalı.
    PHP yapılandırmasında allow_url_include=Off olması, LFI'nin uzaktan dosya dahil etmeye (RFI) genişlemesi riskini azaltır. open_basedir de PHP'nin erişebileceği dizinleri daraltan ek bir katmandır.
    Tarihsel olarak PHP 5.3.4 öncesinde null byte ile sona eklenen uzantı kesilebildiği için ".php eklemek yeterli değil" uyarısı bugün de geçerli bir alışkanlık. Ayrıca log veya oturum dosyalarının include edilebilmesi, LFI'yi kod çalıştırma riskine dönüştürebilir; bu yüzden bu dosyaların web kullanıcısı tarafından okunabilir olmaması da önemli.
  • Bugün, 09:39:58
    #3
    Güzel içerik. Ben de bu zaafiyetin olmaması için bir örnek bırakayım.

    <?php
    $pages = ['anasayfa', 'kunye', 'iletisim'];
    
    if (in_array($_GET['page'], $pages)) {
        include_once $_GET['page'] . '.php';
    } else {
        echo 'Sayfa bulunamadı!';
        exit;
    }
    unset($pages);
    
    ?>