RSS feed
<< SQLi 102 : Union İle Temel Veri Okuma | Home | Mozilla Firefox 2.0.0.8 Universal XSS Zayıflığı >>

SQLi 102 Lab : UNION İle Tablolardan Veri Okuyalım!

SQL Injection 102 Lab

  1. Araç-Gereç
  2. Kullanım Talimatları
  3. Uygulama Hakkında Bilgi
  4. Zayıflık İncelemesi
  5. İstediğimiz Tablodan Veri Okuyalım!
  6. Ders Sonu Notları
  7. Referanslar(Lab & Teori)

Araç-Gereç

  • Kodlar
  • Apache Web Server Version 2.2.4
  • PHP Script Language Version 5.2.3
  • MySQL Database Version 5.0.45
  • phpMyAdmin Database Manager Version 2.10.2

    Kullanım Talimatları

    1. Kodları download edin.
    2. Arşivi açın (member.php, config.php, database.sql)
    3. config.php'deki veritabanı, kullanıcı adı, parola ayarlarını yapın.
    4. db.sql'i veritabanı sunucunuza import edin
    5. 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.

    2007-10-26_025816

    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.

    Kullanıcı Adı : 1 or 1=1--;
    2007-10-26_030940 

    İ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--

    2007-10-26_031803

    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!

    Oncelikli olarak, makalede yanlis yonlendirme oldugunu kesinlikle kabul etmiyorum.
    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.

    Add a comment Send a TrackBack