SQL Injection' a Giriş ve SQL Injection Nedir?

19.01.2007

Okuyucu : 41.719
Günlük Okuyucu : 86,2

SQL Injection

For successful operations, surprise must be achieved by guerrillas.
Intelligence is extremely important, and detailed knowledge of the target's dispositions, weaponry and morale is gathered before any attack.


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üvenlik Günahı !

Ben hackleyemediysem kimse hackleyemez.

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.

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 ederim.

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.

 

Örnek bir üye girişi kodu

ASP ile yazılmış örnek bir üye girişi kodu;

<%
1.          FUsername = Request.Form("username")
2.          FPassword = Request.Form("password")
3.
4.                Set RsLogin = SQLConn.Execute("SELECT * FROM Members WHERE username =      '" & FUsername & "' AND Password = '" & FPassword & "'")
5.
6.          If RsLogin.EOF AND RsLogin.BOF Then
7.                Response.Redirect "/error.asp"
8.   
9.          Else
10.               Session("login") = RsLogin("user_id")
11.               Response.Redirect "../"
12.
13.         End If
%>

Kod gayet basit. 1. ve 2. satırda “username ve “passwordform 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.

Form değerlerini yerlerine yerleştirelim ve az önceki çalışan SQL’ e bakalım;

SELECT * FROM Members WHERE username = '' OR ''='' AND Password = '' OR ''=''

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.
 
Şimdi SQL Injection videoyu izleyip SQL Injection’ ın en bilinen şeklini görmüş olalım.

Yorumlar

RSS Bu makalenin yorumlarını RSS ile takip et!

Benm yaptığım saftirik bir sitemde bu sql i kullanmıştım,, anlaşıldı nasıl girdikleri =)

