SQL Enjeksiyonu SQLi

Birinin bir forma ya da web adresine veritabanı komutları yazdığı bir web saldırısı. Site bu komutları çalıştırır ve korumak zorunda olduğu verileri açığa çıkarır, değiştirir ya da siler.

  • Siber Güvenlik

Şu adla da bilinir

Tanım

SQL enjeksiyonu nedir

Bir online mağazanız var. Bir ziyaretçi arama kutusuna tuhaf bir şey yazıp Enter'a basıyor ve sayfa ona bütün müşterilerinizin adını, telefonunu ve sipariş geçmişini gösteriyor. Kimse şifre çalmadı. Ziyaretçi doğru kelimeleri yanlış yere yazdı, gerisini siteniz yaptı. İşte SQL enjeksiyonu budur.

Çoğu web sitesi bilgilerini bir veritabanında tutar: düzenli tablolardan oluşan, bir dizi hesap tablosuna benzeyen bir depo. Site bu bilgileri okumak ya da değiştirmek için SQL (Structured Query Language) adlı bir dil kullanır. Gönderdiği her isteğe sorgu denir, örneğin "bu e-posta adresine sahip müşteriyi bul".

SQL enjeksiyonu, bir sitenin ziyaretçinin yazdığını alıp olduğu gibi bu sorgulardan birinin içine koymasıyla olur. Ziyaretçi normal metin yerine SQL yazarsa veritabanı farkı anlayamaz ve saldırganın komutunu sanki site yazmış gibi uygular. Bu isim çoğu zaman SQLi diye kısaltılır.

SQL enjeksiyonu saldırısı nasıl çalışır

Müşterinin uzattığı her notu kasa dairesindeki görevlilere kelimesi kelimesine ileten bir banka memuru düşünün. Normal bir not "bana bakiyemi göster" der. Hileli bir not ise "bana bakiyemi göster, bir de bütün kasaları aç" der. Memur notu hiç okumazsa kasa görevlileri söyleneni yapar.

Bir web sitesinde adımlar genellikle şöyledir:

  1. Saldırgan veritabanına metin gönderen bir yer bulur: bir giriş formu, bir arama kutusu, bir iletişim formu ya da web adresinin kendisi, örneğin sonu "?id=25" ile biten bir ürün sayfası.
  2. Normal metin yerine küçük bir SQL parçası yazar. Bilinen bir örnek, bir giriş formunun şifre alanına ' OR '1'='1 yazmaktır.
  3. Site bu metni kontrol etmeden kendi sorgusuna ekler. Sorgu artık şuna benzer bir şey sorar: "şifre doğruysa ya da 1, 1'e eşitse bu kişiyi içeri al".
  4. 1 her zaman 1'e eşit olduğu için veritabanı evet der ve saldırgan hiçbir şifre bilmeden giriş yapar.

Bazı saldırılar daha sessizdir. Kör SQL enjeksiyonunda sayfa hiçbir veri göstermez. Saldırgan da veritabanına evet ya da hayır cevaplı sorular sorar ve sayfanın nasıl tepki verdiğini ya da yüklenmesinin ne kadar sürdüğünü izler. Elle yapıldığında yavaş bir iştir, bu yüzden saldırganlar bu işi onlar için yapan ücretsiz otomatik araçlar kullanır.

Saldırgan bununla neler yapabilir

Veritabanı onun komutlarını uygulamaya başladığında zarar, sitenin veritabanı hesabının neye yetkisi olduğuna bağlıdır. Bu yetki çoğu zaman sitenin ihtiyacından çok daha fazladır. Saldırgan şunları yapabilir:

  • müşteri adları, adresleri, e-postaları, sipariş geçmişi, sağlık kayıtları ya da kayıtlı şifreler gibi özel verileri okumak
  • başka bir kullanıcı olarak, hatta yönetici olarak giriş yapmak
  • fiyatlar, bakiyeler ya da sipariş durumları gibi verileri değiştirmek
  • tabloların tamamını ya da bütün veritabanını silmek
  • bazı kurulumlarda sunucunun kendisine ulaşıp oraya zararlı dosyalar yerleştirmek

İşletmeniz için neden önemli

SQL enjeksiyonu en eski web saldırılarından biridir ve hâlâ karşımızda. Web uygulaması risklerini sıralayan ünlü OWASP Top 10 listesini yayımlayan açık topluluk OWASP, enjeksiyonu yıllardır bu listede tutuyor. Denemesi kolaydır ve birçok sitede hâlâ bu saldırıya açık, unutulmuş bir form bulunur.

