2004 Yılında Win Net Magazine Dergi’sinde yayınlanan, SQL Enjeksiyon Saldırıları ve Savunma Yöntemleri konulu makalemde, temel düzeyde SQL Enjeksiyon saldırılarının nasıl yapıldığı ve bu saldırılara karşı alınabilecek “basit” önlemlerden bahsedilmekte.

 

ONLAR SALDIRIYA HAZIR …

PEKİ SİZ SAVUNMAYA HAZIR MISINIZ ?
– SQL Enjeksiyon Saldırıları ve Savunma Yöntemleri –


SQL Enjeksiyon Saldırıları ( SQL Injection Attacks )
 son günlerde Türkiye ‘ de Web Sitesi Saldırılarının başlıca nedeni haline gelen ve eğer önlem alınmaz ise web sitesi sunucularına büyük zararlar verebilen bir saldırı yöntemi haline gelmiştir.“Web Site Hacking” denilen olgunun dayanılmaz hafifliğini ve heyecanını parmaklarında hisseden hacker ‘ lar ya da stajyer hacker ‘ lar için , öğrenilmesi ve uygulaması kolay bir Web Sitesi Saldırı yöntemi olup çıkmıştır SQL Enjeksiyon Saldırıları.Peki nedir bu SQL enjeksiyon, nasıl yapılır ve daha da önemlisi nasıl korunmak gerekir ?SQL Enjeksiyon Saldırıları, adından da tahmin edebileceğiniz gibi SQL Sorgulama dili kullanılan bir uygulamaya SQL ‘ in anlayabileceği şekilde zararlı kodlar göndermek ve SQL Dili vasıtası ile zararlı işleri yaptırmak anlamına gelir.Şimdi, “ayinesi iştir kişinin lafa bakılmaz” atasözünü de dikkate alarak hemen SQL Enjeksiyon Saldırısının uygulama üzerinde nasıl işlediğine ve web sitemizi nasıl bir hack arenası haline getirdiğine bakalım :Web Sitemiz içerisinde şöyle bir SQL kodu olduğunu ve aşağıdaki ürün ID ‘ sini parametre olarak kullanıcıdan seçimine göre değişken olarak aldığını varsayalım.

SELECT urun_adi, urun_aciklama FROM urunler WHERE urun_id=999

 

Bu SQL Kodu bize ID numarası urun_id şeklinde parametre olarak verilen (örneğimizde 999) ürüne ait “ürün adı” ve “ürün açıklaması” bilgilerini urunler isimli database ‘ den getirecektir. Yapı olarak basit ve tehlikesiz bir SQL sorgu cümlesi olarak görünüyor değil mi ?

 

İşte SQL Enjeksiyon Saldırıları tam burada başlamaktadır. Çünkü sizin URL aracılığı ile gönderdiğiniz urun_id parametresine SQL kodları enjekte etmek pekalâ mümkündür. Şimdi işin bu yönünü inceleyeceğiz.

 

Yukarıdaki SQL koduna, urun_id parametresini web sitenizde şöyle bir link ile gönderdiğinizi varsayalım :

 

http://www.talihsizsite.com/urunler.asp?ID=999
Web sitenize saldırı yapmayı deneyen hacker, öncelikle SQL enjeksiyon saldırılarına açık olup olmadığınızı anlamaya çalışacak ve daha sonra da ulaşmak istediği ve SQL Server ‘ ın izin verdiği sistem komutlarını çalıştırmaya başlayacaktır. Peki web sitenize saldırmayı deneyen kişi, urunler.asp dosyanıza verdiği parametreyi şu hale getirirse ne olur sizce ?

 

http://www.talihsizsite.com/urunler.asp?ID=999 ; SHUTDOWN WITH NOWAIT;

Burada , aldığı parametre neticesinde yukarıdaki SQL cümlemiz şu hale gelmiş olacaktır :

SELECT urun_adi, urun_aciklama FROM urunler WHERE urun_id=999 ; SHUTDOWN WITH NOWAIT;

 

Kendi yazdığınız SQL Cümlesine elbette güveneceğiniz için SQL Cümleniz web uygulaması içerisinde direkt olarak çalıştırılacaktır. Ancak sonuç ne yazık ki vahim olacaktır. Çünkü ; (noktalı virgül) işareti sayesinde iki SQL cümlesini bir arada işletebilme yeteneğine sahip olan SQL Server öncelikle 999 numaralı ürüne ait bilgileri sorgulayacak ve hemen devamında SQL Server beklemeden kapatılacak , web sitenize erişim bu saatten sonra imkansız hale gelecektir.

 

