Php İle Güvenlik

Embed Size (px)

Citation preview

  • 8/14/2019 Php le Gvenlik

    1/6

    PHP ile Gvenlik

    ncelikle bu makaleyi, yeni balayan veya orta dzey PHP programlaycsnahitap olmas iin gereken gayret gsterilmitir. Orta dzey diyorum nk birok kereahit olduum zere, PHP ile portal kodlayan ancak gvenlikten anlamayan ok

    kiiye ahit oldum.Bu makalede; Iframe virs, SQL Injection, RFI - LFI (Remote File Include -

    Local File Include), XSS, CSRF ve SESSION ile scriptiniz nasl gvenlikten mahrumolur ve bunlardan nasl kurtuluruz onu greceiz.

    PHP ile kodladnz scripte dardan nasl szlr onu bir renelim.

    SQL INJECTION - Kurtulmak iin gerekenler...Mesela SQL Injection dediimiz ve gnmzde en ok kullanlan metodu ele

    alalm. imdi veritabanna bir query gnderiyoruz mesela ve diyelim ki basit bir loginilemimiz ve bir querymiz olsun.

    $name = $_POST['username'];$pass = $_POST['pass'];$sorgu = mysql_query("SELECT Count(id) FROM users WHERE name='$name' AN

    D pass='$pass';");

    Grdnz gibi formdan gelen bilgileri direk olarak mySQL sorgusunaekledik ve isim ve ifreyi sorguladk. Ancak formdan gelen bilgiler szlmedii iin,baz ne idi belirsiz, hayat felsefesi insanlara zarar vermekten baka bir ey olmayanhacker denilen art niyetli zararl ahslar;

    ncelikle forma u bilgileri girerler; username alanna ' or 1=1 girerler, passalanna ise asdasdasqweqweqwe gibi karakterler girerler. qweqweqwe gibi karakterler

    girmelerinin sebebi, sizin formu gnderildikten sonra pass alannn bo olduundahata verdirmenizden trdr.imdi bu ekilde girilen bilgiler olunca SQL sorgumuz ne hale geliyor bir ona

    bakalm.

    mysql_query("SELECT Count(id) FROM users WHERE name='' or 1=1 --' AND pass='asdasdasqweqweqwe'");

    SQLde -- karakterlerinden sonra gelen ksm, olduu gibi aklama olarakkald. Yani 'AND pass='asdasdasqweqweqwe' ksm, burada bildiiniz aklamametni haline geldi ve bir ie yararl kalmad.

    Bu ekilde bir login durumu ile 1=1 ile direk olarak admin olarak login olmuoldu. Genelde 1. id numaral satrda admin kaytldr. O yzden direk olarak adminolarak login olmu oldu. Bunun sebebi ise ' veya " karakteridir. Bu karakterler eerstring olarak tantlmazsa, formdan gelen bilgiler otomatik olarak SQL sorgusunadnm oluyor. Bundan kurtulmak iin ise yapmamz gereken ey ok basit.Formdan gelen bilgileri escape ederek kurtulabiliriz ancak. Bu zararldan kurtulmakiin PHP dili bize bir avantaj olarak mysql_real_escape_string ve yamysql_escape_string fonksiyonlarn oluturmutur. Bu fonksiyonlar kullanmak iinncelikle veritaban balants yapmanz lazm. Sonrasnda ise, fonksiyonlarkullanabilirsiniz.

    rnek kullanm ekli u haldedir.

    $name = mysql_real_escape_string($_POST['username']);$pass = mysql_real_escape_string($_POST['pass']);

  • 8/14/2019 Php le Gvenlik

    2/6

    $sorgu = mysql_query("SELECT Count(id) FROM users WHERE name='$name' AND pass='$pass';");

    imdi bu fonksiyon ile szlen veri, SQL sorgusuna nasl yansr ona bakalm;

    mysql_query("SELECT Count(id) FROM users WHERE name='\' or 1=1 --' ANDpass='asdasdasqweqweqwe'");

    Grdnz gibi ' ve " karakterleri hemen escape ediliyor. Yani \' \" eklindekaydolduu iin, SQL sorgusu olmaktan kp string olduunu mySQLe bildirmioluyoruz. SQL Injectiondan kurtulduk mu peki bu kadaryla? Tabii ki hayr.

    Siz de bilirsiniz ki, SQL sorgularn sadece loginde kullanmyoruz. O yzdennemli bir rnei vermeden geemeyeceim.

    imdi escape fonksiyonumuzun ismine bir gz atalm.mysql_real_escape_string(); Yani bu fonksiyon, sadece string trn destekler.

    Eee, bizler http://site.com/index.php?topic_no=12312312olarak gelen integertrndeki verileri nasl szeceiz yle ise? Bu da ok basittir. Ancak bu bilgiyiatlarsanz, btn DB bilgilerinizi alarlar ama haberiniz olmaz.

    $topic_no = $_GET['topic_no'];

    Dersek, SQL sorgumuzda yine ' " gibi karakterlerle saldrya urarz. O yzdendorusu bu ekilde olmaldr.

    $topic_no = intval($_GET['topic_no']);$topic_no = str_replace("-","",$topic_no);

    Integer alann sorgulayacamz iin intval ile integer validasyon etmi

    oluyoruz. Yani GET ile gelen verimiz "1231231231hebelehubele" ise, intval sayesinde"1231231231" oluyor. Yani fonksiyonumuz ilk karakterden itibaren tek tek herkarakteri sona kadar inceliyor gelen veriyi ve eer ilk karakter herhangi bir rakam ise, yani 12313 gibi balyorsa, dngye devam ediyor, ama asd gibi string tre denkgeliyorsa orada dng break; olup sonlanyor. Ve bize soldan itibaren ald rakamlarveriyor. Eer ilk karakter string olsayd, o zaman da dngden geri gelen deer 0oluyor. Veya balarna - gibi karakterler koyarak, mySQLde - integer tr idincelemeye kalkyor ve hata verdiriyor. O yzden - karakterlerini de replace etmektefayda var, bu dncem yanl ise dzeltin ltfen.

    Sorgulama yapacaksanz eer, muhakkak, COOKIE, SESSION, GET, POST ilegelen verileri muhakkak escape etmelisiniz! COOKIE ve SESSIONda deitirilebildii

    iin onlardan gelen verileri de szn yoksa hacklenmemenizi garanti edemem.Peki, sadece SQL Injection'dan kurtularak sitenin hacklenmesini engellemi

    olduk mu? Tabii ki hayr.

    RFI - LFI(Remote File Include - Local File Include) AndanKurtulmak

    RFI dediimiz olayn alm, Remote File Include, tercmesi de UzaktanDosya Eklemek olabilir. Bu olay, ilk olarak sunucunuzun SAFE MODEun OFFolmasndan kaynaklanr. ON olsa bile OFF yapma oyunlar mevcuttur tabi. Bu olaydabiz script ksmn ne kadar gvende tutsak bile, sunucunuzun gvenlii yine de nplana kyor maalesef ve o yzden yksek gvenlikli bir sunucuya gemenizi tavsiye

    ederim her zaman.

    http://site.com/index.php?topic_no=12312312http://site.com/index.php?topic_no=12312312
  • 8/14/2019 Php le Gvenlik

    3/6

    Neden diye soracak olursak mesela bizim scriptimizde herhangi bir sorun yokdiyelim. Her yerini gvenli yaptk. Ama hacker denilen zat gelir, sisteme shellsokuturur. Shell dediimiz zararl kod ile sizin btn dosyalarnz ele geirir, bu dademektir ki, scriptiniz kendinize ait paral bir script ise, bu scriptin alnmasnaneden olur. Ayrca Sql injection yapabilir. Dosya ykleyebilir. SQL yedeinizi olduu

    gibi alabilir. Yani bir nevi Cpanel eklinde bir kodlama diyebiliriz buna. Siz Cpaneldene yapabiliyorsanz, aynsn hemen hemen shellde grebilirsiniz. Tabi, suncuyuhacklemek iin kodland iin, sadece gerekli yerleri dzenlemek grmek amalyazlmtr.

    Adam gelir, config dosyanz aar, iinde DB bilgilerinizi alr. DB bilgilerinizigirerek mySQL alannza balanr. Sonra istedii tabloyu istedii gibi deitirerek ynlendirme kodu koyar. Aln size hacked. O yzden, config dosyalarnz dasaklamalsnz. Lamerlerden korunmak iin config dosyanzn ismi config olmasn veieriini ifreleyin ve eval ile altrn.

    Mesela config dosyanzn ierii yle olsun;

    $ayar['db']['host'] = 'localhost';$ayar['db']['name'] = 'veritabani_adi';$ayar['db']['user'] = 'username';$ayar['db']['pass'] = 'pass';

    Adam byle bir dosyay at gibi bilgiler eline hemen geer. O yzdenifreleme metoduyla ifreleyin. Daha sonra da ifrelenmi metni zerekeval($cozulmus_config_dosyas) deyince, yine ayn dosyann iindekileri alm olurve PHPye o deikenleri tantm olursunuz.

    Bu ksmlar getikten sonra RFI nasl yersiniz dersek, yle olabilir. Meselaindex sayfamzdan btn sayfalar aryoruz diyelim.

    http://site.com/index.php?sayfa=Anasayfa

    http://site.com/index.php?sayfa=Iletisim

    http://site.com/index.php?sayfa=Forum

    http://site.com/index.php?sayfa=Sikayet

    eklinde sayfalarmz ararak hangi sayfay include edeceimizi bildiriyoruz. PHPsayfamz da yle olsun.

    $sayfa = $_GET['sayfa'];include($sayfa . ".php");

    Byle bir kod ile biz GET ile gelen veriye ne yazarsak yazalm. Onu includeedecektir. Adam da gelir shell adresini oraya yazar ve shell ykler sunucunuza. TabiSAFE MODE kapal ise hackler sitenizi. Dorusu yle olmal;

    $sayfalar = array("Anasayfa" => "Anasayfa.php","Iletisim" => "Iletisim.php","Forum" => "Forum.php","Sikayet" => "Sikayet.php");

    $sayfa = $_GET['sayfa'];if(array_key_exists($sayfa,$sayfalar)){

    include ($sayfalar[$sayfa]);} else{

    echo "Sayfa ismi hatal, ltfen dorusunu girin";}

    http://hedehodo.com/index.php?sayfa=Anasayfahttp://hedehodo.com/index.php?sayfa=Iletisimhttp://hedehodo.com/index.php?sayfa=Forumhttp://hedehodo.com/index.php?sayfa=Sikayethttp://hedehodo.com/index.php?sayfa=Anasayfahttp://hedehodo.com/index.php?sayfa=Iletisimhttp://hedehodo.com/index.php?sayfa=Forumhttp://hedehodo.com/index.php?sayfa=Sikayet
  • 8/14/2019 Php le Gvenlik

    4/6

    Veya switch, if gibi deyimler ile de kontrol edilebilir. Bu ekilde ne yaparlarsa yapsnlar siz nceden belirttiiniz ve programa kontrol koyduunuz iin RFIyapamazlar.

    Bunu da basitiyle anlatm olduk. Daha da uzar gider aslnda da snrl olarakbrakyorum.

    XSS Enjekteden KurtulmakXSS (Cross Site Scripting - apraz Kod altrma) ise, HTML ve Javascript

    yardm ile siteyi ynlendirmek, sitede link vererek adminin COOKIE bilgilerinialmak. Mesela GET ile bir ID alyoruz u ekilde;

    http://site.com/index.php?cat_name=Belgesel

    Ancak biz bu kategori ismini szmeden alrsak yle olur.

    http://site.com/index.php?cat_name=alert(document.cookie)

    Byle bir linke eviririz. Siz de direk olarak szmeden sayfaya bunuyazdrrsanz, otomatik olarak sayfada bu Javascript kodu alacaktr. Veya diyelimki, bir yorum yazdracaksnz. HTML verilerini muhakkak szmeniz gerekmektedir.Yoksa adam yorum yazarken;

    location='http://www.hebelehubele.com/index.php';

    u zararl kodu da eklerse, o zaman yorumun yazld sayfa her alndamuhakkak o adrese ynlenir. Bunlardan nasl kurtuluruz dersek;

    $veri = $_POST['comment'];//Yorumu posttan aldk.$veri = strip_tags($veri);$veri = htmlentities($veri);$veri = htmlspecialchars($veri);

    Bu fonksiyonlardan birini kullanabilirsiniz. Eer strip_tags fonksiyonunukullanrsanz, POSTtan gelen verinin iinde, ne kadar HTML ve Javascriptkarakterleri varsa siler. Sadece geriye kalan string trndeki veriyi alr. Bir ziyaretidefteri iin en uygunu budur.

    Ancak forum portal veya blog tarz ise, kii HTML ve Javascript kodlarnpaylaabilecei iin, bu taglar silemezsiniz ama zararn da engellersiniz. Bunun iin

    htmlentities ve htmlspecialchars imdadnza yetiir. Bu fonksiyonlar neredeyse aynie yarar ama htmlspecialchars fonksiyonunda ek parametreler bildirebildiiniz iinhtmlspecialchars kullanmanz nerilir. Veriniz nereden gelirse gelsin, muhakkakszmeden almayn kaydetmeyin. Sonra banz armasn.

    Baka bir yer daha var. BBCODE uygulamalarnzda da bu szmeyiyapmazsanz XSS yersiniz.

    [url="javascript:alert(document.cookie);"]URL METN [/ url][img]javascript:location='http://google.com.tr';[/img]

    Bu ekilde rahata Javascript kodu altrabilirsiniz. O yzden bu verileri deszmek iin str_replace kullanmanz gerekir. Ayrca bir fonksiyonu grmedim ancak

    sizin bir fonksiyon yazp bu verileri szmeniz lazm. Yoksa BBCODE ile ok rahat,

    http://hedehodo.com/index.php?cat_name=Belgeselhttp://site.com/index.php?cat_name=%3Cscript%3Ealert(document.cookie)%3C/scripthttp://hedehodo.com/index.php?cat_name=Belgeselhttp://site.com/index.php?cat_name=%3Cscript%3Ealert(document.cookie)%3C/script
  • 8/14/2019 Php le Gvenlik

    5/6

    Javascript - HTML kodu altrabilirler. Grdnz gibi, hi ummadnzyerlerden ak kabiliyormu.

    Mesela bir arama yapyorsunuz. Aramanzda GET veya POST ile gelen metniolduu gibi ekrana bastrrsanz, XSS yemeniz, kanlmazdr.

    SESSION Hack'den korunmaDiyelim ki, bir login sayfamz var ve biz bu sayfadan login olan kiilereSESSIONda bir deer atadk diyelim.

    $_SESSION['login'] = "1";$_SESSION['tip'] = "admin";

    Adam hangi sayfaya girerse girsin hibir sorgulama yapmakszn direk olarakadminlii ilan etmi oluyor. SESSION deitirilemez sanan arkadalar, SESSIONuben de deitirilemeyeceini sanyordum ancak deitirilebildiini rendiimden beri, gzmde COOKIE kadar deeri kald. Bunu nasl deitirildiine dair ufakbilgilendirme yapacam. Muhakkak szmekte fayda var SESSION bilgilerini de.

    SESSION deimesi iin ncelikle ayn sunucudan bir baka kullancnn sizinSESSION deerlerinizi bilmesi gerekir.

    $_SESSION['login'] = '1';$_SESSION['tip'] = 'admin';header('Location: http://hackleneceksite.com/admin.php ');

    Bu ilemi yapmak iin ncelikle kar sitenin sizin SESSION deerlerinizibilmesi gerekir. Eer ayn sunucuda olurlarsa SESSION deerleri yznden sitenizhacklenir. O yzden, SESSION yznden scriptiniz hacklenirse, hemen aynsunucuda olan bir baka kullanc sayesinde hacklendiini bilmenizde fayda var.

    SESSIONda bu tip uygulamalar yapmayn yaparsanz zararl olursunuz.Evet, arkadalar demek ki artk ne yapacakmz? COOKIE, SESSION, GET,

    POST gibi dardan veri aldmzda muhakkak ama muhakkak verileri szecekmiiz.

    IFRAME Virs ve KurtuluuIFRAME virs nasl bular ncelikle ona bir gz atalm. Crackli FTP

    programlarndan veya sunucunuza bulam bir virs ise sunucunuzdan sayfalarnzabular.

    Nerelere bular? index, home, main, default kelimeleri geen tm dosyalarnza bular. Kurtuluu nedir? Crackli ftp programlarn kaldrn, FTP ifrenizi deitirin, dosyalarnzn

    iinde bulaan kodlar silin, Windowsun kendi FTP balantsn kullann. Eersorun zlmezse format atn tekrar batan itibaren ayn ilemleri yapn. Yinesorun zlmezse hosting salaycnzla grn ve onlar zsnlersorununuzu.

    Bu sorun genelde cuteFTP tipi crackli veya normal FTP programlarndanbular. O yzden korunmak iin bu tr programlar kullanmayn.

    Bir de CSRF(Cross Site Request Forgery) vardr hack yntemi ancak, u

    dnemde CSRF yiyen scriptler kaldn zannetmem. Kalsa bile ok eski

    http://hackleneceksite.com/admin.phphttp://hackleneceksite.com/admin.php
  • 8/14/2019 Php le Gvenlik

    6/6

    scriptlerdendir yiyenler. Bu ak da, mesela bir html sayfas oluturdunuz diyelim.yle diyelim;

    http://hackleneceksite.com/my_profil...=profiledelete

    gibi bir adresimiz olsun ve bu adreste post edilen bilgiler;

    http://hackleneceksite.com/my_profil...te&submit=true

    adresine ynlendirilsin. Sayfa iinde de

    byle birer input olsun. Bu adreste siteden memnun deil isek sitenin bize tand bir

    hak olsun profilimizi silmek iin. Burada posttan gelen check true ise ve emailgirilmi ise, hemen profili silme ilemine geiyor diyelim. O zaman biz de bir formoluturalm bir html sayfasnda u ekilde;

    Biz eer kullancnn bilgilerinden emailini biliyorsak;

    document.hack.submit();

    eklinde oluturduumuz html sayfasn kaydedelim ve taraycda altralm.alnca ne olur derseniz, tabi ki profil silinir nk grdnz gibi, profilbilgilerini posttan alyor. Tabi bunu ben sadece bir rnek olarak verdim, daha daalabilir bu rnek tabi ki...

    Mesela phpbb iin eski bir CSRF PM silme a;

    document.hack.submit();

    Tabi bunlardan kurtulmak iin muhakkak kendiniz, COOKIE veya SESSIONile name ve pass ekleyip oradan verileri SQL de sorgulatmanz gerekmektedir. Yoksa byle basit ilem hatalar yznden scriptinizde hasar ciddi olabilir. Ve geridnlemez de olabilir.

    http://hackleneceksite.com/my_profil...=profiledeletehttp://hackleneceksite.com/my_profile.php?do=profiledelete&submit=truehttp://hackleneceksite.com/my_profil...=profiledeletehttp://hackleneceksite.com/my_profile.php?do=profiledelete&submit=true