Bir işletme sahibi için asıl kayıp nadiren tekniktir. Sızdırılmış bir müşteri listesi, yanlış fiyattan satış yapan bir mağaza, bir haftalık randevuyu kaybeden bir rezervasyon sistemi ya da müşterilerinize verilerinin açığa çıktığını söylemek zorunda kaldığınız bir mesaj şeklinde ortaya çıkar. Birçok ülkede GDPR gibi veri koruma yasaları da kişisel verileri korumanızı ve sızıntıları bildirmenizi bekler.

Sitenizdeki her form bu risk düşünülerek mi yapıldı? Eski eklentilerle aceleyle kurulan ya da yıllar içinde birçok kişinin elinden geçen siteler, zayıf bir nokta saklamaya daha yatkındır.

Bir web sitesi SQL enjeksiyonundan nasıl korunur

Ana çözüm iyi bilinir ve işe yarar. Korumanın büyük kısmı sitenin nasıl yapıldığında yatar, bu yüzden bunlar geliştiricilerinize ya da hizmet sağlayıcınıza sormanız gereken iyi sorulardır.

  • Hazır ifadeler. Bunlara parametreli sorgular da denir. Site sorguyu ve ziyaretçinin metnini ayrı ayrı gönderir, böylece veritabanı bu metni her zaman sade bir veri olarak görür, asla komut olarak görmez. En önemli savunma budur. Laravel gibi modern framework'ler, geliştiriciler yerleşik veritabanı araçlarını kullandığında bunu varsayılan olarak yapar.
  • Girdi kontrolleri. Telefon numarası alanı yalnızca rakam, tarih alanı da yalnızca tarih kabul etmelidir. Tuhaf girdileri erkenden reddetmek birçok kapıyı kapatır.
  • En az yetki. Sitenin veritabanına ulaşmak için kullandığı hesap yalnızca ihtiyaç duyduğu yetkilere sahip olmalıdır. Herkese açık bir arama sayfasının tablo silmesi için hiçbir neden yoktur.
  • Sade hata mesajları. Ekranda görünen ayrıntılı bir veritabanı hatası saldırgana bir harita verir. Ziyaretçilere kısa ve basit bir mesaj gösterin, ayrıntıları gizli kayıtlarda tutun.
  • Güncellemeler. Platformu, eklentileri ve kütüphaneleri güncel tutun, çünkü eski sürümlerde çoğu zaman bilinen açıklar bulunur.
  • Web uygulaması güvenlik duvarı. Sitenin önünde duran ve bilinen birçok saldırı kalıbını kodunuza ulaşmadan engelleyen bir filtredir. Yardımcı olur ama güvensiz kodu onarmaz.
  • Düzenli testler. Sızma testi (uzmanların yaptığı güvenli ve planlı bir saldırı) ve güvenlik açığı taraması, zayıf noktaları bir saldırgandan önce bulur.

Günlük alışkanlıkların karşılaştırması şöyle:

Riskli alışkanlıkDaha güvenli alışkanlık
Ziyaretçi metnini doğrudan sorguya eklemekHer sorguda hazır ifadeler kullanmak
Her şey için tam yetkili tek bir veritabanı hesabıSitenin her bölümü için sınırlı bir hesap
Veritabanı hatalarını sayfada eksiksiz göstermekZiyaretçiye kısa bir mesaj, ayrıntılar gizli kayıtlarda
Aylarca güncellenmeyen eklentilerDüzenli güncellemeler ve kurulu olanların net bir listesi
Sadece özelliklerin çalışıp çalışmadığını test etmekBiri zararlı bir şey yazınca ne olduğunu da test etmek

Sık yapılan hatalar

  • Tarayıcıdaki kontrollere güvenmek. Ziyaretçinin kendi cihazında çalışan kontrolleri atlatmak kolaydır, bu yüzden sunucu her şeyi yeniden kontrol etmelidir.
  • Küçük bir sitenin güvende olduğunu sanmak. Otomatik araçlar, büyüklüklerine bakmadan çok sayıda siteyi tarar.
  • Bir formu düzeltip diğerlerini unutmak. Arama kutusu, filtreler, web adresi ve bir mobil uygulamanın arkasındaki API aynı özeni ister.
  • Şifreleri düz metin olarak saklamak. Veriler sızarsa, güçlü hash ile saklanan şifreleri (geri okunamayan karışık bir koda dönüştürülmüş şifreleri) kötüye kullanmak çok daha zordur.
  • Yalnızca güvenlik duvarına güvenmek. Bir filtre size zaman kazandırır. Arkasındaki güvensiz sorgunun yine de düzeltilmesi gerekir.

