Sayfayı Yazdır | Pencereyi Kapat

SQL Enjeksiyon da Son nokta

Nereden Yazdırıldığı: Bilginin Adresi
Kategori: Bilgisayar Güvenliði / Computer Security
Forum Adı: Güvenlik / Security Makaleleri
Forum Tanımlaması: Bilgisayarýnýzý Her Türlü Saldýrýya Karþý Korumak Ýçin Yapmanýz Gerekenler
URL: https://www.bilgineferi.com/forum/forum_posts.asp?TID=7971
Tarih: 13-07-2024 Saat 23:25


Konu: SQL Enjeksiyon da Son nokta
Mesajı Yazan: megabros
Konu: SQL Enjeksiyon da Son nokta
Mesaj Tarihi: 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..



Sayfayı Yazdır | Pencereyi Kapat