SQLi 103 Lab : UNION ile Veritabanı Yapısını Öğrenelim
SQL Injection 103
Araç-Gereç
Kullanım Talimatları
- Kodları download edin.
- Arşivi açın (member.php, config.php, database.sql)
- config.php'deki veritabanı, kullanıcı adı, parola ayarlarını yapın.
- db.sql'i veritabanı sunucunuza import edin
- member .php'yi web sunucunuzdan çağırın
Uygulama Hakkında Bilgi
Kullanacağımız uygulama, SQL Injection 102 Lab : UNION İle Tablolardan Veri Okuyalım! LABinin uygulaması ile aynı uygulama.Çok tembel bir insan olduğumdan yeni bir uygulama yazmadım.
Ama o LAB'i okumamış olanlar için söyleyeyim, kullanacağımız asıl olarak member.php,bir adet textbox ve butondan oluşan, girilen id'li kullanıcının adını ve mail adresini döndüren şirin ve ufak bir web uygulamasıdır.
Zayıflık İncelemesi
Yine zayıflık incelemesini de bir önceki LAB'ımızda yapmıştık:
Kodun,veritabanından ID parametresine göre bilgileri çektiği kısım :
$id=$_POST["id"];
$sql="SELECT username,email FROM users WHERE id = $id";
Buradaki id parametresi, hiçbir filtreleme ya da benzer bir kontrolden geçmeksizin dinamik SQL sorgusunun içine katıldığı için,id parametresi ile birlikte gelecek olan kötü niyetli SQL kodlarının sorguyu manipule etmesine olanak vermektedir.
INFORMATION_SCHEMA'dan İstediğimiz Bilgileri Alalım
INFORMATION_SCHEMA veritabanında, sunucu üzerindeki diğer veritabanları hakkında bilgi alabileceğimiz 3 adet tablo vardır.Bunlar daha önce de söylediğimiz üzere :
INFORMATION_SCHEMA SCHEMATA Table INFORMATION_SCHEMA TABLES Table INFORMATION_SCHEMA COLUMNS Table
Aslında INFORMATION_SCHEMA'da daha farklı bilgiler de yer almakla birlikte, bizim için şu seviyede önemli olan veritabanı, tablo ve kolon adlarıdır.
Öncelikli olarak, INFORMATON_SCHEMA.SCHEMATA tablosundan, veritabanlarını çekmek için:
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
Daha sonra, ilgi duyduğumuz veritabanına ait tabloları öğrenmek için :
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='veritabani'
Ve veritabanı,tablo adı belirlendikten sonra veri çekilecek kolon adları için :
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='tablo' && TABLE_SCHEMA='veritabani'
Sonrasında gelecek kolon adlarına dayalı olarak hangi kolondaki bilgiyi çekmek istiyorsanız; çekersiniz.
Bu Lab uygulamasında, screen shotlarla değil, olayın nasıl gerçekleştiğini video ile anlatmak istediğim için 3 dklık bir video hazırladım; şuradan download edebilirsiniz.Video; uzun query'leri ezberden girmeye çalıştığım için bu kadar uzadı:)
Referanslar
MySQL 5.0 Reference Manual :: 21 INFORMATION_SCHEMA Tables,
http://dev.mysql.com/doc/refman/5.0/en/information-schema.html