09-09-2017, Saat: 06:47 PM
SQL Injection, veri odaklı uygulamalarda tabanda çalışan SQL dili özelliklerinden yararlanılarak varsayılan 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 yararlanır. Örneğin; uygulama üzerinde girilen kullanıcı verisine SQL ifadeleri gömülür ve bu veri içeriği uygulama içerisinde filtrelenmiyorsa, beklenmedik bir biçimde 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 yolla gelecek saldırıları düşünmesi oldukça güçtür. Çoğunlukla web siteleri için kullanılan bir saldırı türü olarak bilinen SQL Injection, SQL veritabanına ait tüm uygulamalar için denenebilir bir ataktır.
2012 yılında yapılan bir çalışmada, güvenlik şirketi olan Imperva'nın web uygulamaları için gözlemlediği "Ay başına 4 atak" seferberliğinde perakendeciler ve diğer sanayi kuruluşlarının iki kat daha fazla atak aldıkları gözlemlenmiştir.
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.
SQL Injection'da 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:
Yukarıdaki SQL sorgusunda kullaniciAdi alanına kullanıcı girdisi gelecek ve 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, bulunmuyorsa 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:
SQL verisini giriş verisi olarak gönderirsek, uygulama tabanında çalışacak sorgu:
Yukarıdaki biçimde 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ı hâline getirme karakterlerini kullanarak:
olumlu sonuç elde edilir. Bu karakterlerden sonra gelen tüm karakterler yorum niteliği kazanacak, bir önemi kalmayacaktır.
Basitçe SQL enjeksiyonu hakkında verdiğim bilgilerin özgün anlatımlarımla devamı gelecektir. Açık tespiti, SQL Injection açıklarının önlenmesi ve benzeri konulara ilerleyen makalelerimde değinmeyi düşünüyorum.
SQL Injection, uygulama yazılımları içindeki güvenlik açığından yararlanır. Örneğin; uygulama üzerinde girilen kullanıcı verisine SQL ifadeleri gömülür ve bu veri içeriği uygulama içerisinde filtrelenmiyorsa, beklenmedik bir biçimde 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 yolla gelecek saldırıları düşünmesi oldukça güçtür. Çoğunlukla web siteleri için kullanılan bir saldırı türü olarak bilinen SQL Injection, SQL veritabanına ait tüm uygulamalar için denenebilir bir ataktır.
2012 yılında yapılan bir çalışmada, güvenlik şirketi olan Imperva'nın web uygulamaları için gözlemlediği "Ay başına 4 atak" seferberliğinde perakendeciler ve diğer sanayi kuruluşlarının iki kat daha fazla atak aldıkları gözlemlenmiştir.
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.
SQL Injection'da 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:
PHP Kod:
sorgu = "SELECT * FROM kullanicilar WHERE isim =' " + kullaniciAdi + " ';"
PHP Kod:
' or '1'='1
PHP Kod:
sorgu = "SELECT * FROM kullanicilar WHERE isim =' " + kullaniciAdi ' or '1' = '1 + " ';"
Yukarıdaki biçimde 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ı hâline getirme karakterlerini kullanarak:
PHP Kod:
' or '1'='1' --
' or '1'='1' ({
' or '1'='1' /*
olumlu sonuç elde edilir. Bu karakterlerden sonra gelen tüm karakterler yorum niteliği kazanacak, bir önemi kalmayacaktır.
Basitçe SQL enjeksiyonu hakkında verdiğim bilgilerin özgün anlatımlarımla devamı gelecektir. Açık tespiti, SQL Injection açıklarının önlenmesi ve benzeri konulara ilerleyen makalelerimde değinmeyi düşünüyorum.
