2. Dereceden SQL Injection Nedir?
SQL Injection, bir web uygulamasının veritabanı katmanına kötü niyetli SQL sorgularının enjekte edilmesiyle gerçekleştirilen bir saldırı türüdür. Bu saldırının farklı türleri vardır ve bunlardan biri de "2. Dereceden SQL Injection" (Second-Order SQL Injection) olarak bilinir. 2. Dereceden SQL Injection, doğrudan değil dolaylı olarak saldırıya uğrayan bir SQL Injection çeşididir. İlk aşamada zararsız gibi görünen kötü niyetli bir kod, veritabanına kaydedilir ve daha sonra bir işlem sırasında aktif hale gelir.
2. Dereceden SQL Injection Nasıl Çalışır?
Örnek Senaryo:
Bir web uygulamasında kullanıcı kayıt formu olduğunu düşünelim. Kullanıcı adı, e-posta gibi bilgilerin girildiği bu formda, veritabanına kayıt yapılacak ve kullanıcı bilgileri saklanacaktır.
Adım 1: Zararlı Verinin Kaydedilmesi
Bir saldırgan, kullanıcı adı alanına zararlı bir SQL kodu yazarak bir hesap oluşturur. Örneğin, saldırgan adını "; DROP TABLE users; --"
olarak girer. Bu girdi, o an için zararsız gibi görünse de, aslında bir SQL komutudur ve amacı users
isimli tabloyu silmektir.
Örnek Girdi:
"; DROP TABLE users; --
Veritabanına Kaydedilen Girdi:
Adım 2: Zararlı Verinin Tekrar Kullanılması
Daha sonra, uygulama kullanıcı bilgilerini güncellerken veya başka bir işlem yaparken bu kullanıcı adı tekrar SQL sorgusuna dahil edilir. Zararlı kod içeren bu kullanıcı adı, dinamik bir SQL sorgusu ile birleştirildiğinde, zararlı SQL komutu çalıştırılır ve users
tablosu silinebilir.
Zararlı Kodu İçeren SQL Sorgusu:
SELECT * FROM users WHERE username = '"; DROP TABLE users; --';
SQL Sorgusu Sonucu:
2. Dereceden SQL Injection'dan Korunma Yöntemleri
Bu tür saldırılardan korunmanın birkaç temel yolu vardır:
1. Girdi Doğrulaması
Tüm kullanıcı girdileri dikkatlice doğrulanmalı ve temizlenmelidir. Zararlı kodları engellemek için belirli kurallar uygulanmalıdır.
Girdi Doğrulama Örneği:
2. Prepared Statements (Hazırda Bekleyen SQL İfadeleri)
Dinamik SQL sorguları yerine Prepared Statements kullanmak, zararlı kodların SQL sorgusu olarak çalıştırılmasını engeller.
Prepared Statement Kullanımı:
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM users WHERE username = ?");
pstmt.setString(1, username);
3. Veri Kaçış (Escaping)
Kullanıcı tarafından sağlanan veriler, SQL sorgularına dahil edilmeden önce uygun şekilde kaçış karakterleri eklenmelidir.
SQL Kaçış Örneği:
String safeInput = StringEscapeUtils.escapeSql(userInput);
4. Sürekli Güvenlik Testleri
Web uygulamaları düzenli olarak güvenlik testlerine tabi tutulmalı ve olası SQL Injection açıkları belirlenmelidir.
Güvenlik Testi Süreci:
Sonuç
2. Dereceden SQL Injection, genellikle gözden kaçan ama ciddi güvenlik riskleri taşıyan bir saldırı türüdür. Bu tür saldırılar, uygulamanın farklı bir noktasında zararlı kodun etkin hale gelmesi ile ortaya çıkar. Güvenli bir uygulama geliştirmek için kullanıcı girdilerinin dikkatli bir şekilde doğrulanması, güvenli SQL sorguları kullanılması ve düzenli güvenlik testleri yapılması gerekir.
Yorumlar
Yorum Gönder