Bilginin Adresi Ana Sayfa
Forum Anasayfası Forum Anasayfası > Bilgisayar Güvenliği / Computer Security > Güvenlik / Security Makaleleri
  Aktif Konular Aktif Konular RSS - SQL Enjeksiyon da Son nokta
  SSS SSS  Forumu Ara   Events   Kayıt Ol Kayıt Ol  GiriÅŸ GiriÅŸ

SQL Enjeksiyon da Son nokta

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
megabros Açılır Kutu Gör
Security Professional
Security Professional
Simge

Kayıt Tarihi: 08-06-2009
Konum: Turkey
Status: Aktif DeÄŸil
Points: 752
Mesaj Seçenekleri Mesaj Seçenekleri   Thanks (0) Thanks(0)   Alıntı megabros Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: SQL Enjeksiyon da Son nokta
    Gönderim Zamanı: 24-08-2009 Saat 00:20

Hiç bir şey bir gecede öğrenilmez

Eğer bu konuda daha önceden çalışmadıysanız buradaki konuları tam olarak anlamanız vakit alabilir. Bazı konuları tam anlayamayabilirsiniz, her konuda ekstra araştırma yapmanız, kendi kendinize bunları test sistemlerinde denemeniz her zaman faydalı olacaktır. Genel olarak konseptlerin yerleşmesi ise düzenli şekilde bu gelişime devam etmeniz sayesinde olacaktır.

Zeka detaydır

Bilgisayar teknolojileri konusunda en büyük yanılgılardan biri bu işlerin ekstrem şekilde zekaya ihtiyaç olduğunun düşünülmesidir. Bu işin %90 çalışmak, okumak, denemek %10 ise zeka seviyesidir. Özetle herkes 100 kişi içerisinde ilk on kişi içerisine sadece çalışma ile girebilir.

Bakmayın, Okuyun

İnternette inanılmaz derecede fazla bilgi olması bilgiyi değersiz kılmaya başladı bu da tabii ki hızlı okuma seanslarına neden oluyor. Okurken bildiğiniz konulara bakın. Yani hepsini okumanız gerekmiyor sadece gözucuyla üzerinden geçebilirsiniz. Önceden bilmediğiniz ekstra bir nokta olabilir, bunları göz gezdirirken yakalayabilirsiniz.

Bilmediğiniz konuları ise sakin kafa ile, gerekiyorsa kağıt kalemle, bilgisayardan ya da printer çıktısından satır-satır okuyun.

Konu kafanıza tam oturmadıysa devam edin ve o konunun sonuna gelin. Makalenin sonunda tüm taşlar yerine birden oturabilir ya da bunun oluşması bu iş üzerinde harcadığınız belli bir vakitten sonra da olabilir.

Şimdi Abilerim Kardeşlerim yawaş yawaş SQL Injection konusuna giriş yapalım.

Temel konular genellikle çok uzun değiller, eğer bu temellerde sorun yaşıyorsanız esas makale detaylarına ve gelişmiş konulara girmeden önce bu temelleri internetteki diğer kaynaklardan araştırın ve iyice anlamaya çalışın.

SQL Injection web uygulamalarında ki en ciddi açıkların başında gelir. Özellikle frameworkler ve ORM (Object Relational Mapping) gibi ekstra veritabanı katmanlarının popülerleşmesi ile eskisine göre bugünlerde biraz daha az görülmektedir ama emin olun hala heryerdeler!

Web uygulaması geliştiricilercileri SQL Injection’ ı tam anlamadıklarından dolayı bazı ölümcül hatalar yaparlar. Bu yüzden bugün bilinen basit SQL Injection metodları o kadar çok görünmese de ileri de anlatacağımız ileri seviye SQL Injection açıklarını çok büyük firmalardan, hazır sistemlere kadar bir çok yerde görebilirsiniz.

Güvenlikteki büyük günahlardan biri kişilerin bazı açıklar hakkında “ben hackleyemediysem güvenlidir.” diye düşünmeleri. Yazı dizisi boyunca bu şekilde bir dizi SQL Injection şehir efsanelerine de yer vereceğiz.

