SQL enjeksiyon nedir?nasıl yapılır?

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

atlas_tr

Kıdemli Üye
8 Ocak 2008
2,380
14
NErDe OLsam BEğeNİRsin
Hic bir sey bir gecede ogrenilmez

Eger bu konuda daha onceden calismadiysaniz buradaki konulari tam olarak anlamaniz vakit alabilir. Bazi konulari tam anlayamayabilirsiniz, her konuda ekstra arastirma yapmaniz, kendi kendinize bunlari test sistemlerinde denemeniz her zaman faydali olacaktir. Genel olarak konseptlerin yerlesmesi ise duzenli sekilde bu gelisime devam etmeniz sayesinde olacaktir.

Zeka detaydir

Bilgisayar teknolojileri konusunda en buyuk yanilgilardan biri bu islerin ekstrem sekilde zekaya ihtiyac oldugunun dusunulmesidir. Bu isin %90 calismak, okumak, denemek %10 ise zeka seviyesidir. ozetle herkes 100 kisi icerisinde ilk on kisi icerisine sadece calisma ile girebilir.

Bakmayin, Okuyun

internette inanilmaz derecede fazla bilgi olmasi bilgiyi degersiz kilmaya basladi bu da tabii ki hizli okuma seanslarina neden oluyor. Okurken bildiginiz konulara bakin. Yani hepsini okumaniz gerekmiyor sadece gozucuyla uzerinden gecebilirsiniz. onceden bilmediginiz ekstra bir nokta olabilir, bunlari goz gezdirirken yakalayabilirsiniz.

Bilmediginiz konulari ise sakin kafa ile, gerekiyorsa kagit kalemle, bilgisayardan ya da printer ciktisindan satir-satir okuyun.

Konu kafaniza tam oturmadiysa devam edin ve o konunun sonuna gelin. Makalenin sonunda tum taslar yerine birden oturabilir ya da bunun olusmasi bu is uzerinde harcadiginiz belli bir vakitten sonra da olabilir.

SQL Injection konusuna giris yapalim.

Temel konular genellikle cok uzun degiller, eger bu temellerde sorun yasiyorsaniz esas makale detaylarina ve gelismis konulara girmeden once bu temelleri internetteki diger kaynaklardan arastirin ve iyice anlamaya calisin.

SQL Injection web uygulamalarinda ki en ciddi aciklarin basinda gelir. ozellikle frameworkler ve ORM (Object Relational Mapping) gibi ekstra veritabani katmanlarinin populerlesmesi ile eskisine gore bugunlerde biraz daha az gorulmektedir ama emin olun hala heryerdeler!

Web uygulamasi gelistiricilercileri SQL Injection' i tam anlamadiklarindan dolayi bazi olumcul hatalar yaparlar. Bu yuzden bugun bilinen basit SQL Injection metodlari o kadar cok gorunmese de ileri de anlatacagimiz ileri seviye SQL Injection aciklarini cok buyuk firmalardan, hazir sistemlere kadar bir cok yerde gorebilirsiniz.

Guvenlikteki buyuk gunahlardan biri kisilerin bazi aciklar hakkinda “ben hackleyemediysem guvenlidir.” diye dusunmeleri. Yazi dizisi boyunca bu sekilde bir dizi SQL Injection sehir efsanelerine de yer verecegiz.

Not : SQL Injection veritabanindan ve dilden bagimsiz olarak her turlu uygulama-veritabani iliskisine sahip sistemde bulunabilir ve bu veritabanlarinin bir acigi degildir. SQL Injection' dan korunmak web gelistiricisinin gorevidir.

SQL Nedir?

SQL (Structured Query Language) veritabanlarinda data cekme, silme ve degistirme gibi islemler icin kullanilan basit yapili bir dildir. Bugun hemen hemen tum web uygulamalarinin altyapisinda veritabani destegi vardir ve bu web uygulamalari veritabani ile SQL araciligiyla anlasirlar.