Web sitenize SQL cümlecikleri enjekte etmek isteyen kötü niyetli birisinin her zaman SHUTDOWN WITH NOWAIT gibi masum (!) enjekteler kullanmayacağını, bunun dışında SQL Server ‘ ın yeteneklerine dayanan bir çok sistem komutunu çalıştırma, fiziksel dosyalarınızı silme, SQL Server ‘ da bulunan database ‘ lerinizi silme, uzaktan çalıştırılması  mümkün olan prosedürleri çalıştırma , Windows registry kayıtlarına kolaylıkla ulaşma gibi işlemler yapmak isteyeceğini belirtmekte büyük fayda var.

 

 

Kodlamaya Dikkat !

 

 

SQL ENJEKSİYON SALDIRISI YÖNTEMİ İLE WEB SİTENİZDEKİ TÜM KULLANICI BİLGİLERİNİN VE KREDİ KART NUMARALARININ ÇALINMASI AN MESELESİ …

 

 

Daha doğrusu eğer bir hacker sitenizde SQL Enjeksiyon denemeleri yapıyorsa ve ilk kullandığı enjeksiyonun  sonucu da SQL Server ‘ ınızı kapatmak olursa kendinizi şanslı sayabilirsiniz.  Bunun nedenini de şu şekilde bir senaryo geliştirerek açıklayalım isterseniz : Büyük bir alışveriş sitesinin webmaster ‘ ı ya da yöneticisi durumundasınız ve bu web sitesinde çalışan uygulamanız kullanıcı isimlerini, şifrelerini, kişiler bilgilerini ve dahası müşterilerinize ait kredi kartı numaralarını database üzerinde saklıyor. İşte asıl felaket budur ! Websitenize saldıran hacker ‘ ın müşterilerinize ait kredi kartı numaralarına ve tüm şahsi bilgilerine erişmesi ve bunları kötü amaçlarla kullanması SQL Enjeksiyon açığı sayesinde an meselesidir.

SQL SERVER HATA MESAJLARI

Hata mesajı mı yoksa Hacker ‘ a yardım mı ? )

Doğal olarak her programlama dili ya da sorgulama dili kodlama aşamasında yapılan hataları Runtime aşamasına da taşıyabilmektedir. Bu sayede programcılar yaptıkları hatanın farkına varırlar ve bu hataları düzeltme imkanı bulurlar.

Web sitelerinde SQL Bağlantısı kurmak için kullanılan ODBC (Open Database Connectivity) ‘ nin de elbette ki Runtime aşamasında hata mesajları mevcuttur.
Ancak , SQL Enjektesi yapılabilen bir uygulamanın verdiği hata mesajları aynı zamanda hacker dostlarımıza da fazlasıyla yardımcı olacaktır.  Gelin hep beraber nasıl olur da bu masum hata mesajları hacker ‘ lara yardımcı olur ve hacker ‘ lar bunu hangi yolda kullanırlar, inceleyelim :

 


Yukarıdaki örneğimizde bir Hacker , SQL Server ‘ da kullandığınız tablo isimlerine ulaşmak için şöyle bir kod kullanabilir : 

http://talihsizsite.com/urunler.asp?id=999 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES—

 

ID parametresinin aldığı bu değer neticesinde uygulamamız içerisindeki SQL cümlemiz şu hale gelmiştir :

 

SELECT urun_adi, urun_aciklama FROM urunler WHERE urun_id=999 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATIN_SCHEMA.TABLES–

 

Bu SQL Cümlesinin direkt çalıştırılması durumunda web sayfanız aşağıdaki hatayı vererek çalışmasını durduracaktır ki zaten saldırganın istediği de budur :

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘TABLE1’ to a column of data type int.
/urunler.asp, line 48 

Buradaki hata olarak şunu ifade ediyor :  TABLE1 isimli bir tablo bulundu ve bu TABLE1 kelimesi INTEGER ‘ a dönüştürülmek istendi, ancak bu başarısızlıkla sonuçlandı.

 

Gösteriyi nasıl buldunuz ? SQL cümlemize yukarıdaki kodu gönderen saldırgan artık SQL Server ‘ ımızda bulunan ilk Tablo isminin TABLE1 olduğunu anlamış oldu. Saldırgan bu aşamadan sonra yukarıdaki SQL cümlesinin değişik varyantlarını kullanarak diğer tablo isimlerine de ulaşarak istediği her tür bilgiye erişebilir. Örneğin saldırgan yukarıdaki cümleyi şu şekilde düzelterek içerisinde kredi_kart kelimesi geçen tablolara ulaşabilir.

 

http://www.talihsizsite.com/index.asp?ID=999 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ‘%KREDI_KART%’—

 

Bu sorgunun neticesinde SQL Server saldırgana şu hata mesajını verecektir.

 

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘KREDI_KART_NUMARALARI’ to a column of data type int.
/urunler.asp, line 48

 

