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:

name = request.get('name')
query = "SELECT * FROM haberler WHERE yazar_ismi = ' " + name + "'"

result = ""
try:
    result = db.execute(query)
except Exception as e:
    pass

if result.size() > 0:
    for each in result:
        print each.title
else:
    print("Haber yok")

SQL enjeksyionu için genel yaklaşım aşağıdaki gibidir:

  1. 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ı.

  2. Zaafiyetin olduğu tespit edilir:

    Yukarıdaki kod örneğinde tarayıcıdan name olarak,

    1. mehmet' verildiğinde sentaks hatası alındı ve title yok.

    2. mehmet'# verildiğinde ise LKD title'ı gördük, aha tamam bulduk. SQL enjeksiyonu vardır diyebiliriz dostlar.

  3. 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:

SELECT * FROM Haberler where id=1    //LKD
SELECT * FROM Haberler where id=2-1  //LKD

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?