SQLi: Enjeksiyon Saldırısı
SQL Enjeksiyonu nedir?
SQLi, saldırganın bir web sitesinin veritabanında kötü amaçlı sorgular çalıştırabildiği web tabanlı bir uygulamadaki bir tür saldırıdır. SQL, kötü amaçlı SQL deyimlerini yürütmek için kullanılan bir kod enjeksiyon tekniğidir.
Örneğin, web sitesine giriş yapmak istiyorsanız ve kullanıcı adınızı ve şifrenizi unuttuysanız, SQLi enjeksiyonunu kullanarak şifreyi bilmeden giriş yapabilir veya web sayfasına erişebiliriz.
SQL enjeksiyonu nasıl çalışır?
SQL enjeksiyonu, uygulamadaki istemciden gelen giriş verileri aracılığıyla SQL sorgusunu eklemeyi veya enjekte etmeyi içerir. Bunlar, önceden tanımlanmış SQL komutlarını etkileyen veri düzlemine enjekte edilir.
SQL enjeksiyon saldırıları, dinamik SQL ifadelerindeki güvenlik açıklarını hedefler. Sonuç, bağımsız değişkenlere yerleştirilen değerler tarafından belirlenirken, parametreleri sabit olan çok değişkenli bir matematiksel işlev gibi dinamik bir SQL deyimi düşünün.
Benzer şekilde, dinamik bir SQL ifadesi de önceden tanımlanmış bir dizi parametreden (web formu gibi) oluşur ve tam ifade yalnızca kullanıcı girdi sağladığında oluşturulur.
Aşağıdaki oturum açma formu SQL deyimi örneğine bakın:
SELECT * FROM users WHERE username = '$username' AND password = bcrypt ('$password')
Dinamik bir SQL ifadesinde bir güvenlik açığı varsa, bir saldırgan bir forma karmaşık komut dosyası girerek mevcut parametreleri bozabilir ve tüm ifadenin anlamını değiştirebilir.
SQL enjeksiyon türleri:
Bant içi SQLi: Bant içi SQL enjeksiyonu, saldırganın sonucu aynı iletişim kanalı üzerinden doğrudan yanıt olarak aldığı bir tür SQL enjeksiyonudur. Örneğin, bir saldırgan web tarayıcısı aracılığıyla manuel olarak bir saldırı başlatırsa, saldırının sonuçları aynı web tarayıcısında görüntülenecektir. Bant içi SQL enjeksiyonu, geleneksel SQL enjeksiyonu olarak da bilinir.
Hata tabanlı SQL enjeksiyonu — Burada saldırgan, veritabanının bir hata mesajı oluşturmasına neden olan belirli eylemler gerçekleştirir. Hangi veritabanının kullanıldığını, işleyicinin hangi sunucu sürümünü kullandığını vb. belirlemek için hata mesajını kullanabilirsiniz.
Birlik Tabanlı SQL enjeksiyonu — Tek bir HTTP yanıtı almak için veritabanı tarafından oluşturulan bir ifade. Cevabı oluşturmak için sorguyu URL'de oluşturabilir veya giriş alanındaki birden fazla ifadeyi birleştirebilirsiniz.
Blind SQLi : Blind SQL enjeksiyonu, saldırganın saldırıya uğrayan veritabanından açık bir yanıt almadığı, bunun yerine veritabanı yapısını artımlı olarak yeniden yapılandırmak için veritabanı sunucusunun ve uygulamanın davranışını gözlemlediği bir SQL enjeksiyonu türüdür. Kör SQL enjeksiyonu aynı zamanda çıkarımsal SQL enjeksiyonu olarak da bilinir.
Boole Tabanlı — Burada, saldırgan veritabanına bir SQL sorgusu gönderir ve sorgunun True veya False döndürmesine bağlı olarak uygulamadan farklı sonuçlar döndürmesini ister.
Zamana Dayalı — Bu saldırıda, bir saldırgan bir veritabanına bir SQL sorgusu gönderir ve sonuçları paylaşmadan önce veritabanının belirli bir süre beklemesine neden olur. Yanıt süresi, bir saldırganın bir sorgunun doğru mu yoksa yanlış mı olduğunu belirlemesine yardımcı olur.
Bant Dışı SQLi: Bant Dışı SQL Enjeksiyonu (OOB SQLi), saldırganın aynı iletişim kanalı üzerinden saldırıya uğrayan uygulamadan yanıt almadığı, ancak kandırılarak gönderilebildiği bir SQL enjeksiyon türüdür. Saldırgan tarafından kontrol edilen uzak bir uç noktaya veri. Bant dışı SQL enjeksiyonu, yalnızca kullandığınız sunucunun DNS veya HTTP isteklerini tetikleyen komutlara sahip olması durumunda mümkündür. Ancak bu, tüm popüler SQL sunucuları için geçerlidir.
SQLi ile ilgili örnek
İlk örnek çok basit. Bir saldırganın uygulama güvenliğini aşmak ve yönetici olarak kimlik doğrulaması yapmak için bir SQL Injection güvenlik açığını nasıl kullanabileceğini gösterir.
Aşağıdaki komut dosyası, bir web sunucusunda yürütülen sözde koddur. Kullanıcı adı ve parola ile kimlik doğrulamanın basit bir örneğidir. usersÖrnek veritabanı, şu sütunlarla adlandırılmış bir tabloya sahiptir : usernameve password.
# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']
# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”
# Execute the SQL statement
database.execute(sql)
password' OR 1=1
SELECT id FROM users WHERE username='username' AND password='password' OR 1=1'
-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16
Kuruluşlar, SQL enjeksiyon saldırılarına karşı korunmak için aşağıdaki ilkeleri uygulayabilir.
- Kullanıcı girdilerine asla güvenmeyin. Dinamik SQL ifadelerinde kullanılmadan önce her zaman sterilize edilmelidirler.
Saklı Yordamlar — SQL deyimlerini kapsüllemenize ve tüm girişleri parametre olarak değerlendirmenize olanak tanır. - Hazırlanan İfadeler — Önce bir SQL ifadesi oluşturarak ve ardından gönderilen kullanıcı verilerini parametre olarak işleyerek çalışan hazırlanmış ifadeler. Bu, SQL deyimlerinin sözdizimini etkilemez.
Normal İfadeler — potansiyel olarak kötü niyetli kodu algılamak ve bir SQL ifadesi yürütülmeden önce onu kaldırmak için kullanılabilir. - Veritabanı Bağlantısı Kullanıcı İzinleri — Veritabanına bağlanmak için kullanılan hesaba yalnızca gerekli izinler verilmelidir. Bu, sunucudaki SQL deyimlerinin performansını düşürmeye yardımcı olur.
- Hata mesajları — Bunlar, hassas bilgileri veya hatanın tam yerini açıklamaz. "Üzgünüz, teknik bir hata oluştu. Teknik ekiple görüştüm. Hataya neden olan SQL deyimini görüntülemek yerine Daha sonra tekrar deneyin.
Bu tam olarak bir web uygulaması güvenlik duvarının (WAF) yaptığı şeydir. Şüpheli kod içeren eşleşmeler için web uygulamanıza yapılan tüm kullanıcı girişlerini analiz edin.
Karşılaştırmayı anladığınızı ve kavramları netleştirdiğinizi umuyoruz.
Bir yorum bırakın ve düşüncelerinizi paylaşın !!
Yazarın:
Akash Shekhavat, Madhuri Shelke, Chetan Shinde, Swarali Sole
Referanslar:
https://learn.microsoft.com/en-us/sql/relational-databases/security/sql-injection?view=sql-server-ver16
https://systemweakness.com/sql-injection-attacks-53e942aae1f8
https://qawerk.com/blog/what-is-sql-injection/
https://brightsec.com/blog/sql-injection-attack/

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































