Öncelikle en çok kullanılan SQL komutlarına bakalım.
SQL yazılırken bunlarla birlikte bazı özel karakterler de kullanılabilir. O karakterler de şu şekildedir :
Şimdi test etmek istediğimiz juice shop örneğine dönelim. Burada giriş yapmak istiyoruz ve bunun için öncelikle test verileri ekliyoruz. Normalde SQL bu verileri alıp db’de ilgili kayıt var mı diye kontrol ediyor. Örnek olarak :
Input : test
SQL : SELECT * FROM Users Where email = ‘test’;
Şeklinde çalışıyor. Eğer durum böyleyse biz inputa ‘ karakterini eklediğimizde SQL : SELECT * FROM Users Where email = ‘test’ ‘; Bu şekilde olmalı ve bize bir sunucu hatası dönmeli. Deniyoruz ve :
Böyle bir sonuçla karşılaşıyoruz. Bu bize, bu site için sql injection yapmamıza izin verdiğini gösteriyor. Yani bizim girdilerimiz düzgün bir şekilde kontrol edilip SQL ‘e öyle verilmiyor. Biz inputumuzu şu şekilde değiştirdiğimizde :
INPUT : ‘ OR 1=1; —
SQL : SELECT * FROM Users Where email = ‘ ‘ OR 1=1; –;
Sql yukarıdaki gibi oluyor. Bu da bizim 1 konumundaki admin kullanıcısıyla giriş yapmamızı sağlıyor. Çünkü OR 1=1 komutu bütün satırı doğru haline getiriyor. SQL injection zaafiyetinin bir versiyonu da Blind SQL injectiondur. Bu yöntemde de doğrudan değer değil tam olarak sonucu gözlemleyemediğimiz bir input veririz. Örnek olarak inputumuz ‘ (sleep 5) şeklinde yaparsak SQL sunucusu bize dönüş yapmadan önce 5 saniye bekleyecektir. Bu şekilde deneyerek de blind sql olup olmadığını görebiliriz.
SQL injectionu savunmak için ise 2 yöntem bulunuyor :
- Inputu parametre haline getirip SQL e öyle vermek: Örnek olarak burada SQL kodunu yazarken geliştirici doğrudan değeri değil parametreyi verebilir. Güzel bir örnek şu şekilde olabilir : “SELECT * FROM Users WHERE email = ?”; ya da “SELECT * FROM Users WHERE email”‘+email'” ;
- İkinci yöntem ise gelecek değerin tam olarak kodda ayıklanması ve düzenlenmesidir. Yani beklenen değerde ‘ veya 1=1 gibi ifadelerin bulunması SQL’e gönderilmeden önce engellenir.