top of page

Lab: SQL injection vulnerability allowing login bypass

Yazarın fotoğrafı: Songül ÖZÜGÜRLER
Songül ÖZÜGÜRLER
28 Nis
2 dakikada okunur

Lab: SQL injection vulnerability allowing login bypass

Bu labda, uygulamanın login fonksiyonunda bulunan bir SQL Injection zafiyetini inceledim. Ama mesele sadece klasik bir SQLi değildi; asıl problem, uygulamanın kendi giriş mantığına fazla güvenmesi ydi.

Amaç netti: Uygulamaya administrator kullanıcısı olarak, şifreye hiç ihtiyaç duymadan giriş yapmak.

Bu yazıda, bu açığı nasıl fark ettiğimi , neden şüphelendiğimi ve nasıl istismar ettiğimi adım adım anlatıyorum.

Uygulama oldukça standart bir login ekranına sahipti. Kullanıcı adı ve şifre giriliyor, backend bu bilgileri veritabanında kontrol ediyor.

Lab: SQL injection vulnerability allowing login bypass

Bu noktada arkada çalışan sorgunun kabaca şu şekilde olduğunu tahmin etmek zor değil:

SELECT * FROM users 
WHERE username = 'abc' AND password = 'abc'

Mantık basit:

- Eğer sorgu bir kullanıcı döndürürse giriş başarılı

- Hiçbir kayıt dönmezse giriş reddediliyor

Buraya kadar her şey “normal” görünüyor.

Login, register ve password reset gibi alanlar benim için her zaman ilk kurcalanan yerler oluyor. Çünkü çoğu uygulama bu noktalarda:

- kullanıcı girdisini fazla ciddiye alıyor

- “kim ne yazsın ki buraya?” varsayımıyla ilerliyor

Ben de klasik refleksle kullanıcı adı alanında tek tırnak ( ' ) karakterinin nasıl davrandığını düşündüm. Çünkü SQL Injection çoğu zaman burada kendini belli eder.

SQL’de -- ifadesi, satırın geri kalanını yorum haline getirir. Yani ondan sonrası veritabanı tarafından hiç çalıştırılmaz .

Bunu bildiğim için kullanıcı adı alanına şu değeri girdim:

administrator'--
Lab: SQL injection vulnerability allowing login bypass

Uygulama bu girdilerle şu sorguyu oluşturdu:

SELECT * FROM users 
WHERE username = 'administrator'--' AND password = ''

Burada kritik nokta şu:

- -- sonrası yorum olduğu için

- AND password = '' kısmı tamamen devre dışı kalıyor

Yani sorgunun gerçek anlamı şu hale geliyor:

username = 'administrator'

Şifre kontrolü artık yok. Uygulama bunu fark etmiyor bile.

Veri tabanında administrator adlı bir kullanıcı bulunduğu için sorgu sonuç döndürdü. Uygulama da bunu “doğru kullanıcı” olarak kabul etti.

Böylece şifreyi bilmeden , doğrudan admin hesabıyla giriş yapmış oldum.

Lab: SQL injection vulnerability allowing login bypass

Bu açık ilk bakışta “klasik SQL Injection” gibi duruyor ama işin özü biraz daha derin:

- Kullanıcı girdisi doğrudan SQL sorgusuna ekleniyor

- Şifre kontrolünün her zaman çalışacağı varsayılıyor

- Parametreli sorgular kullanılmıyor

- Input validation yok denecek kadar zayıf

Uygulamanın ne yaptığını değil, ne yaptığını sandığını sorgulamak gerekiyor Bir sonraki labta görüşmek üzere 🌸🌸

 
 
bottom of page