Son olarak SQL Injection hakkında önemli bir not,
SQL Injection veritabanından ve dilden bağımsız olarak her türlü uygulama-veritabanı ilişkisine sahip sistemde bulunabilir ve bu veritabanlarının bir açığı değildir. SQL Injection’ dan korunmak web geliştiricisinin görevidir.

SQL Nedir?

SQL (Structured Query Language) veritabanlarında data çekme, silme ve değiştirme gibi işlemler için kullanılan basit yapılı bir dildir. Bugün hemen hemen tüm web uygulamalarının altyapısında veritabanı desteği vardır ve bu web uygulamaları veritabanı ile SQL aracılığıyla anlaşırlar.

Bir siteye mesaj bıraktığınızda bu mesaj veritabanına kaydedilir. O mesaj onaylandığında veritabanındaki bir alan güncellenmiş olur. Yönetici veritabanındaki kaydı silerek o mesajın siteden silinmesini sağlar.

Örnek bir kayıt silme SQL cümlesi şu şekilde olabilir;
DELETE FROM members WHERE id=17

Yukarıdaki kod veritabanı tarafından çalıştırıldığında members tablosunda id alanı 17 olan kayıt silinecektir.

sizlere sunduğumuz bu makale SQL dilinin basit detaylarını ele almayacaktır. Eğer SQL konusunda zayıf iseniz makaleyi anlamanız güç olacaktır. Makaleye devam etmeden önce SQL in temel komutlarını öğrenmenizi ve veritabanı mantığınız anlamanızı tavsiye ederiz.

SQL Injection Nedir?

Web uygulamalarında bir çok işlem için kullanıcıdan alınan veri ile dinamik SQL cümlecikleri oluşturulur. Mesela “SELECT * FROM Products” örnek SQL cümleciği basit şekilde veritabanından web uygulamasına tüm ürünleri döndürecektir. Bu SQL cümlecikleri oluşturulurken araya sıkıştırılan herhangi bir meta-karakter SQL Injection’ a neden olabilir.

———————————————————————————————————————

Meta-Karakter Nedir?

Meta-karakter bir program için özel anlamı olan karakterlere verilen isimdir. Örnek olarak C temelli C#, Javascript, PHP gibi dillerde (\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\) backslash karakteri bir meta-karakterdir. Compiler (derleyici) ya da Interpreter (yorumlayıcı) bu karakteri görünce ondan sonraki karakteri ona göre işler.

SQL’ için kritik metakarakter (‘) tek tırnak’ tır. Çünkü iki tek tırnağın arası string olarak algılanır. Diğer bir önemli meta-karakter ise (;) noktalı virgüldür, satırın bittiğini ve yeni satır başladığını bildirir.

———————————————————————————————————————

Genel bir web uygulamasında olası bir üye girişi işlemi şu şekildedir;

·      Formdan gelen kullanıcı adı ve şifre bilgisi ile ilgili SQL cümleciği oluşturulur (SELECT * FROM members WHERE user=’admin’ AND password=’sifre’ gibi)

·        SQL cümleciği kayıt döndürüyorsa böyle bir kullanıcının var olduğu anlamına gelir ve session(oturum) açılır ve ilgili kullanıcı üye girişi yapmış olur.

·        Eğer veritabanından kayıt dönmediyse “kullanıcı bulunamadı” veya “şifre yanlış” gibi bir hata ile ziyaretçi tekrar üye girişi formuna gönderilir.

Kod gayet basit. 1. ve 2. satırda “username” ve “password” form değişkenlerinin değerlerini alıyor. 4. satırda SQL cümleciğinin içerisine yerleştirip kullanıcı kontrolü yapıyor.

Bu işlemden sonra 6. satırda sonucun boş olup olmadığına bakıyor. Eğer boş ise yani kullanıcı veritabanında bulunmadıysa 7. satırda görüldüğü gibi kullanıcıyı hata sayfasına gönderiyor.

