SQLi 102 Lab : UNION İle Tablolardan Veri Okuyalım!
SQL Injection 102 Lab
- Araç-Gereç
- Kullanım Talimatları
- Uygulama Hakkında Bilgi
- Zayıflık İncelemesi
- İstediğimiz Tablodan Veri Okuyalım!
- Ders Sonu Notları
- Referanslar(Lab & Teori)
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
Uygulama, aslında member.php scripti, şekilde gördüğünüz üzere bir adet textbox ve buttondan oluşuyor.
Textbox'a profilini görmek istediğiniz kişinin ID'sini yazıyorsunuz, sonra size ilgili kişinin kullanıcı adı ve mail adresi geliyor.Örneğin textbox'a 1 girdiğimizde :
Zayıflık İncelemesi
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";
Gelen id parametresini POST global dizisinden hiçbir kontrol yapılmaksızın dinamik sql sorgusu içine katıyor.Açıkca, id parametresinin injectable olduğu görülüyor. Şimdi bundan ne şekilde faydalanabiliriz.
Geçen dersimizde or 1=1--; ile nasıl login panellerini bypass edebileceğimizi göstermiştik.Oradaki mantık, 1=1 şartını tüm satırlar sağladığı için result set'te tüm satırların olması, ve bunun sayesinde uygulamanın bizim girdiğimiz kullanıcı adı ve parolaya sahip bir kullanıcının veritabanında bulunduğuna inanmasıydı.Yine aynısını yapabiliriz; ve burada da or 1=1--; ile tüm satırların döndüğünü çok daha güzel şekilde görebiliriz.
İstediğimiz Tablodan Veri Okuyalım
İstediğimiz tablodan veri okuyabilmek için, öncelikli olarak SELECT ifadesi kullanmamız gerekiyor, bunun sonuçlarını da web programcımızın kullanıcı adı ve mailleri alıp yayınladığı resultset'in içine kombine edemezsek, verileri çeksek bile görüntüleme şansımız olmayacak.İşte burada UNION yardımımıza koşuyor.Result set'leri birleştirip, aynı döngüde bizim çektiğimiz verilerin de basılmasını sağlayabiliriz.
Kullanıcı Adı : -1 UNION SELECT username,password FROM users--
Gördüğünüz üzere, Kullanıcı Adı yerine yazan yerlere kullanıcı adlarını, fakat E-Mail yazan yerlere ise password sütunundan çektiği MD5 hashleri koydu.Şimdi kullanıcı adı yerine girdiğimiz query'iyi açıklayalım.
-1 UNION SELECT username,password FROM users--
Buradaki -1, ilk SELECT sorgusunun id parametresi. Dinamik SQL Query bölümünde de görüldüğü üzere sadece id hanesinde -1 yazan kayıtların bilgileri dönecek ilk SELECT'ten.Genellikle id atanirken, negatif sayılar kullanılmaz ve bu şekilde ilk sorgudan gelecek ve bizim işimize yaramayacak kayıtları elemiş olduk.
Diğer SELECT ifadesinde de users tablosundaki tüm kayıtların username ve password hanelerini istedik.Dönen kayıtlar, ilk SELECT ile aynı result set içerisinde yer aldı, ve ekrana basıldı.Sadece username ve password hanelerini isteme sebebim, UNION'in sentaksı gereği ilk ve ikinci SELECT ifadelerindeki sütun sayılarının eşit olması zorunluluğu!
Nasıl kolay değil mi?Veritabanından istediğimiz bilgileri okuyabiliyoruz!
Şimdi, "iyi de tablo ve sütun isimlerini bilmeseydik nasıl bu verileri okuyacaktık?" diye bana sormanız gerekiyor.Bunun cevabını, yani o tablo ve sütun isimlerinin nasıl öğrenilebileceğini 103 nolu dersimizde anlatacağız.
Ders Sonu Notları
UNION ile ilgili olarak anlatacaklarımın bir kısmını (dışarıdan tablo yapısı öğrenmek) bir sonraki derse bıraktım.Örnekleri kendi sisteminizde denemenizi şiddetle tavsiye ediyorum, aksi takdirde tam olarak bazı şeyler oturmayabilir.
Referanslar(Teori & Lab)
Ferruh Mavituna, SQL Injection - Union ile Data Okuma, http://ferruh.mavituna.com/makale/sql-injection-union-ile-data-okuma/
MySQL 5.0 Reference Manual : UNION Syntax http://dev.mysql.com/doc/refman/5.0/en/union.html
Re: SQLi 102 Lab : UNION İle Tablolardan Veri Okuyalım!
echo "Kullanici Adi : " .$row[0]."
E-Mail : ". $row[1];
yerine
echo "Kullanici Adi : " .$row[username]."
E-Mail : ". $row[email];
yazildiginda bu ders i$e yaramayacaktir. bu durumda sorun sorguda degil sorgunun ekrana basilmasinda. makalede yanli$ yonlendirme var.
Re: SQLi 102 Lab : UNION İle Tablolardan Veri Okuyalım!
Haricinde, makalede ekrana bastirmanin dogru sekilde yapildigini hic soylememis olsam da, sorun ekrana bastirmada degil,sorguda.Eger sorguya dahil edilen ID parametresi duzgun sekilde handle edilmis olsaydi injection olmayacakti.
Kodu sizin dediginiz gibi $row[user] && $ row[password] ile yazarsak bile ekrana bastirma noktasinda exploit edilemeyebilir lakin asagidaki payload ile ekrana yazdiracaklarimizi users.txt dosyasina yazdirabiliriz.
------------------------------------------------------
-1 union select username,password from users INTO OUTFILE 'C:/AppServ/www/users.txt'
------------------------------------------------------
haricinde http://localhost/users.txt den ilgili bilgileri okuruz .
-------------------
mesut e10adc3949ba59abbe56e057f20f883e
oykun c33367701511b4f6020ec61ded352059
Ahmet Mete a47a998034979b6e4185226aa3583bb1
-------------------
Uzun lafin kisasi o sekilde olmasa bile bu sekilde ya da su sekilde olur, verdiginiz ornek bir onlem ya da makalenin ise yaramamasi konusunda hukum bildirmez.Tek cozum ID parametresinin kontrollu sekilde dinamik sorguya dahil edilmesidir.



