SQLi Yaklaşım
Dinamik web uygulamaları, arka tarafta (backend) veri saklamak için veri tabanı kullanır. Web uygulamasındaki farklı noktalara erişim için rol erişim yöntemleri ile kontrol edilmektedir. Yani farklı rollerdeki kullanıcılar, farklı sayfalar üzerinde erişim hakkı kazanabilmektedir.
Saldırganlar, ise normalde herkesin erişemeyeceği örn. yönetim paneli veya veri tabanındaki kullanıcı parola bilgileri vb. bilgileri almak isteyebilir. SQL enjeksiyonu yaparak web sayfası veri tabanından istedikleri bilgileri çekebilirler. Bunun için yine XSS açıklığındaki gibi birtakım girdiler girerek, girdinin web sayfasında farklı davranış sergilemesini sağlamaya çalışılır. Bir önceki sayfadaki SQL'ler payload mantığında kullanılır.
Aşağıdaki örnek kod verilmiş olsun:
SQL enjeksyionu için genel yaklaşım aşağıdaki gibidir:
Referans noktası belirlenir. Bu nokta, uygulama davranışının doğal olduğu noktadır. Girdide name='mehmet' verildiğinde title'da örneğin LKD çıktı.
Zaafiyetin olduğu tespit edilir:
Yukarıdaki kod örneğinde tarayıcıdan name olarak,
mehmet' verildiğinde sentaks hatası alındı ve title yok.
mehmet'# verildiğinde ise LKD title'ı gördük, aha tamam bulduk. SQL enjeksiyonu vardır diyebiliriz dostlar.
Zaafiyet tespit edildiğinde sıra zaafiyetin sömürülmesi.
Burada diyez # işareti python kodunda yorum satırı anlamındadır. SQL'deki yorum satırı ise -- , # ve /* */ şeklidedir. MySQL'deki yorum satırları için bkz: http://www.mysqltutorial.org/mysql-comment/
Burada aslında birtakım girdiler verilerek SQL cümleciğini tahmin etmeye ve XSS'deki gibi değişik hamleler yapmaya çalışıyoruz. Aşağıdaki SQL cümlecikleri ile aynı sonuca ulaşılır:
Genelde yaklaşım girdide yapılan işlemler sonucu çıktıyı gözlemlemek. Amaç DB içeriğini almak.
Ayrıca SQL enjeksiyonu sadece yukardaki SELECT sorgularına yapılan müdahalelerle de sınırlı kalmayıp aşağıdaki SQL sorgu yerlerinde (UDATE, INSERT,...) de yapılabilir.
Bazen de öyle bir girdi verilirki SQL veri tabanı sunucuda bir nevi DoS yapılmış olur.
Last updated
Was this helpful?