28 Ekim 2014 Salı

SQL Injection

     SQL Injection, veri odaklı uygulamalarda tabanda çalışan SQL dili özelliklerinden faydalanılarak standart uygulama ekranındaki ilgili alana ek SQL ifadelerini ekleyerek yapılan bir tür atak tekniğidir. SQL Injection, uygulama yazılımları içindeki güvenlik açığından faydalanır. Örneğin, uygulama üzerinde girilen kullanıcı verisine SQL ifadeleri gömülür ve bu veri içeriği uygulama içerisinde filtre edilmiyorsa beklenmedik bir şekilde uygulamanın hata vermeden çalıştığı görülür. Bu saldırı diğer saldırılardan farklı bir atak tipi olduğu için yazılım geliştiricilerin bu açıdan saldırı geleceğini düşünmesi oldukça güçtür. Çoğunlukla web siteleri için kullanılan bir saldırı türü olarak bilinse de SQL veritabanına ait tüm uygulamalar için denenebilir bir ataktır.
     2012'de yapılan bir çalışmada, güvenlik şirketi olan Imperva'nın web uygulamalarında gözlemlemiş olduğu 'Ay başına 4 atak' seferberliğinde perakendeciler ve diğer sanayi kuruluşlarının 2 kat daha fazla atak aldıkları gözlemlendi.
Tarih
    SQL Injection üzerindeki ilk kamu tartışmaları 1998 yılında başlamıştır. 1998'de Phrak dergisinde yayımlanan bir makalede bundan söz edilmiştir.
Teknik Uygulamaları
Saldırgan, uygulama üzerinde kullanıcı giriş ifadesine SQL ifadeleri ekleyerek güvenlik açığı arar. Bunu gerçekleştirebilmek için SQL ifadelerini ve sözdizimini yeteri kadar bilmek gerekir. Aşağıdaki kod satırı, bu güvenlik açığını göstermektedir:
sorgu = "SELECT * FROM kullanicilar WHERE isim =' " + kullaniciAdi + " ';"
Yukarıdaki SQL sorgusunda kullaniciAdi alanına kullanıcı girdisi gelecektir, bu girdiye göre veritabanında arama yapılacak ve sonuç olumlu ise yazılımcının belirlediği işlemler gerçekleşecektir. Bu işlemler muhtemelen arayüzünde kullanıcıAdi verisi girişi için bir alana sahip ve bu veriye göre sisteme dahil edilme işlemini ayarlayan uygulama yazılımıdır. Arka planda girilen veriye göre veritabanında karşılaştırma yapacak ve veri veritabanında bulunuyor ise sisteme giriş sağlanacak, bulunmuyor ise sağlanmayacaktır. Günümüzde uygulamalar güvenliğin daha üst düzey olması için kullanıcı adı verisinin yanında parola da istemektedirler. Burada SQL Injection atağının etkili olabileceği bir açık varsa aşağıdaki şekilde:

' or '1' = '1 
SQL verisini giriş verisi olarak gönderir isek uygulama tabanında çalışacak sorgu:
sorgu = "SELECT * FROM kullanicilar WHERE isim =' " + kullaniciAdi ' or '1' = '1 + " ';"

şeklinde olur. kullaniciAdi verisi ne olursa olsun '1'='1' koşulu sağlanacağından ve aradaki işlemin OR olmasından dolayı sorgu sonucu her zaman olumlu olacaktır ya da SQL sözdiziminin yorum satırı haline getirme karakterlerini kullanarak:

' or '1' = '1 '--
' or '1' = '1' ({
' or '1' = '1'  /*
olumlu sonuç elde edilir. Bu karakterlerden sonra gelen tüm karakterler yorum niteliği kazanacaktır ve bir önemi kalmayacaktır.

