SQLi 102 : Union İle Temel Veri Okuma
SQL Injection 102
Giriş
SQL Injection'a giriş niteliğindeki 101 kodlu dersimizi okuduktan ve anladıktan sonra, varolan bir SQL Injection açığını UNION ile nasıl daha etkili biçimde exploit edebileceğimize bakalım.
UNION Nedir, Ne Değildir?
UNION, SELECT ifadeleri ile geri dönen result set'leri, tek bir result set içine kombine etmeye yarar.Sentaksı :
SELECT username FROM users WHERE id=$id UNION SELECT time FROM Lastlogins WHERE id=$id
Örneğin bu örnek query'mizde, öncelikli olarak "users" tablosundan "username" sütünundan "id" parametresinin eşleştiği satırı ve aynı şekilde "LastLogins" tablosu ve "time" sütunundan kişinin son olarak online olduğu tarihi tek bir result set'e gömdük.
Burada, WHERE ifadesini aynı id parametresine göre seçtiysek de, bu zorunluluktan dolayı değil yani istediğiniz parametreleri WHERE'e koyabilirsiniz.
Default olarak; eğer iki result sette aynı row'lar dönerse, çiftler elenir ve dönen result sette her row'dan bir tane bulunur.DISTINCT ya da ALL keywordu ile bu duruma son verebilirsiniz.
Tabii ki bunu yaparken bazı kısıtlamaları var. Örneğin,
INTO OUTFILE isimli çok kullanışlı MySQL atraksiyonumuzu sadece ikinci SELECT ifadesi için kullanabiliyoruz.Daha sonra INTO OUTFILE ile ilgili uygulama örnekleri de yapacağız.
Sonra, ilk ve ikinci SELECT ifadelerindeki sütunların veri tipleri aynı olmalı.Yani ilkinde dönen veri integer ise, ikincisinden de dönen veri integer olmak zorunda!
Ayrıca, iki SELECT ifadesinden dönen sütun sayısı da eşit olmalı.Bu kadar kısıtlama fazla mı dediniz, merak etmeyin sütun sayısı problemi aşılabiliyor, veri tipleri için de maksimum 3-4 deneme yapıyorsunuz.
Temel olarak UNION ile ilgili olarak bilmeniz gerekenler bu kadar.
Nerelerde Görülür
Genellikle SELECT username FROM users WHERE id=$id query'sinin çalıştığı memberinfo.php ya da profil.php vs gibi scriptlerde, aslında, SELECT kullanıp, dönen sonucu da yazdıran her yerde(gerekli kontroller yapılmayan) görülür. Özellikle örnekteki ID parametresi gibi, WHERE ifadesine yerleştirilecek verinin numerik olduğu durumlarda görülür.Zira aksi durumda, text girmeniz gerektiği için başınıza bela olacak diğer önlemler alınmış olabilir.(Magic Quotes vs)
Ne Yapacağız
Sizin de tahmin ettiğiniz üzere, yapmak istediğimiz şey web programcısı SELECT ile veritabanından bir şey okurken, ekstradan bizim de yapacağımız injection ile kendi istediğimiz verileri okuyabilmemiz.
Uğurlama
UNION'un ne iş yaptığını anladıktan sonra, LAB uygulamamıza geçebiliriz.