SQL Injection neden dolayı oluşur ve Nasıl Korunulur?

28.01.2007

Okuyucu : 7.645
Günlük Okuyucu : 16,1

SQL Injection neden dolayı oluşur ve Nasıl Korunulur?

Bu yazı dizisi temel olarak saldırıya dayalı olduğundan dolayı detaylı korunma ve defans yolları anlatılmamıştır ve bu yazı dizisi etrafında anlatılmayacaktır. Saldırıyı anlamak korunmayı anlamanın en önemli kısımlarından biridir. Yazıda sadece yöntemlere değinilmiş ve ilgili dil-platform implementasyon pratiği okuyucuya bırakılmıştır.

SQL Injection açığı neden oluşur ?

SQL Injection şüphe götürmez ki web uygulamalarında yaygınlık / hasar oranı en yüksek açıktır. Muhtemelen exploit etmesi de en eğlenceli ve bazen tahmin edilenden daha zor olan açıktır.

Belirttiğimiz gibi SQL Injection’ ın ana nedeni web uygulamasının kullanıcıdan gelen girdiyi doğru şekilde kontrol etmeden o girdi ile dinamik bir SQL cümleciği oluşturmasından kaynaklanmaktadır.

Bir önceki bölümdeki örnekte dikkat ettiyseniz saldırı girdisi (') tırnak karakteri ile başlamıştı. Çünkü SQL’ e istediğimiz komutu göndermek için öncelikle string bölümünden (') tırnak karakteri ile kaçıp daha sonra istediğimiz SQL komutunu SQL cümleciğine ekledik. Burada eklediğimiz komut “OR 1=1” gibi bir komuttu. Bu komut sayesinde SQL cümleciği tüm kayıtları döndürdüğünden dolayı sisteme başarılı bir şekilde giriş yapabilmiştik.

