Merhaba sevgili bilişim severler. Bu yazımda SQL Injection’u ele alacağım.

Web uygulama geliştirenlerin sıkça karşılaştığı saldırı türüdür. Web uygulamalarına karşı yapılan saldırılara önlemler almalıyız. Web uygulamalarına yapılacak birçok saldırı metodu vardır. Web uygulamalarının en zayıf bölümü kullanıcı girişlerinin yapıldığı ve sonucunda yetkilendirme yaptığı bölümlerdir. Yani giriş sayfalarıdır. Web uygulamaları ile ilgilenen herkes mutlaka bir giriş sayfası yapmıştır. Bu sayfada genelde bir metin kutusu ve gönderme butonu vardır. Gerekli veriler girildikten sonra gönderme butonuna tıklanır. Tıklamadan sonra veritabanına bağlantı gerçekleşir. Gerekli sorgu komutu yazılıp girilen veriler ile veritabanındaki veriler eşleşirse başarılı bir giriş olmuş olur. Yani kullanıcının kimlik doğrulaması başarılı olmuştur. Ancak kötü niyetli kişiler metin kutularını yalnızca giriş verilerini girmezler. Bazı parametreler girerek veri tabanına sızıp yetki yükseltirler veya veritabanındaki bilgileri alırlar.

İnternet sitelerinin bir çoğunda, sayfayı dinamik tutmak için veritabanından yararlanırlar. Güncel veri tabanlarının birçoğunda MySQL, MSSQL, Sqlite, Oracle SQL gibi ortak bir dil kullanılır. SQL sorgusunun amacına müdahale ederek farklı bilgileri elde etmeyi dener. Yani üye bilgileri, yönetici şifreleri gibi veritabanında bulunup gizli olan bilgileri elde eder.

SQL Injectionda veya parametresi kullanılır. Bu parametrenin amacı yanlış bir veri girsek dahi parametrenin sağına doğru bir durum yazar isek ilk girilen veri yanlış olsa bile sisteme giriş yapar. Örneğin sunucu şu şekildedir;

SELECT * FROM Users WHERE UserId = 105 or 1=1

Bu SQL de çalışır çünkü gelen istek tüm satırları döndürür ve sonuç olarak  1=1  her zaman doğrudur bu yüzden daima giriş sağlanır.

Başka bir örneğe bakalım;

SELECT * FROM kullanicilar WHERE isim = ‘ ‘ OR 1=1‘ AND sifre=’ ‘OR 1=1 –‘

Bu SQL de çalışır ismi boş olan tüm kullanıcıların verilerini getirir. İsmi boş olan kullanıcı olmasa dahi sorgu “true” değerini döndüreceği için getirecektir.

Başka bir örneğe bakalım;

SELECT UserId, Name, Password, FROM Users WHERE UserId = 105 or 1=1;

Bu SQL de çalışır kullanıcılar tablosunda isimler ve şifreler varsa ne olur. Kötü niyetli bir kimse giriş kutusuna 105 veya 1=1 ekleyerek bir veritabanındaki tüm kullanıcı adlarına ve şifrelere erişebilir.

Başka bir örneğe bakalım;

SELECT * FROM Users WHERE Name = ” “ or “=” AND Pass=” ” or ” “ = ” “

Bu sorguda kullanıcı tablosundaki ismi boş olan alanları getir ya da şifre kısmındaki boş alanları getir. Eğer ikiside yoksa boş=boş yani “true” deperi döner ve giriş yapılır.

Peki, gel gelelim bu atakdan nasıl korunacağız. Unutmayın her saldırının bir de güvenliği vardır. Onlar siyah şapkalıysa siz beyaz şapkalı olacaksınız. Bu atağın oluşmasının en büyük sebebi kullanıcılardan aldığı verileri kontrol etmeden, gerekli filtreleme işlemini yapmadan verileri alıp SQL cümlesi oluşturmasıdır. Bu açık yakalandığında müdahalede bulunmak için ‘ (tek tırnak) karakteri ile girilen veriye başlanır ve bunun sonucunda SQL’e istenilen komutu göndermek için tek tırnak yardımıyla string bölümünden kaçınılabilir. Bir başka yöntem ise tüm meta karakterlerden kaçınılmalıdır. Sayısal olarak beklenen verilerin sayısal olup olmadığı kontrol edilmelidir. Sayısal olan veriler SQL sorgusuna eklemeden önce integer’a çevirerek veya isnumeric fonksiyonu kullanılarak gerçekten integer olup olmadığı kontrol edilmelidir.

