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.
Şu adla da bilinir SQLi SQL injection SQL enjeksiyon saldırısı SQL kod enjeksiyonu veritabanı enjeksiyonu enjeksiyon saldırısı
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:
- 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ı.
- Normal metin yerine küçük bir SQL parçası yazar. Bilinen bir örnek, bir giriş formunun şifre alanına ' OR '1'='1 yazmaktır.
- 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".
- 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ık | Daha güvenli alışkanlık |
|---|---|
| Ziyaretçi metnini doğrudan sorguya eklemek | Her 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östermek | Ziyaretçiye kısa bir mesaj, ayrıntılar gizli kayıtlarda |
| Aylarca güncellenmeyen eklentiler | Düzenli güncellemeler ve kurulu olanların net bir listesi |
| Sadece özelliklerin çalışıp çalışmadığını test etmek | Biri 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?
Küçük bir web sitesi SQL enjeksiyonuna uğrayabilir mi?
Sitemin SQL enjeksiyonuna açık olup olmadığını nasıl anlarım?
SQL enjeksiyonunu önlemenin en iyi yolu nedir?
Güvenlik duvarı SQL enjeksiyonunu durdurur mu?
Kör SQL enjeksiyonu nedir?
Sitem SQL enjeksiyonuna uğradıysa ne yapmalıyım?
SQL enjeksiyonu sadece web siteleri için mi bir sorun?
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.