Özetle normalde SQL cümleciğinin yapısını değiştirerek yapması gerekeni değil yapmasını istediğimiz şeyi yaptırdık. Bunun ana nedeni ise SQL cümleciğinin içerisine dışarıdan (') tırnak karakteri aracılığı ile komut ekleyebilmemizdi.

 

 

Hacker Kültürü

SQL Injection ilk defa Rain Forest Puppy tarafından “How I hacked PacketStorm” makalesinde dokümante edilmiştir. Bu makale PacketStorm’ un SQL Injection ile hack edilmesini anlatır. İlginç olan ise bu dokümanda bu atak “SQL Injection” olarak tabir edilmez. Bu terim daha sonradan ortaya çıkıp kabul görmüştür.

SQL Injection açığı neden oluşur ?

SQL Injection’ dan korunma da iki altın kural vardır.

  1. Tüm meta-karakterlerden kaçılmalıdır,
  2. Nümerik olarak beklenen  parameterlerin nümerik olup olmadığı kontrol edilmelidir.

Birinci Kural;
Dinamik oluşturulan tüm SQL cümlecikleri meta karakterlerden başarılı bir şekilde kaçmalıdır. Örnek olarak SQL Server için (') tek tırnak karakterini uygulama (') iki tek tırnak ile değiştirilmelidir. Bu sayede SQL Server bunun tek tırnak karakteri olduğunu anlayabilir.

İkinci Kural;
Eğer oluşturulacak SQL cümlesi için beklenen data nümerik ise nümerik mi diye kontrol edilmeli eğer ve nümerik değilse uygulama bu datayı kabul etmemelidir.

Saldırının anatomisi anlaşıldıktan sonra defansı gayet basit olacaktır.

SQL cümleciği oluşturulmadan önce SQL cümleciğini oluşturmaya yardımcı olan tüm dinamik dataların beklenen data tiplerine uyup uymamasının kontrol edilmesi. Nümerik beklenen data gerçekten nümerik mi? gibi.String kayıtlarda kesinlikle meta karakterlerden kaçmaParameterized SQL cümlecikleri oluşturmaStored Procedure Kullanma (Stored Procedure lerde güvenli şekilde yazılmalıdır)Whitelisting, Sadece beklenen karakterlerin kabul edilmesi. Mesela isim girilecek bir yerde noktalama işaretlerinin kabul edilmemesi gibi. Whitelisting yapıldıktan sonra gene meta-karakterlerden kaçılmalıdır.Detaylı korunma metotları bu yazı dizisinin konusu dışındadır.

 

Yorumlar

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

command kullanıp parametre eklemek sanırım yapılabilecek en iyi şeylerden biri.

tehlike [ # | 28.01.2007 ]

parametre kullanıldığında da kaçılamıyor bildiğim kadarıyla

Varol [ # | 30.01.2007 ]

Diğer Makalelerinizi Bekliyorum ....

THeReAT [ # | 30.01.2007 ]

Gerçekten çok güzel olmuş. Ellerine sağlık. Makalelerin sonuna nasıl geldiğimi anlamadım. Bi solukta buraya kadar geldim. Ve bittiği için çok üzüldüm. Şu anda ise merakla bekliyorum. Başlangıç çok iyi inşallah sonu da böyle olur.

timudi [ # | 11.02.2007 ]

sayın ferruh mavituna,
acaba gelen verileri md5 algoritması ile encrypt edip o şekilde SQL Sorgusuna
sokarsak bu saldırıların önüne geçebilirmiyiz?
örn:

mysql_query("SELECT * FROM table WHERE md5(username)='".md5($_GET["username"])."' AND md5(password)='".md5($_GET["password"])."'");

test ettim,kanımca önüne geçilebilir ama sizin de fikrinizi almak isterim,yani sonuçta MD5 ile encrypt edilince içindeki ' veya diğer parametre işaretleri işlevini yitirecektir...

Kerem Inanc [ # | 17.02.2007 ]

sayın ferruh mavituna,
acaba gelen verileri md5 algoritması ile encrypt edip o şekilde SQL Sorgusuna
sokarsak bu saldırıların önüne geçebilirmiyiz?
örn:

mysql_query("SELECT * FROM table WHERE md5(username)='".md5($_GET["username"])."' AND md5(password)='".md5($_GET["password"])."'");

test ettim,kanımca önüne geçilebilir ama sizin de fikrinizi almak isterim,yani sonuçta MD5 ile encrypt edilince içindeki ' veya diğer parametre işaretleri işlevini yitirecektir...

Kerem Inanc [ # | 17.02.2007 ]

MD5 durumu cozer ama bu sadece login' lerde olan bir sorun degil dolayisiyla her zaman MD5 kullanamazsaniz. Cogu dataya iki yonlu de ihtiyac olacaktir. Aslinda o durumda da allem-kullem edilip MD5 kullanilabilir :) ama gerek yok.

Cozum zaten belli bu tip ekstra aksiyonlara gerek yok, belirtildigi gibi karakterlerden kacilirsa bir seycikler olmayacaktir.

Ferruh Mavituna [ # | 18.02.2007 ]

Aciklamaniz icin tesekkur ederim Ferruh Bey,
ben simdilik daha saglam bir cozum bulana kadar MD5 ile devam edeyim :)
ayrica flood yapmisim sanirim kusura bakmayin,iyi calismalar :(

Kerem Inanc [ # | 20.02.2007 ]

Bir sitede database in ilk kaydina kullnici adi ve sifre ile giris yapabilmek için sitede açik varsa kullanici adi='or'
sifre='or' diyor. ben bunu sql query analyzer da deniyorum. Fakat hata veriyor ki zaten bu siteden ögrendiklerimi göre de öyle olmasi lazim. Ama o sitede açik kullanilabiliyor. Bunu bana açiklayabilir misiniz?

timudi [ # | 25.02.2007 ]

Bir sitede database in ilk kaydina kullnici adi ve sifre ile giris yapabilmek için sitede açik varsa kullanici adi='or'
sifre='or' diyor. ben bunu sql query analyzer da deniyorum. Fakat hata veriyor ki zaten bu siteden ögrendiklerimi göre de öyle olmasi lazim. Ama o sitede açik kullanilabiliyor


Belli ki query analyzer da bir hata yapiyorsunuz oradaki girdiginiz SQL i ve hatayi yazarsaniz fikir verebiliriz.

Ferruh Mavituna [ # | 01.03.2007 ]

Alanlari string kabul edersek select * from personel where userName=' 'or' ' and pass=' 'or' '.
Numerik olursa kayit dönüyor ama mantiksiz oluyor. Kaçirdigim bi nokta var galiba. Yardimci olursaniz sevinirim. Kolay gelsin.

timudi [ # | 03.03.2007 ]

Alanlari string kabul edersek select * from personel where userName=' 'or' ' and pass=' 'or' '.
Numerik olursa kayit dönüyor ama mantiksiz oluyor. Kaçirdigim bi nokta var galiba. Yardimci olursaniz sevinirim. Kolay gelsin.


Injection su sekilde 'OR ''=' dolayisiyla sonuc su sekilde oluyor,


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

Ferruh Mavituna [ # | 03.03.2007 ]

peki ya chr karsiliklari ile bu enjeksiyon yine saglanamaz mi ?

umutturen [ # | 09.04.2007 ]

merabalar ,abi gene gusel bir konu fakat ben asp scriptlerini iis kurarak localde inceLIORUM
bu dediniz proglarida indirdim masil bi test alani olsturcaz bi fikrim yok yanliz yane kullanmasini bilmiorum ..bi yardim ederseniz sevinicem
gorusmekuzre kolay gelsin..

UGUR238 [ # | 22.05.2007 ]

ilginç bir deneme sonucu iki farkli kayit dönüyor SQL cümlesini kestirmeye çalisiyorum (veya meta ayiklamayi):
' or 'a'='a ile '-- farkli kayitlari getiriyor. VT MySQL php ile kullaniliyor. Get ile veri aliyor. Iki injection iki farkli kaydi getirdi. Ve büyük olasilikla ilk kayit degiller.
Selamlar

caglaror [ # | 11.11.2007 ]

PHP için injectiondan korunmanin en basit yöntemi söyledir:

$_POST veya $_GET ile gelen bütün degerleri ENT_QUOTES parametresi kullanilan htmlspecialchars fonksiyonundan geçirin

örnek:
$_POST['sifre'] yerine

htmlspecialchars($_POST['sifre'], ENT_QUOTES);

Confusioner [ # | 28 gün, 58 dk ]

ya arkadaslar ben bunlari cok merak ediom ama bisey anlamadim bu werdiginiz kodlar nereye eklenioo nasil nerde bi yazarsaniz sewinirm

helpppppp [ # | 17 gün, 6 dk ]

Yorum Ekle





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

SQL Injection neden dolayı oluşur ve Nasıl Korunulur? 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 neden dolayı oluşur ve Nasıl Korunulur?

Ferruh Mavituna
© 2002-2007, Ferruh Mavituna

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