Bir siteye mesaj biraktiginizda bu mesaj veritabanina kaydedilir. O mesaj onaylandiginda veritabanindaki bir alan guncellenmis olur. Yonetici veritabanindaki kaydi silerek o mesajin siteden silinmesini saglar.

Örnek bir kayit silme SQL cumlesi su sekilde olabilir;

DELETE FROM members WHERE id=17

Yukaridaki kod veritabani tarafindan calistirildiginda members tablosunda id alani 17 olan kayit silinecektir.

sizlere sundugumuz bu makale SQL dilinin basit detaylarini ele almayacaktir. Eger SQL konusunda zayif iseniz makaleyi anlamaniz guc olacaktir. Makaleye devam etmeden once SQL in temel komutlarini ogrenmenizi ve veritabani mantiginiz anlamanizi tavsiye ederiz.

SQL Injection Nedir?

Web uygulamalarinda bir cok islem icin kullanicidan alinan veri ile dinamik SQL cumlecikleri olusturulur. Mesela (SELECT * FROM Products) ornek SQL cumlecigi basit sekilde veritabanindan web uygulamasina tum urunleri dondurecektir. Bu SQL cumlecikleri olusturulurken araya sikistirilan herhangi bir ****-karakter SQL Injection' a neden olabilir.

****-Karakter Nedir?

****-karakter bir program icin ozel anlami olan karakterlere verilen isimdir. ornek olarak C temelli C#, Javascript, PHP gibi dillerde (\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\) backslash karakteri bir ****-karakterdir. Compiler (derleyici) ya da Interpreter (yorumlayici) bu karakteri gorunce ondan sonraki karakteri ona gore isler.

SQL' icin kritik ****karakter (') tek tirnak' tir. cunku iki tek tirnagin arasi string olarak algilanir. Diger bir onemli ****-karakter ise (;) noktali virguldur, satirin bittigini ve yeni satir basladigini bildirir.

Genel bir web uygulamasinda olasi bir uye girisi islemi su sekildedir ;

- Formdan gelen kullanici adi ve sifre bilgisi ile ilgili SQL cumlecigi olusturulur (SELECT * FROM members WHERE user='admin' AND password='sifre' gibi)

- SQL cumlecigi kayit donduruyorsa boyle bir kullanicinin var oldugu anlamina gelir ve session(oturum) acilir ve ilgili kullanici uye girisi yapmis olur.

- Eger veritabanindan kayit donmediyse "kullanici bulunamadi" veya "sifre yanlis" gibi bir hata ile ziyaretci tekrar uye girisi formuna gonderilir.

ornek bir uye girisi kodu verelim (ile yazilmis ornek bir uye girisi kodudur )

kodd1gs9.jpg


Kod gayet basit. 1. ve 2. satirda (username) ve (password) form degiskenlerinin degerlerini aliyor. 4. satirda SQL cumleciginin icerisine yerlestirip kullanici kontrolu yapiyor.

Bu islemden sonra 6. satirda sonucun bos olup olmadigina bakiyor. Eger bos ise yani kullanici veritabaninda bulunmadiysa 7. satirda goruldugu gibi kullaniciyi hata sayfasina gonderiyor.

Eger bulunduysa 10 ve 11. satirdaki islemleri yapiyor. Yani kullaniciya id' si ile birlikte bir session aciyor. Bu sayede kullanici sisteme giris yapmis oluyor.

Bu klasik bir login proseduru. Tabii ki daha farkli ya da karisik olabilir.

Kullanici adi ve sifreye bir injection denemesi yapip neler olacagini inceleyelim. Eger kullanici adi ve sifre yerine '' OR ''= ve " OR "=" girersek basarili bir sekilde uye giris yapmis oluyoruz ama nasil ve niye?

simdi calisan ornek kodu tekrar hatirlayalim 1 ve 2. satir form degerini aliyordu 4. satirda bu gelen degerleri SQL' in icerisine yerlestirip veritabaninda sorgu yaptirtiyordu.

