Web kök dizinindeki yedek kaynak kodunu sızdırır
Büyük bir dosyayı düzenlemeden önce yapılacak doğal hamle, önce onu kopyalamaktır. cp index.php index.php.vor-aenderung, sonra çalışmaya koyulmak. Bu dosya web sunucusunun yayımladığı dizinde duruyorsa, kaynak kodunun tamamı az önce düz metin olarak indirilebilir hâle gelmiştir — veritabanı erişim bilgileri, gizli anahtarlar, dosyada ne varsa.
Apache index.php dosyasını PHP üzerinden çalıştırır, çünkü adının sonu .php. index.php.vor-aenderung ise şununla bitmiyor: .php. Adının sonu .vor-aenderung, Apache'nin hiç duymadığı bir uzantı; bu yüzden varsayılanı yapar ve baytları olduğu gibi gönderir.
Çoğu kişinin yazdığı kural ve neden yetmediği
Olağan önlem, uzantılardan oluşan bir yasak listesidir: .bak, .orig, .save, .sql, .old. Akla gelen dosyayı yakalar. Burada denendiğinde bu liste probe.bak için doğru, aşağıdakilerin her biri için ise yanlış yanıt verdi:
index.php.vor-xyz— gerçekte böyle olduindex.php.2026-08-19index.php.kopiestyle.css.altindex.php.1
Hepsi 200 ile sunuldu. Kimsenin aklına gelmeyen adlandırma kalıbı, kullanılan kalıp olur, çünkü yedeklere o sırada ne yapılıyorsa ona göre ad verilir.
Ayrımı tersine çevirmek
İşe yarayan kural hangi uzantıların yasak olduğunu sormaz. Yapısal bir soru sorar: bu dosya adında, sonda olmayan bir kaynak kodu uzantısı var mı?
Varsa, ardından gelen ek ne derse desin, bu çalıştırılmak üzere yazılmış bir şeyin kopyasıdır. index.php.anything eşleşir. style.css.anything eşleşir. Desen henüz kimsenin icat etmediği adları da kapsar; bütün mesele de budur.
Bugün canlı sunucuda denendiğinde yukarıdaki beş adın beşi de artık 403 döndürüyor, var olmayanlar dâhil — kural dosyayı değil, biçimi reddediyor.
İstisna ve öğrettikleri
Buradaki meşru bir dosya adı tam da bu biçimde: önceden sıkıştırılmış dosyaların adı style.css.1787777226.gz, yani adın ortasında bilerek bir uzantı var. Bu yüzden kural tek ve dar bir istisna içerir: sayısal bir bölüm ve ardından .gz; bu dosya da olması gerektiği gibi 200 döndürür.
Bu tür kurallar genellikle böyle bir istisnada ters gider; bu yüzden bu istisnayı neyin güvenli kıldığını söylemeye değer: istisna o kadar dar ki kaynağı geri almak için hiçbir index.php.something.gz kurulamaz, çünkü ortadaki bölüm yalnızca rakamlardan oluşmalıdır. Daha geniş bir istisna — “.gz ile biten her şey” — kuralın tamamını etkisiz kılardı.
Yine de en basit tavsiye, bütün bunları gereksiz kılan tavsiyedir: yedekleri yayımlanan dizinin dışında tutun. Kural, bunun unutulduğu gün için bir güvenlik ağıdır; kopyanın nereye düştüğünü umursamamak için bir izin değildir.