Eğer bulunduysa 10 ve 11. satırdaki işlemleri yapıyor. Yani kullanıcıya id’ si ile birlikte bir session açıyor. Bu sayede kullanıcı sisteme giriş yapmış oluyor.

Bu klasik bir login prosedürü. Tabii ki daha farklı ya da karışık olabilir.

Kullanıcı adı ve şifreye bir injection denemesi yapıp neler olacağını inceleyelim. Eğer kullanıcı adı ve şifre yerine “’ OR ’’=’” ve “’ OR ’’=’” girersek başarılı bir şekilde üye giriş yapmış oluyoruz ama nasıl ve niye?

Şimdi çalışan örnek kodu tekrar hatırlayalım 1 ve 2. satır form değerini alıyordu 4. satırda bu gelen değerleri SQL’ in içerisine yerleştirip veritabanında sorgu yaptırtıyordu.

Farkettiğiniz üzere bu SQL sorgusu her zaman doğru dönecek ve “Members” tablosundaki tüm üyeleri getirecektir. Bu SQL cümleciğini tercüme edersek şu şekilde olacaktır. Members tablosundan username boş olanları ve password ü boş olanları getir ya da boş eşittir boş!

Birinci ve ikinci mantıksal kontrolün kayıt döndürüp döndürmesi önemli değil çünkü üçüncü kontrol her zaman doğru olarak döneceğinden (boş her zamana boşa eşit değil mi?) bu SQL cümleciği her zaman tüm kayıtları döndürecektir. Yani kayıt boş mu dolu mu diye kontrol ettiğimizde kayıt dolu olarak gözükecektir. Farkettiyseniz OR kullandık dolayıyla mantıksal sorguların herhangi bir doğru (true) olarak dönerse tüm kayıtlar dönmüş oluyor.

Dolayısıyla bu SQL Injection’ ı yaptığımızda dönen kayıtlardaki ilk kullanıcı olarak giriş yapılmış olacaktır.

Gördüğünüz gibi SQL Injection; SQL cümleciklerinin arasına dışarıdan girdi yaparak SQL’ i istediğiniz şekilde manipüle etmenize izin veriyor.

Başka bir kullanıcı olarak giriş yapma

Üye girişi yapmaktan bahsetmiştik. Aslında genelde ilk üye yönetici olur bu yüzden şanslıyız ama tabii ki bize bu yetmez. Biraz daha yeni numaraya ve detaylara ihtiyacımız var. Bu yüzden şimdi nasıl başka bir kullanıcı olarak üye gişiri yapacağımızı göreceğiz. Başka bir kullanıcı olarak üye girişi yapmanın başka yöntemleri de var ancak bu bölümde en basitini inceleyeceğiz. Ek olarak bu yöntemi daha sonraki ileri seviye SQL Injection’ larda da sık sık kullanacağız.

SQL dili aynı diğer programlama ve betik (scripting) dilleri gibi kodun arasına kendi notlarımızı eklememiz için yorum (comment) özelliği sunar.

———————————————————————————————————————

Exploit veya Exploit Etmek Nedir?

Bir sistemin herhangi bir açığını kullanarak sisteme istenilen işlemin yaptırılmasına basit şekilde exploit etmek diyebiliriz. Örnek olarak bir üyelik sisteminin SQL Injection üzerinden exploit edilmesi o sistemi SQL Injection açığı aracılığı ile ele geçirmek, sistemden data çalmak ya da özetle sistemde normalde yetkinizin olmadığı bir işlemi yapmanız anlamına gelir.

Exploit ise tek başına sistemdeki açığı kullanan herhangi bir şekilde kod parçasıdır. Bu bir dosya, derlenmiş kod, script veya özel şekilde hazırlanmış bir URL olabilir.

———————————————————————————————————————

Örnek olarak SELECT * FROM/*Uye bilgilerini alalim*/members kodu hiç bir sorun çıkarmadan çalışacaktır. Yeşil kısım veritabanı tarafından göz ardı edilecektir ve sadece geliştiricinin bir notu olarak düşünülecektir.