Form degerlerini yerlerine yerlestirelim ve az onceki calisan SQL' e bakalim;

22222gz4.jpg


Farkettiginiz uzere bu SQL sorgusu her zaman dogru donecek ve (Members) tablosundaki tum uyeleri getirecektir. Bu SQL cumlecigini tercume edersek su sekilde olacaktir. Members tablosundan username bos olanlari ve password u bos olanlari getir ya da bos esittir bos!

Birinci ve ikinci mantiksal kontrolun kayit dondurup dondurmesi onemli degil cunku ucuncu kontrol her zaman dogru olarak doneceginden (bos her zamana bosa esit degil mi?) bu SQL cumlecigi her zaman tum kayitlari dondurecektir. Yani kayit bos mu dolu mu diye kontrol ettigimizde kayit dolu olarak gozukecektir. Farkettiyseniz OR kullandik dolayiyla mantiksal sorgularin herhangi bir dogru (true) olarak donerse tum kayitlar donmus oluyor.

Dolayisiyla bu SQL Injection' i yaptigimizda donen kayitlardaki ilk kullanici olarak giris yapilmis olacaktir.

Gordugunuz gibi SQL Injection; SQL cumleciklerinin arasina disaridan girdi yaparak SQL' i istediginiz sekilde manipule etmenize izin veriyor.
Baska bir kullanici olarak giris yapma

uye girisi yapmaktan bahsetmistik. Aslinda genelde ilk uye yonetici olur bu yuzden sansliyiz ama tabii ki bize bu yetmez. Biraz daha yeni numaraya ve detaylara ihtiyacimiz var. Bu yuzden simdi nasil baska bir kullanici olarak uye gisiri yapacagimizi gorecegiz. Baska bir kullanici olarak uye girisi yapmanin baska yontemleri de var ancak bu bolumde en basitini inceleyecegiz. Ek olarak bu yontemi daha sonraki ileri seviye SQL Injection' larda da sik sik kullanacagiz.

SQL dili ayni diger programlama ve betik (scripting) dilleri gibi kodun arasina kendi notlarimizi eklememiz icin yorum (comment) ozelligi sunar.

Exploit veya Exploit Etmek Nedir?

Bir sistemin herhangi bir acigini kullanarak sisteme istenilen islemin yaptirilmasina basit sekilde exploit etmek diyebiliriz. ornek olarak bir uyelik sisteminin SQL Injection uzerinden exploit edilmesi o sistemi SQL Injection acigi araciligi ile ele gecirmek, sistemden data calmak ya da ozetle sistemde normalde yetkinizin olmadigi bir islemi yapmaniz anlamina gelir.

Exploit ise tek basina sistemdeki acigi kullanan herhangi bir sekilde kod parcasidir. Bu bir dosya, derlenmis kod, script veya ozel sekilde hazirlanmis bir URL olabilir.

ornek olarak SELECT * FROM/*Uye bilgilerini alalim*/members kodu hic bir sorun cikarmadan calisacaktir. Yesil kisim veritabani tarafindan goz ardi edilecektir ve sadece gelistiricinin bir notu olarak dusunulecektir.

Ek olarak bu kod da sorunsuz sekilde calisacaktir SELECT * FROM/*Uye bilgilerini alalim members

Dikkat ettiyseniz ( / ) ile acilan yorum kismini hic kapatmadik. Koda bakarsaniz bu durumda kodun geri kalaninin da yesil oldugunu ve yorum olarak kabul edildiginiz gorebilirsiniz. Dolayisiyla bu yorum sentaksini SQL cumleciginin geri kalanini goz ardi etmek icin kullanabiliriz!

iki ana yorum sentaksi vardir;

SELECT * FROM/*Uye bilgilerini alalim*/members

Yada

SELECT * FROM--Uye bilgilerini alalim

Gordugunuz gibi ikinci seferde yeni bir kod kullandik. (--) iki tirenin anlami kodun geri kalanini yeni satira kadar yorum olarak kabul et demektir. Genelde (Line Comment) olarak gecer ve biz daha sik bunu kullanacagiz.