yLmZ [ # | 20.01.2007 ]

o zaman db yapımızda ilk üyeyi herzaman en az yetkiyi vermeliyiz. Veya aklıma şimdi geldi. Bir if daha ekleyip

if memberID=1 then
Response.Redirect "/error.asp"
end if

dersek en azından adamı biraz daha uğraştırmış olabiliriz. Pekala saldırgan db den sorgu yaptıramadığı sürece ilk kullanıcı dışında herhangi biriyle login olamaz değilmi ?

Bu da az da olsa bir önlem olabilir. ' or 1=1 -- gibi bir sistem kullanarak test ederdim ben login panelini yazdığımda pekde başarılı olmazdım tabi. :)

Yazı çok güzel devamını bekliyoruz bloglarda tanıtıma başlıyoruz.

Varol [ # | 20.01.2007 ]

zaman db yapımızda ilk üyeyi herzaman en az yetkiyi vermeliyiz. Veya aklıma şimdi geldi. Bir if daha ekleyip

Aslinda hayir bu bir korunma degil hala SQL Injection a tamamen acikcisiniz, bir cok acidan. SQL Injection dan korunmak temel olarak cok basit ASP icin konusursak tek tirnagi iki cirft tirnak ile replace etmek yeterli olacaktir. Ancak biraz daha detayli korunma makalesi de yoldaki makalelerden.

Ferruh Mavituna [ # | 20.01.2007 ]

okadar da basite almayın bunu... Unutmayın ki XSS ataklarda var.. Bunun için ben asp girişlerimde bunu gibi bir fonksiyon kullanıyorum. Bunun ile sizde korunaiblirsiniz..

Function PostKontrol(yazi)

yazi = Replace(yazi, "<", "&lt;")
yazi = Replace(yazi, ">", "&gt;")
yazi = Replace(yazi, "script", "&#115;cript", 1, -1, 0)
yazi = Replace(yazi, "SCRIPT", "&#083;CRIPT", 1, -1, 0)
yazi = Replace(yazi, "Script", "&#083;cript", 1, -1, 0)
yazi = Replace(yazi, "script", "&#083;cript", 1, -1, 1)
yazi = Replace(yazi, "object", "&#111;bject", 1, -1, 0)
yazi = Replace(yazi, "OBJECT", "&#079;BJECT", 1, -1, 0)
yazi = Replace(yazi, "Object", "&#079;bject", 1, -1, 0)
yazi = Replace(yazi, "object", "&#079;bject", 1, -1, 1)
yazi = Replace(yazi, "applet", "&#097;pplet", 1, -1, 0)
yazi = Replace(yazi, "APPLET", "&#065;PPLET", 1, -1, 0)
yazi = Replace(yazi, "Applet", "&#065;pplet", 1, -1, 0)
yazi = Replace(yazi, "applet", "&#065;pplet", 1, -1, 1)
yazi = Replace(yazi, "embed", "&#101;mbed", 1, -1, 0)
yazi = Replace(yazi, "EMBED", "&#069;MBED", 1, -1, 0)
yazi = Replace(yazi, "Embed", "&#069;mbed", 1, -1, 0)
yazi = Replace(yazi, "embed", "&#069;mbed", 1, -1, 1)
yazi = Replace(yazi, "event", "&#101;vent", 1, -1, 0)
yazi = Replace(yazi, "EVENT", "&#069;VENT", 1, -1, 0)
yazi = Replace(yazi, "Event", "&#069;vent", 1, -1, 0)
yazi = Replace(yazi, "event", "&#069;vent", 1, -1, 1)
yazi = Replace(yazi, "document", "&#100;ocument", 1, -1, 0)
yazi = Replace(yazi, "DOCUMENT", "&#068;OCUMENT", 1, -1, 0)
yazi = Replace(yazi, "Document", "&#068;ocument", 1, -1, 0)
yazi = Replace(yazi, "document", "&#068;ocument", 1, -1, 1)
yazi = Replace(yazi, "cookie", "&#099;ookie", 1, -1, 0)
yazi = Replace(yazi, "COOKIE", "&#067;OOKIE", 1, -1, 0)
yazi = Replace(yazi, "Cookie", "&#067;ookie", 1, -1, 0)
yazi = Replace(yazi, "cookie", "&#067;ookie", 1, -1, 1)
yazi = Replace(yazi, "form", "&#102;orm", 1, -1, 0)
yazi = Replace(yazi, "FORM", "&#070;ORM", 1, -1, 0)
yazi = Replace(yazi, "Form", "&#070;orm", 1, -1, 0)
yazi = Replace(yazi, "form", "&#070;orm", 1, -1, 1)
yazi = Replace(yazi, "on", "&#111;n", 1, -1, 0)
yazi = Replace(yazi, "ON", "&#079;N", 1, -1, 0)
yazi = Replace(yazi, "On", "&#079;n", 1, -1, 0)
yazi = Replace(yazi, "on", "&#111;n", 1, -1, 1)
yazi = Replace(yazi, "document.cookie", "&#068;ocument.cookie", 1, -1, 1)
yazi = Replace(yazi, "javascript:", "javascript ", 1, -1, 1)
yazi = Replace(yazi, "vbscript:", "vbscript ", 1, -1, 1)
yazi = Replace(yazi, "'", "")
yazi = Replace(yazi, vbCrLf, "
")

PostKontrol = yazi

End Function


kullanmak için ise requestin başına PostKontrol yapın yeter.

Örneğin;

kadi = PostKontrol(Reques.Form("UserName"))

gibi. Şifre içinde herzaman kripto yapın. MD5 en iyisi. Takılan arkadaşlkar olursa mail atabilirler microsoft.turkey[at]gmail.com

B.A.D. [ # | 20.01.2007 ]

Unutmayın ki XSS ataklarda var..
Su anki konu ile tamamen alakasiz olmasinin yaninda kullandiginiz korunma koduna guvenmeniz buyuk bir hata lakin XSS ten korunmak icin en kotu yollardan biri o sekilde basir bir blacklisting yapmak. Sadece olurda birileri buradan alip kullanir diye yazayim dedim.

Ileride XSS konusuna da gelecegiz orada insallah detaylarina ineriz.

Simdilik `Server.HTMLEncode()` u kulanmaniz yukaridakine gore daha saglikli.

Ferruh Mavituna [ # | 21.01.2007 ]

Benim xss den kastım sonuçta yine bu yolla, stringler ile verinin aktarılmasıydı. Yani önemli olan o stringlerin, formların içerisi tarafından tanımsız kalmasını sağlamak, bunu söylemek istedim :)

B.A.D. [ # | 21.01.2007 ]

Benim xss den kastım sonuçta yine bu yolla, stringler ile verinin aktarılmasıydı. Yani önemli olan o stringlerin, formların içerisi tarafından tanımsız kalmasını sağlamak, bunu söylemek istedim :)
Hicbir koruma olmamasindan kat kat iyidir :)

Ferruh Mavituna [ # | 21.01.2007 ]

evet zaten replace ederek kullanıyorum query stringleri fakat bu yöntemde en azından adamı uğraştırır diye aklıma geldi :) yani madem girdin hemencecik müdürün odasına dalma ilk önce giriş katta dur demek :D

Varol [ # | 21.01.2007 ]

sql injection dan korunuyoruzda, xss den tam güvenli bir şekilde nasıl korunuruzu bende uzun zamandır düşünüyorum, makaleni merakla bekliyorum ferruh.

kuen [ # | 23.01.2007 ]

Bende Yenı Basladım Okuyorum Yazdıklarınızı Anlamadan Cok Begendım Bana Bıraz Yardım Edıp Yonlendırırsenız Sevınırım.Yanı Nasıl Baslıcam Gibi Tesekkürler.

C4N_P0L4T [ # | 23.01.2007 ]

sıtenıze yenı bakıyorum ve acayıp merak lısıyım bana yardımcı olursanız sevı nırım bunları daha kolay ve acık nasıl ogrenebılırım bana ce vap verırsenız sevınırım sımdıden tesekkurler yazılarınızı takıp edıcem

answer [ # | 26.01.2007 ]

sql ile ilgili bir çalışma arıyordum bu siteyi gördüm..
yararlı bilgiler var. herkese kolay gelsin...

impale [ # | 30.01.2007 ]

Acaba Buraya Yorum Yazanlardan Kaç Kisi "INJECTION" Kelimesinin Tam Olarak Ne Anlama Geldigini Biliyor?

Materyalist [ # | 12.06.2007 ]

SELECT * FROM Members WHERE Username = 'teyyare.. sallama ne yazarsan yaz ' AND Password= '' OR ''=''

kullanci adi ve siifresine ayni seyi yazmaya gerek yok biri yeterlii olur. ama nedendir çakamadim.. Ayrintili bi sekilde anlatirsa birisi çok iyi olur tabi anlayan var ise dernlemsine...

sdll [ # | 22.06.2007 ]

Dim Giris
Set Giris = Kaynak.Execute("Select deger from sifre where alan='sifre'")
If Giris(0)=Request.Form("sifre") Then
Session("oturum") = "xxx"
Else
If Session("oturum") <> "xxx" Then
Response.Write("Sifre yanlis : "&Request.Form("sifre"))
End If
End If
/////
Burada sql injection uygulanabilir mi sizce?
Kendi sistemimdeki kodlar bunlar

bektasaykut [ # | 28.06.2007 ]

hepsi bos önemli olan o kodlari taraslamak linux bilmiyosaniz hiç ugrasmayin:)

çeçen [ # | 13.07.2007 ]

Materyalist üzerime alinmiyorum ama baya bir muhalefetsin. injection anlamini sen biliyormusun? Yada sana XSS nedir yenirmi içilirmi diye mi sormaliyiz acaba. Sen en iyi html nedir onu söyle

bektasaykut senin sisteminde de injection uygulanir. Adindan da anlayacagin gibi bir yere enjekte etmekten geliyor. Yani sonucta sen sql inde bir sorgu veriyorsun. o sorgu nerden geliyor ? bir input tan. Sen inputtan gelen verini süzüp filtrelemezsen yada encrypt etmezsen gelen sql injection kodunu, direkman olarak sql e gönderiyorsun dogal olarak saldirgan senin belki sql ine direk sizamasa da yapisi hakkinda bilgi sahibi oluyor. Düsün ki ben veritabaninda ki üyeler diye bir form oldugunu ögrendim, id lerin Kimlik adinda ki bir tabloda oldugunu kullanici adinin da kadi adli bir tabloda oldugunu ve bunun gibi bir sürü sey. Tabi diyeceksin ki e ögrense ne olur?... Drop yöntemi ile düsürebilir hepsini. Belki senin 10-100 -1000 tane üyen vardir sorn degil dersin ama farzetki yonja ne bileyim hepsiburada gibi bir veritabanin var ozman da da dikkat etmen lazim...

SQL injection için kullanilan bütün komutlari veriyorum, kendi sistemlerinizde test edin. Oturun inceleyin hangi komutlar gönderiliyor. Buna göre fonksiyonlar yazin ve ayiklayin. Ama mutlaka !!! Mutlaka sifre islemlerini MD5 ile çevirin. Hemde 2 Kez..
MD5(MD5(Request.form("pass"))) :)

admin’--
’ or 0=0 --
" or 0=0 --
or 0=0 --
’ or 0=0 #
" or 0=0 #
or 0=0 #
’ or ’x’=’x
" or "x"="x
’) or (’x’=’x
’ or 1=1--
" or 1=1--
or 1=1--
’ or a=a--
" or "a"="a
’) or (’a’=’a
") or ("a"="a
hi" or "a"="a
hi" or 1=1 --
hi’ or 1=1 --
hi’ or ’a’=’a
hi’) or (’a’=’a
hi") or ("a"="a

B.A.D. [ # | 17.07.2007 ]

' id ile islem yaparken sql injection a kesin çözüm ! Bu güvenligi asla asamaz !
id=45 ' burayi ilk önce sayi ile test edin.sonra string yani herhengi bir kod ile ya da metin ile ! id=45 ve id="senerrr" gibi

Private Function x_injection(x)
if isnumeric(x)=true then
x_injection=true
else
x_injection=false
end if
End Function


if x_injection(id)=false then response.Redirect("index.asp?error=hataaaa") ' asp.dll bu kodu görünce asagidakinileri yorumlamadan hemen index.asp ye gider



' id="sener" burda false döner demek ki adam bizim id sorgumuza sql injection yapmistir.

' id=45 burda true döner ve demek ki sadece sayi geliyor. islem yapilabilir.

' code by : miyasof@hotmail.com
' real asp coder

ADONEX [ # | 03.10.2007 ]

sql komutlarini bulabilirmisiniz . bulursaniz memnun olurum kib

ramazan [ # | 13.11.2007 ]

sql komutlarini bilmeyen güvenlikçi arkadaslar acaba hackerana ya mi özenip geldiniz buraya yoksa güvenliginizi saglamak için arastirma yaparkenmi ehehe bu arada bunlar artik yeni sürüm apachelerde bi ise yaramazlar bosa ugrasmayin zaten yiyecek bi site bulursanizda egonuzu tatmin ederse o sizin zavalliliginizdir :)

slayerdark [ # | 16.11.2007 ]

Yorum Ekle





Kullanılabilir Taglar : [<blockquote>] [<strong>] [<em>]

SQL Injection' a Giriş ve SQL Injection Nedir? ile İlişkili Olabilecek Yazılar - Haberler

SQL Tunnelling - Exploiting Internal Networks via SQL Injection
İleri Seviye Javascript
Türkçe SQL Injection Referansı
Web Güvenlik Topluluğu 9 Mart Kadıköy Buluşması
Hala SSL' i Anlayamadılar

Diğer Yazılar

Neredeyim ?

Ferruh.Mavituna » SQL Injection Dersleri » SQL Injection' a Giriş ve SQL Injection Nedir?

Ferruh Mavituna
© 2002-2007, Ferruh Mavituna

Sabit IP Adresi : 81.22.99.133, SSL Erişimi, Hakkında