SQL Injection' a Giriş ve SQL Injection Nedir?

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.

güven - 13 gün 16 saat 49 dakika önce

@ADONEX veya senin deyiminle 'real asp coder'

Yazdigin fonksiyonun saçmaliginin farkindamisin?:)


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")


en sondaki satir yerine

if isnumeric(id)=false then: response.redirect("numerikdegil.asp")

yazarsan ayni islemi yapmis olursun, bu da fonksiyona gerek olmadigini gösterir:)

ayrica söyledigin sekilde kesin çözüm degil malesef. id gerektiren islemler de evet ancak form girislerinde hayir;)

php inspector - 09.09.2009

bos isler bunlar, mutlaka bir açik birakabilirsiniz, en dogrusu hazir php frameworklarindan yararlanmaktir.

pear.php.net
cakephp.org
codeigniter.com

yukaridaki sitelerde benim kullandigim ve tavsiye ettigim php frameworklari bulabilirsiniz.

Kaan - 02.06.2009

Sha512 gibi bir güzellik elimizdeyken nasil olur da kirilmis md5'in en iyi oldugunu düsünebiliriz, bu garip.
Sha512 ile sifreliyorum ve veritabaninda fazla yer kaplamasin diye md5 ile takrar sifreliyorum.

Kaan - 02.06.2009

Arkadaslar, sql'de id gibi parametreleri ister istemez querystring ile gönderiyoruz ama gelen degerin numerik olup olmadigini kontrol etmeniz dahi bütün kötü niyetli denemeleri etkisiz kilacaktir diye düsünüyorum.

Mesela
int ID;
int.TryParse(Regex.Replace(Request.Url.Query, @"^\?id=(\d+)$","$1"), out ID);

dijeo - 12.03.2009

PHP için;
htmlspecialchars(); ve addslashes(); , stripslashes(); gibi fonksiyonlari kullanmanin yeterli olacagini düsünüyorum. Sifre bilgilerini kripto ile koruma konusunda ise md5'den daha gelismis bi versiyon olan sha1 kullanilmali. ASP de var mi bilmiyorum ama PHP de mevcut. Artik pek çok server sha1 destegi sunuyor.

Salih - 20.12.2008

Söyle bir hata buldum bu bir sql injection mudur? Nasil degerlendirebilirim? Tesekkürler.:
Microsoft OLE DB Provider for ODBC Drivers hata '80040e14'

[MySQL][ODBC 3.51 Driver][mysqld-5.0.45-community-nt]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=<% Response.Redirect "www.google.com" %> and numara=<% Response.Redirect "www.g' at line 1

C:\INETPUB\VHOSTS\***********\HTTPDOCS\../../*****/8.asp, satir 42

schwert - 26.06.2008

B.A.D listeyi vermis... açigi kapatmak isterseniz sunun gib bir kod kullanmaniz büyük ölçüde isinize yarayacaktir... kod php kodudur asp ye uyarlayabilirsiniz...

<?php
$text = "hi’ or ’a’=’a ";
$new_text = str_replace(array('/','#','admin','or','=','and','-','(',')','[',']','|','&',' '),"",$text);
echo $new_text;
?>

Emre - 09.06.2008

C# da yazdigimizi varsayarsak ... bir command object i edinelim

using(cmd = connection.createcommand()){
cmd.CommandText = "Select * From Whatever Where user=@user And pass=@pass"
//sora bu @ ile belirtilen parametrelerin degerlerini verelim
cmd.Parameters.Add("@user", SqlDBType.Int);
cmd.Parameters["@user"].Value = _usernameitasiyandegiskenim //string yada textbox.text yada querystring herneyse
}

simdi bu secure enough mi yoksa bunada çare bulundumu sevgili kevin mitnickler : ) saygilarimi sunarim kolay gelsin hepinize

slayerdark - 16.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:)

ramazan - 13.11.2007

sql komutlarini bulabilirmisiniz . bulursaniz memnun olurum kib

ADONEX - 03.10.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

B.A.D. - 17.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

çeçen - 13.07.2007

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

bektasaykut - 28.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

sdll - 22.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...

Materyalist - 12.06.2007

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

impale - 30.01.2007

sql ile ilgili bir çalisma ariyordum bu siteyi gördüm..
yararli bilgiler var. herkese kolay gelsin...

answer - 26.01.2007

sitenize yeni bakiyorum ve acayip merak lisiyim bana yardimci olursaniz sevi nirim bunlari daha kolay ve acik nasil ogrenebilirim bana ce vap verirseniz sevinirim simdiden tesekkurler yazilarinizi takip edicem

C4N_P0L4T - 23.01.2007

Bende Yeni Basladim Okuyorum Yazdiklarinizi Anlamadan Cok Begendim Bana Biraz Yardim Edip Yonlendirirseniz Sevinirim.Yani Nasil Baslicam Gibi Tesekkürler.

kuen - 23.01.2007

sql injection dan korunuyoruzda, xss den tam güvenli bir sekilde nasil korunuruzu bende uzun zamandir düsünüyorum, makaleni merakla bekliyorum ferruh.

1 - 2 - İleri » - »»

Yorum Yazın


Tüm yorumlar onaydan geçmektedir, bu işlem en uzun 30 dk. sürecektir. E-mail adresleri yeni yorumları bildirme harici hiç bir başka amaçla kullanılmamaktadır ve sitede gözükmemektedir.



Captcha Kodu