Sayfalar

8 Temmuz 2010 Perşembe

RFI-LFI Security - AKINCILAR

Remote File Include Attack Methods

File Inclusion atakları, genel bir tabir olmasına rağmen çoğunlukla PHP mimarisi üzerine kurulu sistemlerde karşımıza çıkmaktadır. Gerek sistemi tasarlayıp inşa eden yazılımcının deneyimsiz oluşu, gerek PHP`nin yapısının güvenlik zafiyetlerine müsait oluşu ve gerekse yazılımcıların güvenlik tarafını hafife almaları, güvenlik açıklarıyla sık olarak karşılaşmamıza sebep olmaktadır ve File Inclusion atakları, hem remote olarak hem de local olarak yapılabileceği için iki türlü de sistem zarar görmektedir.
Sistemlerinizin zarar görmemesi için, göreceği zararı en aza indirgemek için bu atakların nasıl yapıldığını göstermeye çalışıp, korunma yollarından bahsedeceğim.

File Include Açıkları Nasıl Oluşur?

Yukarıda da bahsettiğim gibi, kullandığınız dilin mimarisi bu açıkların oluşmasına farklı nitelikte zeminler hazırlayabilir. Ama bu hususa en çok PHP yazılımcılarının dikkat etmesi gerekmektedir. Dilin mimarisinin esnekliği ve open source bir teknoloji olması nedeniyle, tüm yükümlülük yazılımcıya düşmekte ve yazılımcının sistem tarafında alacağı önlemler ile bu ataklar etkisiz kılınabilmektedir.

Şimdi FI ataklarını mümkün kılan kodlara göz atalım;

Files
$page = $_GET[page];
include($page);
?>

Burada görüldüğü üzere $page değişkeni veya değişkenin aldığı değerler hiçbir filtrelemeye tabi tutulmadan direkt olarak web sayfasına yönlendirilmektedir. (Kesinlikle Formlar ve QueryStringler arası geçişte kullandığınız değişkenlerden aldığınız değerleri filtrelemeden kullanmayın)
Kullanıcılar Files linkine tıkladığında index.php?page=file1.php gibi bir linke yönlenecek ve URL bu hali alacaktır. File1.php sayfası, index.php sayfasının kullandığı “page” parametresi üzerinden sayfaya include edildiğinden ve bu değişkenin aldığı değer kontrol edilip filtrelenmediğinden dolayı bu değişken üzerinden sisteminize yapılacak FI ataklarından, sizin açınızdan olumsuz olsa da, başarılı sonuçlar alınacaktır.

File Include Atakları Nasıl Yapılır ?

Senaryomuzdan devam edecek olursak;

$page değişkeninin aldığı değeri kontrol etmediğimizden dolayı, bu değişkene istediğimiz her değeri atayabiliriz. Eğer sisteminiz bir *nix sunucu da barınıyorsa, çeşitli PHP fonksiyonlarını içeren dosyamızı değişkene atayarak sistemde PHP komutları çalıştırabilir ki bu Remote File Inclusion olarak geçmektedir. Ya da *nix sunuculara has komutları bu değişken üzerinden çalıştırıp, sisteminiz ve bulunduğunuz server hakkında kritik bilgilere ulaşılabilir ki bu da Local File Inclusion atakları olarak isimlendirilmektedir.
Ayrıca, ileri düzey FI yöntemlerine değinecek olursak;
- SecurePHP kullanan sistemlerde, FI zafiyeti bulunsa dahi HTTP protokolü üzerinden sayfalar include edilememektedir. Bu bir nevi geçici bir çözüm olsa bile, SecurePHP`nin yanlış yapılandırılması nedeniyle HTTP protokolü yerine FTP protokolü üzerinden sayfalar include edilebilmektedir.
- Ayrıca PHP5 kullanan ve FI zafiyeti mevcut olan sistemlerde, yerel ağ üzerinden herhangi bir bilgisayarın IP numarası yardımıyla, o bilgisayardan bir dosya include etmekte mümkündür.
Gelişmiş ve etkili olabilecek FI yöntemlerine değinmiş bulunduk, çözümlerinizi bu çerçevede geliştirmeniz atakları tamamen engellemenizi sağlayacaktır.

File Include Ataklarından Nasıl Korunulur ?

Açıkların nasıl oluştuğunu ve atakların nasıl düzenlenebileceğini kavradığınız zaman, yapmanız gerekenler şunlardır;
- Kullanıcıdan aldığınız verileri ve input alanlarını filtreleyiniz ve değişkenlere öyle atama yapınız.
- SecurePHP güvenlik sistemini kullanınız.
- php.ini yapılandırmanızı iyi yapınız.
- Server kullanıcı grupları permissionlarını ayarlamayı unutmayınız.

Server üzerinde alınması gereken önlemler ?

(Remote File Include) attacklarından kısmen korunmak için;

"php.ini" yapılandırmasına geçmeden önce sunucumuzda bulunan klasör ve dosya izinlerini "chmod" doğru şekilde ayarlayalım. Genelde FTP programlarında dosya yada klasör üzerine "sağ click" yapılıp yada "file" seçeneğinden "Change Attributes ya da Properties / CHMOD" seçeneklerinden düzenleriz burada "permissions" altında yani izinler altında önerilenleri girmek en uygunudur.