SQL Injection’un bazı çeşitleri vardır. Bunlar;

Union Based Sql: Bu sql de amaç kolon sayısını bulmaktır. Bunun için “union” ile bulunmasıyla başlanıp sorgunun derinleştirilmesidir. 2 farklı select sorgusunun “union” ile birleştirildiğinde çıktı verebilmesi için eşit sayıda kolon sayısına sahip olmalıdır.

Blind Based Sql: Bu sql de deneme-yanılma yöntemiyle veritabanından gelen cevaba göre şekillenen Sql çeşididir. Örneğin “substring” kullanılarak yapılabilir. Sql injectionda önemli olan kullanıcıdan alınan verinin sorgunun neresine gittiğidir.

Time Based Sql: Bu sql de eğer çıkış yoksa “sleep” fonksiyonunu kullanarak elimizdeki sorguları sokuşturmalarının  çalışıp çalışmadıklarını veritabanının sleep ile verdiğimiz zaman değeri kadar geç cevap dönmesiyle anlayabiliriz. Dönen belki işe yarar bir şey yoktur ancak bizim sql olduğunu anlayabilmemizin sebebi sorguda sleep gönderdiğimizde veritabanının uyumasıdır.

Error Based Sql: Bu sql de veritabanına “ veya ‘ gibi hata vermesini sağlayacak veriler yollayarak Syntax Error dönderip değişkenleri kullanılışları, verdiği hataya göre veritabanını anlayarak zafiyeti sömürme biçimidir.

Güvenliğiniz için SQL Injection açıklarını kendi sitenizde aşağıdaki araçları kullanarak arayabilir ve test edebilirsiniz. Bu sayede hangi sayfada yazılımsal açık var onu bularak müdahale edebilirsiniz. Aynı zamanda aşağıdaki araçlar ile sadece sql değil web siteniz üzerindeki diğer zafiyetleri taramak içinde kullanabilirsiniz.

  • jSQL Injection: Java ile yazılmış Havij benzeri SQL Injection test yazılımıdır. Uygulamayı çalıştırmak için bilgisayarda JAVAve Java Geliştirme Paketi (JDK) kurulu olması gerekir.
  • Havij: SQL açığı bulduğunuz veya şüphelendiğiniz sayfayı detaylı olarak incelemek için kullanabileceğiniz bir yazılımdır. Bulduğunuz zafiyet üzerinden sitenin Tablo ve Sütunlarını öğrenmenizi sağlar.
  • SQLMap: Python dilinde yazılmış SQL hatalarını bulmaya yarayan bir güvenlik yazılımıdır. Yazılımı bir Linux dağıtımı üzerinde kullanmanızı öneririm çünkü işlemleri Terminal üzerinde yapıyorsunuz. Tabi isteyenler Windows’a Python yükleterek de çalışabilir. Manüel olarak çalışacağınız için Basic SQL kod bilgisine ihtiyacınız vardır. Havij gibi kullanımı basit değildir.
  • HackerTarget.com: Online güvenlik zafiyetlerini taramak için yapılmış güzel bir çalışma. Tüm testleri sitenin arayüzünden yapıyorsunuz. Nmap Port Scanner, SQL Injection Scan, WordPress Scanner gibi hizmetleri var.
  • Acunetix Web Vulnerability Scanner: 14 günlük deneme versiyonu ile sitenizdeki hem SQL açıklarını hem de diğer zafiyetleri tarayarak görebilirsiniz.

Bir sonraki yazımda görüşmek dileğiyle. İyi Okumalar.