İşte burada da saldırgan, SQL Server ‘ da kayıtlı olan ve KREDI_KART_NUMARALARI adında bir tablonun varlığından haberdar olmuş oldu. Doğal olarak ; yapılacak tüm saldırı tiplerini burada listelemek güvenlik açısından sakıncalıdır ve etik açıdan da doğru olmayacaktır.

SALDIRIDAN KORUNMA …

SQL Enjeksiyon saldırılarından korunmak için tek yapmanız gereken bir web uygulamasını programlarken oldukça katı kurallar ve denetimler koymaktır. İsterseniz şimdi bu saldırı tipinden korunmamız için gereken kuralları listeleyelim.

 

Unutmayın ; web sitenizi bu saldırı tipinden korumanız sadece kendinizi değil aynı zamanda müşterilerinizin bilgilerini de korumanız anlamına gelmektedir.

 

 

 

Kimseye güvenmeyin !

Çok katı bir kural mı oldu ?  Peki bunu biraz yumuşatalım isterseniz : Internet kullanıcılarından gelebilecek her girdi bilgisini potansiyel tehlike olarak görün. Internet kullanıcılarının tümünün aynı bilgi düzeyine sahip olmadığını kesinlikle unutmayın.

 

Gelen parametre uzunluklarını ayarlayın …

Bir alan için database ‘ iniz üzerinde örneğin 5 karakterlik bir uzunluk belirlediyseniz, aynı şekilde parametre girilebilen textbox (girdi kutuları) için de 5 karakterlik bir sınır vermek gereklidir. Aynı şekilde URL aracılığı ile alınan parametrelerin de programlama yolu ile kısıtlanması ; örneğin gelen parametrenin ilk 5 karakterinin alınması saldırıların vereceği zararın önlenmesini sağlayacaktır.

 

Web Server ve SQL Server arasındaki bağlantıda asla Sistem Yöneticisi hesabını kullanmayın …
Sıklıkla yapılan hatalardan en büyüğü de Web Server ile SQL Server arasındaki bağlantının, genellikle en üst düzey yetkiye sahip olan kullanıcı hesaplarıyla yapılmasıdır. Bu iki server arasındaki bağlantıda kullanılacak hesabın, kısıtlı yetkilere sahip hatta sadece web sitesinin ihtiyaç duyabileceği komutları çalıştırma yetkisine sahip bir hesap olmasına çalışılmalıdır. Bu sayede, web sitesinden SQL Enjeksiyon saldırısı yöntemiyle gelen ölümcül saldırılar etkisiz hale getirilmiş olacaktır.

 

Kullanıcının girdiği ya da URL yoluyla gelen değerlerin tiplerini kontrol edin …

Web uygulamanız içerisinde mutlaka bir denetim mekanizması olsun. Kullanıcıdan aldığınız her değeri SQL Server komutu olarak çalıştırmadan önce, o değerin istediğiniz tipte olup olmadığını denetleyen bir fonksiyon yazmayı unutmayın. Yukarıdaki örneğimizde 999 şeklinde sayısal olarak gelmesi gereken değerin dışındaki string tipli değerlerin kabul edilmemesini sağlayın.

 

Gelen değerler içerisindeki yabancı karakterleri temizleyin …

Web uygulamanızdaki girdi kutularından ya da URL yoluyla gelen değerler içerisinde genellikle büyüktür, küçüktür, virgül, noktalı virgül , eşittir gibi sembollere ihtiyaç yoktur ve bu semboller SQL Server ya da ASP dilinde kullanılan sembollerdir. Bu noktada ASP dili ile aldığınız bir parametreyi nasıl temizleyeceğinizi anlatmakta fayda var. Burada bir fonksiyon yazarak “kötü” karakterleri yok ediyoruz , tabii ki bu fonksiyonu uygulamanıza göre geliştirmek sizin elinizde :

<%
Function Temizlik ( deger )

Temizlik = Replace ( deger , “>” , “”)
Temizlik = Replace ( deger , “<” , “”)
Temizlik = Replace ( deger , “;” , “”)
Temizlik = Replace ( deger , “,” , “”)
Temizlik = Replace ( deger , “’” , “”)

End Function

Unutmamak gerekir ki en güvenli sistem power kablosu takılmamış olan sistemdir, ancak bu sistemden de fayda görmeyeceğimiz çok açıktır.  Sistemlerinizi korumak için güç kablosunu çekmek yerine, kendi kendinizi Internet kullanıcılarının ve dahası hacker ‘ ların yerine koyup , bu şekilde uygulamalar geliştirmek daha fonksiyoneldir. Hepinize güvenli sistemler diliyorum …

 

 

Yusuf ÇAKIR

yusuf@winnetmag.com.tr