Ek olarak bu kod da sorunsuz şekilde çalışacaktır SELECT * FROM/*Uye bilgilerini alalim members

Dikkat ettiyseniz “/*“ ile açılan yorum kısmını hiç kapatmadık. Koda bakarsanız bu durumda kodun geri kalanının da yeşil olduğunu ve yorum olarak kabul edildiğiniz görebilirsiniz. Dolayısıyla bu yorum sentaksını SQL cümleciğinin geri kalanını göz ardı etmek için kullanabiliriz!

İki ana yorum sentaksı vardır;
SELECT * FROM/*Uye bilgilerini alalim*/members
ya da
SELECT * FROM–Uye bilgilerini alalim

Gördüğünüz gibi ikinci seferde yeni bir kod kullandık. “–“ İki tirenin anlamı kodun geri kalanını yeni satıra kadar yorum olarak kabul et demektir. Genelde “Line Comment” olarak geçer ve biz daha sık bunu kullanacağız.

——————————————————————————————————–

Veritabanı Farklılıkları

Daha önceden de bahsettiğimiz gibi uygulamaların kullandığı veritabanları farklı olabilir. Şimdiye kadar ki örnekler MS SQL Server baz alınarak yazıldı ancak normalde başka veritabanları ile de karşılaşabilirsiniz.

Web uygulamaları için en popüler veritabanları MySQL ve MS SQL Server’ dır. Bunun harici karşılaşılabilecek hepsi değil ama bazı diğer veritabanları şunlardır,

·        Oracle

·        PostgreSQL

·        IBM DB2

·        MS Access

·        Sybase

Veritabanları arasında temel bir ANSI SQL dil standardı olsa da bir çok veritabanı ekstra fonksiyonlar ve farklı işlemler için farklı fonksiyonlar ve sentaks kullanır. İlerleyen derslerde hem veritabanlarındaki farklılıklardan hem de işimize yaracak ekstralarından ve işimizi zorlaştıracak yanlarından bahsedeceğiz.

——————————————————————————————————–

Yorum karakterleri SQL Injection maceralarımızda en iyi dostlarımızdan biri olacak çünkü bir çok SQL Injection açığını “exploit” ederken SQL cümleciklerinin arka kısmındaki olası hatalardan kendimizi korumak için hemen hemen her Injection’ ın sonunda bunu kullanacağız.

Aslında hemen hemen her durumda yorum karakterlerini kullanmadan da istediğimizi elde edebiliriz ama istediğimizi yorum karakteri olmadan elde etmek için ekstra efor harcamamız gerekecektir.

SELECT * FROM members WHERE username=’ kullanıcı adı ’ AND password=’ şifre ’

Bir önceki saldırıda basit şekilde ‘ OR 1=1 enjekte etmiş ve herhangi bir kullanıcı olarak üye girişi yapmıştık. Şimdi ise başka bir kullanıcı olarak giriş yapabilmek için SQL cümleciğini öyle bir modifiye etmeliyiz ki sonuçlarda sadece istediğimiz kullanıcı dönmeli.

——————————————————————————————————–

Yorum Karakterlerinin başka kullanımları

Yorum karakterleri IDS, WAF (Web Application Firewall) ya da uygulama temelli filtreleri aşma amaçlı da kullanılır. Konsept hakkında fikir olmak adına basit bir örnek D/*x*/R/**/OP members SQL cümleciği “DROP“ kelimesine dayalı çalışan herhangi bir filtreyi geçecek ve başarılı şekilde members tablosunu silecektir

——————————————————————————————————–

O zaman yorum karakterlerinin de gücünden faydalanarak kullanıcı adına şu şekilde bir şey girdi yaparsak istediğimiz kullanıcı olarak üye girişi yapabiliriz.

SELECT * FROM members WHERE username=’yonetici’–’ AND password=’aksjdhaskd’

Gördüğünüz gibi SQL cümleciği şu hale dönüştü;
SELECT * FROM members WHERE username=’yonetici’