Klasörler için: 755
Dosyalar için: 644

İzinleri bu şekilde ayarlamanız güvenlik için ilk adımı atmanıza yardımcı olur.

"php.ini" yapılandırması:

Eğer server admini iseniz yani root yetkilere sahipseniz bu ayarları serverda bulunan tüm siteler için yapabilirsiniz genellikle "/usr/local/Zend/etc/" , "/usr/local/lib/" altında bulunur "php.ini" dosyasını açarak düzenleyebilirsiniz veya "httpd.conf" dosyasının doğru yapılandırılmasıyla da olur. Daha sonra apache’ye restart atmanız gerekmektedir.
Root değilseniz sadece kendi siteniz için yapmanız gerekiyorsa kök dizininizde (public_html) bir "php.ini" dosyası oluşturarak veya varolan "php.ini" dosyasının içerisine altta verdiğim kodları ekleyerek güvenliğinizi sağlayabilirsiniz. Fakat sitenizle aynı serverda bulunan diğer sitelerden kaynaklanan açıklardan yararlanan kişiler root olmayı başarırlarsa burada anlatılanlar yetersiz kalır, root olmayı başaramazlarsa ve sitenizin şifrelerini kaptırmazsanız güvendesinizdir.
Altta anlattığım bilgiler iyi bir güvenlik için yapılması gerekenler olduğundan dolayı bunları uyguladıktan sonra bazı scriptlerinizin çalışması engellenmiş olabilir. Ama scriptin çalışmasını engelleyen değerleri iptal ederseniz script tekrar doğru şekilde çalışacaktır.

Şimdi gelelim "php.ini" yapılandırmasına:

"disable_functions" (Güvenlik)
"disable_functions" ile serverınızda birçok fonksiyonun çalışmasını engelleyebilirsiniz bu sayede sitenize inject edilen scriptler, sheller için güvenliğinizi almış olursunuz. Bu kadar fonksiyon fazla gelebilir ama iyi bir güvenlik için şart. Bu kadar sayıda devre dışı bırakılan fonksiyonlar ilk defa "*bir hainin sitesi*" adresinde verilmiştir.

Önerilen:

1-
disable_functions = foreach, glob, openbasedir, posix_getpwuid, f_open, system,dl, array_compare, array_user_key_compare, passthru, cat, exec, popen, proc_close, proc_get_status, proc_nice, proc_open, escapeshellcmd, escapeshellarg, show_source, posix_mkfifo, ini_restore, mysql_list_dbs, get_current_user, getmyuid, pconnect, link, symlink, fin, passthruexec, fileread, shell_exec, pcntl_exec, ini_alter, parse_ini_file, leak, apache_child_terminate, chown, posix_kill, posix_setpgid, posix_setsid, posix_setuid, proc_terminate, syslog, allow_url_fopen, fpassthru, execute, shell, curl_exec, chgrp, stream_select, passthru, socket_select, socket_create, socket_create_listen, socket_create_pair, socket_listen, socket_accept, socket_bind, socket_strerror, pcntl_fork, pcntl_signal, pcntl_waitpid, pcntl_wexitstatus, pcntl_wifexited, pcntl_wifsignaled, pcntl_wifstopped, pcntl_wstopsig, pcntl_wtermsig, openlog, apache_get_modules, apache_get_version, apache_getenv, apache_note, apache_setenv, virtual
Eğer bu kadar fonsiyonu devre dışı bırakmak fazla geldiyse alttaki gibi de ayarlayabilirsiniz bu da güvenliğiniz için yeterlidir:

2-
disable_functions = glob, posix_getpwuid, array_compare, array_user_key_compare, ini_restore, exec, proc_get_status, proc_nice, proc_open, allow_url_fopen, fin, pconnect, system, dl, passthruexec, shell_exec, proc_close, proc_get_status, chown, chgrp, escapeshellcmd, escapeshellarg, fileread, passthru, popen,curl_exec, shell, execute

"safe_mode" (Güvenlik)

"Safe Mode" adından da anlaşılacağı gibi "Güvenli Mod" anlamına geliyor. "Safe Mode" genelde birçok serverda "Off" durumdadır ve bu da birçok tehlikeye davetiye çıkaran unsurlar arasında yer alır. "Güvenli Modu Açık" durumuna getirmek shellerin serverımızda istedikleri gibi dolaşmalarını, exploitlerin çalıştırılmasını ve komutların execute edilmelerini önler. Günümüzde "açık olan güvenlik modunu" kapalı duruma getiren scriptler mevcut fakat altta anlatılan önlemlerle bunun da önüne geçilebilir.

Önerilen:

safe_mode = on


Not: Serveriniz de bazı scriptler de hatalar alabilirsiniz.Fakat serverin genel anlamda güvenliğini sağlamış olursunuz.Server da Root yetkisi alamayan hiçkimse sunucuya kolay kolay zarar veremeyecektir.