Dispatcher property kullanımı


      WPF uygulamanızda threadleri kullanarak bir şeyler gerçekleştirmeye çalışırken (multithreading) "thread kaynağa erişemiyor hatası" almanız muhtemeldir. Bu hatayı Visual Studio IDE'si 'Başka bir iş parçacıcığına ait olduğundan çağıran iş parçacığı bu nesneye erişemiyor.' (ya da İngilizce olarak 'The calling thread cannot access this object because a different thread is own it.')  şeklinde mesaj kutusu olarak görüntüler. Alınan bu hatanın nedeni sizin ana thread'inizin (siz oluşturmasanız dahi bir program açıldığında o program bir iş parçacığı yani bir thread tarafından yürütülür, bu ana thread'tir. Diğer oluşturulan threadler eş zamanlı çalışma ve çalışma yükü hafiflesin diye oluşturulur.) kullanabileceği GUI nesnesine (button, listbox, textbox gibi) başka bir thread tarafından gelen erişim isteğidir. Başka bir thread bu nesnelere direkt olarak erişemez. Örnek ile gösterirsem:


Yukarıdaki örnekte ana thread'in ulaşabileceği myTextBox textbox'una, oluşturulmuş olan yeni bir thread erişerek textini değiştirmeyi amaçlamıştır. Fakat göründüğü üzre yukarıda bahsettiğim hata mesajı dönmüş. Bu hataya bir çözüm olarak nesnenin Dispatcher (sevk eden olarak çevirilebilir) property'sinin (özelliğinin) BeginInvoke metodu kullanılarak ve ilgili parametre olarak delegate bir metod oluşturarak üstesinden gelebiliriz. Bahsetmiş olduğum çözüm:


Böylece delegate bir metod yardımı ile ilgili thread'in erişimi altındaki nesneye müdahale edebiliriz.

11 Ekim 2014 Cumartesi

VirtualBox içindeki sanal işletim sisteminin sabit diskini resize etme

          Virtual Box ile sanal makine oluşturma işlemi gerçekleştirirken sanal makinemizin sanal sabit sürücüsünün boyutunu megabayt cinsinden belirleriz. Bu sanal sürücü boyutu, sabit diskte depolanabilecek bir sanal makine dosya verisinin miktarını sınırlandırır. Sanal makinemizi oluşturduktan sonra bazı durumlarda sanal sabit diskte yere ihtiyacımız olabilmektedir. Virtual Box IDE'si arayüzü üzerinde ne yazık ki bu alanı değiştiremiyoruz. Bu sebepten dolayı farklı bir çözüm yolu bulmalıyız. Ben yakın bir zaman önce bu problem ile karşılaştım ve şu çözümü buldum. Gerçek işletim sistemim Windows 8.1'de sanal olarak çalıştırdığım işletim sistemi Ubuntu için cmd ekranını açarak aşağıdaki şekilde sabit diski resize ettim;

1.   İlk olarak cmd komut satırına, VBoxManage uygulamasının bulunduğu dizine geçmek için;

       cd C:\Program Files\Oracle\VirtualBox

yazıyoruz. Böylelikle bu dizin içerisindeki VBoxManage uygulamasını komut satırına direkt VBoxManage yazarak çalıştırabileceğiz. Sizin path'iniz farklı olabilir, buna dikkat edin.

2.   Cmd komut istemcisine ;

       VBoxManage modifyhd --resize <Ne kadar boyutlu olsun istiyorsanız (MB cinsinden)> "vdi uzantılı sanal makinezin path'i"

yazarak işlemi gerçekleştirebiliriz.




Yukarıda benim yaptığım örneğin ekran görüntüsü bulunmaktadır. Bu işlemde yetersiz alan resize etmek kayıplara yol açabileceğinden MB cinsinden olan değere dikkat edilmelidir. Gerçek işletim sistemi olarak ubuntu kullanıyorsanız uçbirime aşağıdaki şekilde komut yazmak aynı işlevi görecektir.

   VBoxManage modifyhd <sanal makinenin yolu> --resize <yeni size>

Tabiki bu komutu yazarken VBoxManage'in bulunduğu dizinde olmamız gerekmektedir. Eğer değil isek VBoxManage'in path'ini aynı bölüme çift tırnak işareti arasında yazarken işlem gerçekleşecektir.

10 Ekim 2014 Cuma

NetBIOS (139. port) portunu disable etme

      İşletim sistemimiz üzerinde bu portun açık olup olmadığını öğrenmek için eğer işletim sistemimiz windows ise cmd.exe'yi çalıştırıp komut satırına  netstat -an yazarak görebiliriz. Ayrıca bu komut listening durumda (yani bir istek dinleyen, açık) olan tüm portları gösterecektir. Eğer işletim sistemimiz windows değilse nmap aracını sistemimize kurup (buradan indirebilirsiniz: http://nmap.org/download.html) kullanarak port taraması gerçekleştirebiliriz. 139 numaralı yani NetBIOS portu, ağ üzerindeki dosya ve yazıcı paylaşımını gerçekleştirmek için kullanılır. Bir işyerinde birden çok bilgisayarın aynı dosyalara ve yazıcıya erişimini sağlar. Herhangi bir yolla dışarıdan ağa sızan yabancı bir bilgisayar da aynı şekilde bu yolla paylaşımdaki sürücü ve dosyalara erişebilir. Bu nedenle tek bilgisayar kullananlar, bu portu kapalı tutmalıdırlar (güvenlik açısından 139 nolu portun kapatılması önerilir). Bu portu kapatmak için Windows'un eski sayılmayan sürümlerinde aşağıdaki benzer şekilde kapatabiliriz. Aşağıdaki örnek Windows 8 işletim sisteminde gerçekleştirilmiştir.




Ağ ve Paylaşım Merkezi > yerel ağ bağlantınız>Özellikler>Internet Protocol Surum 4 Ozellikler >Gelismis>WINS tabı altındaki NetBIOS'u devre dısı bırak seçenekleri takip edilerek işlem onaylanır. Böylelikle 139. port yani NetBIOS devre dışı bırakılmış olunur.