members tablosundan username kolonu yonetici olan kullanıcıyı getir. Bu işlemin sonucu olarak başarılı bir şekilde yonetici kullanıcısı olarak üye girişi yapmış olacaksınız!

DİPNOT = Şifre kısmına herhangi bir şey girdik çünkü bir çok web uygulaması (SQL ile) kullanıcıyı kontrol etmeden önce girilen değerlerin boş yada 3 karakterden az olup olmaması gibi kontroller yapar. “abcd” gibi rasgele bir kaç karakter girerek bu olasılığı egale etmiş olursunuz.

Dikkatli olun ve girdiğiniz değerlerin uygulamanın limitleri içerisinde olduğundan emin olun. Boş bırakırsanız ve “giriş başarısız” gibi bir mesaj ile karşılaşabilir ve uygulamanın güvenli olduğuna dair yanlış bir kanıya kapılabilirsiniz.

SQL Injection Test Laboratuarı Kurma

Eğer bir önceki anlattıklarımızı elinizi kirletmeden anladığınızı düşünüyorsanız, büyük bir yanılgı içerisindeniz.

Şimdi hemen bir test sistemi kuracağız ve siz de buradaki tüm işlemleri bu test sisteminde test etme fırsatı bulacaksınız. Bu sistemi kurmanızı ve tüm buradaki işlemleri ve daha fazlasını kendi sisteminizde test etmeniz şiddetle tavsiye edilir.

Bu sistem daha sonraki bölümlerde ve kendiniz yeni bir SQL Injection üzerinde çalışırken çok işinize yarayacak.

Sistemi kurabilmemiz için 3 ana materyale ihtiyacımız var,

1 -   Web Sunucusu
Testlerimizde IIS (Internet Information Services) kullanacağız. Teknik olarak ASP çalıştırabilen herhangi bir web sunucusuda olabilir ancak olası sorunları ortadan kaldırmak için IIS kullanmanız tavsiye edilir.

a – Windows XP Professional

b – Windows 2003

c – Windows NT

d – Windows Vista işletim sistemlerinde IIS çalışacaktır. IIS “Kontrol Paneli > Ekle Kaldır > Windows Components” altından kurulabilir. ASP desteğini seçmeyi unutmayınız.

2 – Veri Tabanı
Belirttiğimiz gibi veritabanı olarak şu an SQL Server a ihtiyacımız var. SQL Server 2005 Express ücretsiz olarak indirilebilir veya elinizde varsa SQL Server 2000’ i de kullanabilirsiniz.

SQL Server ve IIS kurulum yönetim detaylarına burada değinilmeyecektir, eğer bunlarla ilgili sorun yaşıyorsanız Google Amcaya sorun sorunlarınızı çözüp ve kaldığınız yerden devam edin.

Daha iyi ve kullanışlı bir test sistemi oluşturabilmek için  www.vmware.com/   kullanabilirsiniz. VmWare ücretsizdir, Kurduktan sonra sisteminizde sanal yeni bir işletim sistemi oluşturma şansınız olacak.

Test Laboratuarı

Aşağıda bu geçtiğimiz bölümlerde gösterilen kodlar ve ek dosyalar bulunmaktadır. Bu kodlar sayesinde dersleri tamamen kendi sisteminizde test edebilirsiniz. Bunu yapmanızı şiddetle tavsiye ederim.

http://uploaded.to/?id=fnq9yg     içerisinde gereken dosyaları bulabilirsiniz.

Kodları Kullanma Adımları

Sıkıştırılmış dosyaları açın (db.asp, login.asp, admin.asp)

db.asp içerinde veritabanı ayarlarınızı yapın

login.sql ile veritabanınızı oluşturun

Veritabanına biraz bilgi ekleyin, kullanıcı, şifre vs.

Web sunucunuzu ayarlayıp login.asp dosyasını tarayıcınızdan çağırın

Saygılar..


Düzenleyen megabros - 24-08-2009 Saat 00:20
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Kutu Gör



Bu Sayfa 0.148 Saniyede Yüklendi.