Size nasıl yardımcı olabiliriz

Linkysoft'ta SQL enjeksiyonu testi, siber güvenlik hizmetlerimizin bir parçasıdır. Sitenize, uygulamanıza ve API'nize güvenli, simüle edilmiş saldırılar yapar, kodu inceler ve bulduklarımızı ve nasıl düzelteceğinizi sade bir dille anlatan bir liste veririz. Düzeltmelerden sonra yeniden test ederiz. Bu, başka ekiplerin yaptığı siteler için de geçerlidir ve ücretsiz güvenlik kontrolü kolay bir ilk adımdır.

Yeni bir sistem mi planlıyorsunuz? Web uygulamalarımız ve yönetim sistemlerimiz tasarımdan itibaren güvenlidir, OWASP Top 10'a göre sıkılaştırılır ve yayına almadan önce sızma testinden geçer.

SQL Enjeksiyonu hakkında sorular

SQL enjeksiyonu basitçe nedir?
Birinin bir web formuna ya da web adresine veritabanı komutları yazdığı bir hiledir. Site bu metni kontrol etmezse veritabanı komutları çalıştırır. Saldırgan da böylece verileri okuyabilir, değiştirebilir ya da silebilir.
Küçük bir web sitesi SQL enjeksiyonuna uğrayabilir mi?
Evet. Saldırıların çoğu, siteleri büyüklüğüne bakmadan rastgele tarayan otomatik araçlardan gelir. Formu, arama kutusu ya da arkasında veritabanı olan her site hedef olabilir.
Sitemin SQL enjeksiyonuna açık olup olmadığını nasıl anlarım?
En güvenli yol, neye bakacağını bilen kişilerin yaptığı bir sızma testi ya da güvenlik açığı taramasıdır. Saldırıyı güvenli şekilde dener ve hangi sayfaların açık olduğunu size söylerler. Sayfalarınızda garip veritabanı hataları görünmesi de bir uyarı işaretidir.
SQL enjeksiyonunu önlemenin en iyi yolu nedir?
Her veritabanı sorgusunda hazır ifadeler, yani parametreli sorgular kullanın. Bunlar ziyaretçinin metnini komuttan ayrı tutar, böylece veritabanı onu asla çalıştırmaz. Bunun üzerine girdi kontrolleri, sınırlı veritabanı yetkileri ve düzenli güncellemeler ekleyin.
Güvenlik duvarı SQL enjeksiyonunu durdurur mu?
Web uygulaması güvenlik duvarı bilinen birçok saldırı kalıbını engeller ve iyi bir ek katmandır. Ama arkasındaki güvensiz kodu düzeltmez, saldırganlar da filtreleri aşmanın yeni yollarını bulmaya devam eder. Kodun kendisinin güvenli olması gerekir.
Kör SQL enjeksiyonu nedir?
Sayfanın veritabanından hiçbir veri göstermediği bir saldırı türüdür. Saldırgan evet ya da hayır cevaplı sorular sorar ve sayfanın nasıl değiştiğini ya da cevap vermesinin ne kadar sürdüğünü izler. Daha yavaştır ama yine de veritabanında ne olduğunu ortaya çıkarabilir.
Sitem SQL enjeksiyonuna uğradıysa ne yapmalıyım?
Saldırıyı engelleyin ya da etkilenen bölümü yayından kaldırın, sonra zayıf sorguyu bulup düzeltin. Şifreleri ve anahtarları değiştirin, hangi verilerin okunduğunu ya da değiştirildiğini kontrol edin, gerekirse yedeklerden temiz verileri geri yükleyin. Çalıştığınız yerin yasalarına göre müşterilerinize haber vermeniz de gerekebilir.
SQL enjeksiyonu sadece web siteleri için mi bir sorun?
Hayır. Mobil uygulamalar, masaüstü programları ve kullanıcı metnini bir SQL veritabanına gönderen her sistem aynı zayıflığa sahip olabilir. Uygulamalarda risk genellikle API'dedir, yani uygulamanın sunucusuyla konuşmak için kullandığı bağlantıda.

Bunun projenize nasıl uyduğundan hâlâ emin değil misiniz?

Ne inşa ettiğinizi bize anlatın, size sade bir dille yanıt verelim.