SQL Injection Web Güvenlik Zafiyeti
SQL Injection, genellikle çok sık sömürülen güvenlik zafiyetlerinin başında gelmektedir. OWASP Top10 2017 raporuna göre en çok sömürülen zafiyet sıralamasında ilk sırada yer almaktadır.
Geliştiricinin dalgınlığından veya amatörlüğünden bu veya bunun gibi güvenlik zafiyetleri doğabilmektedir. Bu güvenlik zafiyetinin sömürülmesi çok ciddi sorunlar teşkil edebilmektedir. İlk olarak SQL Nedir, bunu tanımlayarak SQL Injection Nedir konusuna giriş yapalım.
SQL Nedir?
SQL, Structured Query Language kelimelerinin baş harflerinden oluşmakta. Türkçeye çevirdiğimizde Yapılandırılmış Sorgu Dili tabiri çıkmaktadır. Daha anlaşılır açıklama ile, internet sitelerin bağlı oldukları veri tabanlarında çeşitli sorgular yapabildiğimiz veya çeşitli veriler üzerinde işlemler yapabildiğimiz veri tabanı dilidir diyebiliriz.
Yani sizin internet siteler üzerinde kayıt bazlı yaptığınız tüm işlemler aslında SQL dilinde bir sorgu veya işlem komutudur. Örneğin siz bir siteye yorum yazdığınız zaman, aşağıdakine benzer bir işlem komutu, yorum yaptığınız sitenin veri tabanında çalıştırılır.
INSERT INTO yorum (yorum_id,yazar,yorum,tarih) VALUE (1,'Mehmet Eren Akyol','Discover the Security - Test Yorum','1.1.2020');
Örneğin yukarıdaki yapıda bir veri tabanına sahip olsaydık, yukarıdaki işlem komutunu çalıştırdığım zaman 2. satırdaki Value değerini veri tabanımıza ekleyecekti.
SQL Injection Nedir?
Web site geliştiricileri, kullanıcılarından aldıkları veriler ile dinamik SQL cümlecikleri oluşturur. Örneğin yukarıda verdiğim örnekteki SQL işlem sorgusu gibi bir sorguyu alır ve geliştirdiği web sitedeki yorum kod bloğuna bu sorguyu yazar.
Kullanıcılar websitede yorum yazdıklarında yukarıdaki sorgu çalışır ve siteye yorum eklenir. Bunu ufak kod bloğu ile anlatmak istiyorum.
<?php $ad=$_POST['ad']; $yorum=$_POST['yorum']; $sql_sorgusu=mysqli_query("INSERT INTO yorum (yazar,yorum) VALUES ('$ad','$yorum');"); ?>
Yukarıdaki kod bloğunda kullanıcı adını girdiği zaman $ad değişkeninin içerisine atacak, yazacağı yorumu da $yorum değişkeninin içerisine atacaktır. Sonrasında 3. satırdaki SQL işlem sorgusunu çalıştırarak kullanıcının girdiği adı ve yorumu “yorum” tablosundaki ilgili sütunlara ekleyecektir.
Eğer kullanıcılar yukarıdaki gibi yazılmış SQL sorgularına meta karakter ekleyerek kodu amacı dışında çalıştırabilirse, o websiteye SQL Injection saldırısı gerçekleştirebilir demektir. Bu sebepten dolayı geliştiriciler yazdıkları kodların içerisine SQL sorgusu eklerken çok dikkatli olmalıdır.
Meta Karakter Nedir?
Meta karakter, bir programlama dili için özel anlam ifade eden karakterlerdir. Örneğin C# dilinde “//” işareti, işaretin bulunduğu kod bloğunun okunmayacağını ifade etmektedir. Bunun gibi ifadelere Meta Karakter ismi verilir.
SQL sorguları için meta karakter ‘ (tek tırnak) işaretidir. Üst yorumdaki SQL sorgusunu incelediğinizde gördüğünüz gibi değişkenler tek tırnak içerisinde yazılmaktadır. ‘$ad’ gibi. Bu meta karakter, geliştirici tarafından yazılmış SQL sorgusunun amacı dışında kullanılmasına olanak sağlayabilir.
SQL sorgusunda bir diğer meta karakter ise, ; (noktalı virgül) işaretidir. Bu da yazılmış SQL sorgusunun sonlandığını ifade eder.
Eğer siteyi ziyaret eden kullanıcılar SQL sorgularına meta karakter dahil ederek sorguyu amacı dışında çalıştırabiliyor, sorguyu kendisine göre şekillendirebiliyor ise, rahatlıkla SQL Injection saldırısı düzenleyebilir.
Geliştiricilere Tavsiyeler
- SQL sorgularını yazarken biraz dikkatli olun 🙂
- Projenizi geliştirirken Frameworks veya ORM gibi ekstra veri tabanı katmanları kullanın.
Yararlandığım Kaynaklar