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.

Hiç yorum yok:

Yorum Gönder