Veritabani Farkliliklari

Daha onceden de bahsettigimiz gibi uygulamalarin kullandigi veritabanlari farkli olabilir. simdiye kadar ki ornekler MS SQL Server baz alinarak yazildi ancak normalde baska veritabanlari ile de karsilasabilirsiniz.

Web uygulamalari icin en populer veritabanlari MySQL ve MS SQL Server' dir. Bunun harici karsilasilabilecek hepsi degil ama bazi diger veritabanlari sunlardir,

- Oracle

- PostgreSQL

- IBM DB2

- MS Access

- Sybase

Veritabanlari arasinda temel bir ANSI SQL dil standardi olsa da bir cok veritabani ekstra fonksiyonlar ve farkli islemler icin farkli fonksiyonlar ve sentaks kullanir. ilerleyen derslerde hem veritabanlarindaki farkliliklardan hem de isimize yaracak ekstralarindan ve isimizi zorlastiracak yanlarindan bahsedecegiz.

Yorum karakterleri SQL Injection maceralarimizda en iyi dostlarimizdan biri olacak cunku bir cok SQL Injection acigini -exploit- ederken SQL cumleciklerinin arka kismindaki olasi hatalardan kendimizi korumak icin hemen hemen her Injection' in sonunda bunu kullanacagiz.

Aslinda hemen hemen her durumda yorum karakterlerini kullanmadan da istedigimizi elde edebiliriz ama istedigimizi yorum karakteri olmadan elde etmek icin ekstra efor harcamamiz gerekecektir.

SELECT * FROM members WHERE username=' kullanici adi ' AND password=' sifre '

Bir onceki saldirida basit sekilde ‘ OR 1=1 enjekte etmis ve herhangi bir kullanici olarak uye girisi yapmistik. simdi ise baska bir kullanici olarak giris yapabilmek icin SQL cumlecigini oyle bir modifiye etmeliyiz ki sonuclarda sadece istedigimiz kullanici donmeli.

Yorum Karakterlerinin baska kullanimlari

Yorum karakterleri IDS, WAF (Web Application Firewall) ya da uygulama temelli filtreleri asma amacli da kullanilir. Konsept hakkinda fikir olmak adina basit bir ornek D/*x*/R/**/OP members SQL cumlecigi -DROP- kelimesine dayali calisan herhangi bir filtreyi gececek ve basarili sekilde members tablosunu silecektir

O zaman yorum karakterlerinin de gucunden faydalanarak kullanici adina su sekilde bir sey girdi yaparsak istedigimiz kullanici olarak uye girisi yapabiliriz.

SELECT * FROM members WHERE username='yonetici'--' AND password='aksjdhaskd'

Gordugunuz gibi SQL cumlecigi su hale donustu;

SELECT * FROM members WHERE username='yonetici'

Members tablosundan username kolonu yonetici olan kullaniciyi getir. Bu islemin sonucu olarak basarili bir sekilde yonetici kullanicisi olarak uye girisi yapmis olacaksiniz!

Dipnot : Şifre kismina herhangi bir sey girdik cunku bir cok web uygulamasi (SQL ile) kullaniciyi kontrol etmeden once girilen degerlerin bos yada 3 karakterden az olup olmamasi gibi kontroller yapar. -abcd- gibi rasgele bir kac karakter girerek bu olasiligi egale etmis olursunuz.

Dikkatli olun ve girdiginiz degerlerin uygulamanin limitleri icerisinde oldugundan emin olun. Bos birakirsaniz ve "giris basarisiz" gibi bir mesaj ile karsilasabilir ve uygulamanin guvenli olduguna dair yanlis bir kaniya kapilabilirsiniz


alıntıdır...
 

ForseX

Yeni üye
16 Şub 2012
36
0
istanbul
Hayla anlamadim bu sql yi Admin panelini Hakops panel bulucuyla buldum sonra Bu kodlar nere yazikcak ne olcak bilmiyorum ?
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.