SQL İnjection Nedir ?

SQL Injection Nedir?

İnternet sitelerinin bir çocuğunda, sayfayı dinamik tutmak için veritabanından yararlanılır. Güncel veritabanı yazılımlarında birçoğunda (MySQL, MSSQL,  Sqlite, Oracle SQL) SQL (Structured Query Language) denilen ortak bir dil kullanılır.

SQL Injection, SQL sorgusunun amacına müdahale ederek farklı bilgileri elde etmeye denir.

Yani SQL Injection yöntemi ile üye bilgileri, yönetici şifreleri gibi veritabanında bulunup herkese açık olmayan bilgiler elde edilebilir.

SQL Injection kullanılarak Yahoo! gibi büyük internet sitelerinin bile veritabanları ele geçirilmiştir.

SQL Injection Nasıl Yapılır?

Diyelim SQL kullanan bir siteye user 123 kullanıcı adı ve şifresiyle giriş yapıyorsunuz. Giriş butonuna tıkladığınız anda sitenin yazılımı veritabanına aşağıdaki gibi bir sorgu gönderecektir:

SELECT * FROM kullanicilar WHERE isim='user' AND sifre='123'

Yazılım sonuç bulunursa girişinize izin verecek, bulunamazsa izin vermeyecektir. Bir de kullanıcı adı ve şifre alanına ' OR 1=1 -- yazdığımızda gönderilecek olan sorguya bakalım:

SELECT * FROM kullanicilar WHERE isim=''OR 1=1 --' AND sifre=''OR 1=1 --'

Yukarıdaki sorgu gönderilecektir. Eğer yazılım girdileri filtreliyorsa SQL injectionu engelleyip girişinize izin vermeyecek, filtrelemiyorsa kullanıcı adı ve şifrenizi doğru zannedip girişe izin verecektir.

' OR 1=1 -- SQL dilinde her zaman true döndürür (olumlu sonuç döndürür). Bu yüzden SQL programı bütün kayıtları listeleyeceğinden, yazılım doğru giriş yapıldı zannedecektir. "' OR 1=1 --" ifadesi, önceki koşul gerçekleşmese bile boş ver, 1=1 gerçekleşiyorsa true döndür ve sorgunun geri kalanını boş ver (-- yorum anlamına geldiğinden sorgunun kalanı yorummuş gibi algılanır) demektir.

Bir örneği daha inceleyelim. SQL injectiona karşı önlem alınmamış bir makale sitesi olsun. Makaleler adres çubuğunda yazılan id'e göre gösterilsin.
makale.php?id=1
SQL açığı olduğunu bilmediğimizi varsayarak 1 yerine ' yazalım. SQL açığı olduğu için SQL hatası verecektir. Artık bu açığı kullanarak veritabanından istediğimiz veriyi elde edebiliriz. Zaten makale gösterilirken bir SELECT kullanıldığı için, başka verileri almak için UNION SELECT kullanıyorum.
makale.php?id=1' UNION SELECT * FROM users
Sayfada bütün kullanıcılar ve şifreleri listelenecektir.

SQL Injection'dan Nasıl Korunulur?

Kullanıcıdan alınan her veride ' ve " karakterleri getirilerek korunulur. Bu karakterler ya karakter koduna çevrilmeli, ya da başına \ yani kaçırma karakteri eklenmelidir. Bu durumda SQL programı o karakterleri komut olarak algılamayacaktır.


Umarım yararlı bir konu olmuştur. Anlamadığınız yerleri çekinmeden sorabilirsiniz.

Kolay gelsin.

Yorumlar