ݺߣ

ݺߣShare a Scribd company logo
Çözümler
MAYIS 2004 Windows & .NET Magazine www.winnetmag.com.tr30
Çözümler
u ay, Web sitelerini ciddi ölçüde tehdit eden SQL
Injection sald›r›lar›n› inceleyece¤iz. Bunun yan› s›-
ra, .NET programc›lar›n›n SQL Injection sald›r›la-
r›na karfl› ne gibi önlemler alabilece¤ini de hep
birlikte görece¤iz.
SQL Injection Nedir?
Aram›zda Internet üzerinden düzenli bir flekilde al›flverifl ya-
pan kimse var m›? Pekala… fiimdi Web üzerinden maillerini
kontrol edenleri görelim? Güzel… Ya bankac›l›k ifllemlerini In-
ternet üzerinden halledenler?
Günümüzde Internet üzerinden yap›lan ifllemlerin büyük
bir k›sm›nda, ziyaret etti¤imiz siteye kendimizi tan›tmak için
bir kullan›c› ad› ve flifre girmemiz gerekir. “Kullan›c› Ad›” ve
“fiifre” kutucuklar›na girmifl oldu¤umuz de¤erler Web sunu-
cusunda çal›flan bir program taraf›ndan kontrol edilir ve do¤-
rulama ifllemi sonucunda yetkimiz olan ifllemleri yapabilir
hale geliriz.
Peki ama, sahnenin arkas›nda neler olup bitiyor? Sunucu,
biz bilgilerimizi girdikten sonra bu bilgileri içeren bir SQL
cümleci¤i oluflturacak ve hesap bilgilerimizin kullan›c› veri-
taban›nda bulunup bulunmad›¤›n› kontrol edecektir.
SQL Injection sald›r›lar›n›n yaratt›¤›
tehlike, iflte tam bu noktada ortaya ç›kar.
Sitenin programc›s› dikkatsiz davrand›y-
sa; “Kullan›c› ad›” ve “fiifre” kutucuklar›-
na özel SQL kodlar› giren kötü niyetli bir
flah›s, veritaban› üzerinde yap›lan do¤ru-
lama ifllemini manipule ederek siteye is-
tedi¤i hesapla ba¤lanabilir. Söz konusu
hesap üzerinde istedi¤i her türlü oynama-
y› yapabilir. Bunun yan› s›ra, ayn› verita-
ban›n›n farkl› tablolar›nda yer alan
bilgileri de okuyabilir ve de¤ifltirebilir.
K›saca; SQL Injection, Web siteleri üzerindeki formlara özel
bir tak›m SQL kodlar› girerek normal flartlarda yap›lmamas›
gereken ifllemlerin yap›lmas›na verilen add›r.
SQL Injection nas›l yap›l›yor?
Bu genel aç›klaman›n ard›ndan, konuyu basit bir örnekle pe-
kifltirmekte fayda var.
Örnek senaryomuzda, C# ile haz›rlanm›fl bir Web sayfas›-
n› inceleyece¤iz. Bu sayfa, üyelerimizin siteye girifl yapmas›-
n› sa¤layan standart bir Login ekran› içerecek.
Gelelim kullan›c›lar›n girifl yapabilmesini sa¤layan koda…
Gereksiz ayr›nt›lara sap›p konuyu kar›flt›rmamak ad›na, ko-
du mümkün oldu¤u kadar basit tuttum (Liste 1).
Kodun yapt›¤› ifl oldukça aç›k… Birinci ad›mda, cgi-bin kla-
sörü alt›nda yer alan “sin.mbd” adl› veritaban›na ba¤lan›yo-
ruz. ‹kinci ad›mda, kullan›c›n›n formdan girdi¤i kullan›c› ad›
& flifreyi kullanarak bir SQL cümlesi oluflturuyoruz. Üçüncü
ad›mda ise; oluflturdu¤umuz SQL cümlesini veritaban›nda ça-
l›flt›rarak, girilen kullan›c› ad› & flifrenin do¤ru olup olmad›-
¤›n› kontrol ediyoruz.
Kullan›c› bilgilerini tutan veritaban› tablosu ise, flu flekilde
tasarlanm›flt›r:
Buraya kadar anlafl›lmayan birfley olmad›¤›n› tahmin edi-
yorum… fiimdi; siteye whitesaint kullan›c› ad› ve 12345 flifre-
siyle girifl yapmaya çal›flt›¤›m›z› varsayal›m. Veritaban›
Kerem Köseo¤lu keremk@winnetmag.com.tr
SQL Injection:
Web siteniz tehdit altında mı?
SQL Injection ad› verilen sald›r› yönteminden haberdar
m›s›n›z? Cevab›n›z olumsuz ise, Web siteleriniz ciddi
anlamda tehlikede olabilir.
B
KEREM
KÖSEO⁄LU
Windows & .NET
Magazine'in katk›da
bulunan
yazarlar›ndand›r.
Çözümevi firmas›nda
analist programc›
ve SAP dan›flman›
olarak çal›flmaktad›r.
Kendisine keremk@
winnetmag.com.tr
adresinden
ulaflabilirsiniz.
fiekil 1: Web sitelerindeki Login sürecinin standart iflleyifli…
fiekil 2: Kötü niyetli bir kullan›c›n›n SQL Injection ile yanl›fl çal›flmas›n›
sa¤lad›¤› ö¤eler…
fiekil 3: Kullan›c›lar›n girifl yaparken kullanaca¤› Login ekran›…
Cözümler | SQL Injection
www.winnetmag.com.tr Windows & .NET Magazine MAYIS 2004 30
ba¤lant›s› aç›ld›ktan sonra; sqlString de-
¤iflkenine flu de¤er atanacakt›r:
SELECT * FROM users WHERE username
= 'whitesaint' AND password = '12345'
Bu komut veritaban›nda çal›flt›r›ld›-
¤›nda, users tablosundaki ilk kay›t geri
dönecek ve whitesaint kullan›c›s› siteye
girifl yapm›fl olacakt›r.
Peki, ya siteye girerken yanl›fl bir flif-
re yazacak olursak? E¤er kullan›c› ad›
kutusuna azade ve flifre kutusuna porta-
kal yazacak olursak, sqlString de¤iflkeni-
ne flu de¤er atanacakt›r:
SELECT * FROM users WHERE username
= 'azade' and password = 'portakal'
users tablosunda “azade-portakal”
fleklinde bir kay›t olmad›¤› için, tablodan
geriye hiçbir de¤er dönmeyecek ve kul-
lan›c› siteye girifl yapamayacakt›r.
Bu noktaya kadar, kadar her prog-
ramc›n›n tahmin etti¤i ve bekledi¤i se-
naryolar› incelemifl olduk… fiimdi s›ra,
sab›rs›zl›kla bekledi¤iniz konuya geldi:
Kötü niyetli bir kullan›c›, SQL Injection
tekni¤i ile siteye nas›l s›zabilir? Gayet ko-
lay! Sayfam›za giren kiflinin, kutucukla-
ra flu bilgileri girdi¤ini düflünelim:
Kullan›c› Ad› : neo
fiifre : neo' OR 'a' = 'a
Bu flekilde girifl yap›ld›¤›nda, sqlString
de¤iflkenine flu de¤er atanacakt›r:
SELECT * FROM users WHERE username
= 'neo' AND password = 'neo' OR 'a' =
'a'
‹ster inan›n ister inanmay›n; bu sor-
gu, users tablosunda yer alan bütün ka-
y›tlar› geri döndürecektir. Neden mi?
Sorgunun en sonundaki “OR 'a' = 'a'” ifa-
desine dikkat edin. “a” karakteri kendi
kendisine her zaman eflit olaca¤› için;
tablodaki sat›rlar›n her biri, kontrolden
rahatça geçecektir. Kötü niyetli kullan›-
c› ise, tabloda kay›tl› ilk kullan›c› olan
“whitesaint” hesab›yla siteye ba¤lanma
flans›n› elde etmifl olacakt›r.
Ürkütücü, öyle de¤il mi?
SQL Injection neden tehlikelidir?
SQL Injection sald›r›lar›n›n ard›ndaki te-
mel fikri herkesin kavrad›¤›n› tahmin
ediyorum. Bu yaz›n›n amac› sanal hay-
dut yetifltirmek olmad›¤› için, daha fazla
canl› sald›r› örne¤i vermeyece¤im. Buna
karfl›l›k, bu tekni¤i kullanan birinin site-
nizde neler yapabilece¤ini bilmenizde
fayda var:
• Korunan bölgelere kaçak girifl yap-
mak. Bu tehlikeyi örne¤imizde yak›n-
dan incelemifl bulunuyoruz.
• Veritaban›ndaki kritik bilgilere erifl-
mek. SQL diline hakim biri, UNION
komutundan faydalanarak veritaba-
n›ndaki di¤er tablolardan da veri çe-
kebilir. Bu tablolar›n bir tanesinin
kredi kart› numaralar›n› sakl›yor ol-
du¤unu düflünürsek, tehlikenin bo-
yutlar› konusunda daha iyi bir
fikrimiz olabilir. Müflteri listemizi ele
geçirmek için can atan rakiplerimiz
ise, adres & telefon bilgilerinin tutul-
du¤u tablolar›n pefline düflecektir.
• Verileri bozmak. SQL diline hakim bi-
ri, INSERT komutundan faydalanarak
ve biraz deneme / yan›lma yaparak,
di¤er tablolara veri de ekleyebilir. Bu
flekilde; örne¤in sitenin haberler bölü-
münde yalan yanl›fl metinlerin görün-
tülenmesini sa¤layabilir.
• Sitenin ifllemesini engellemek. SQL
Injection sald›r›s›nda DELETE komu-
tunu seçen biri, tablolarda yer alan
içeri¤i tamamen silebilir. E¤er düzen-
li yedekleme yapm›yorsan›z, sitenize
veda edebilirsiniz.
Sitemi SQL Injection’a karfl› nas›l
koruyabilirim?
fiimdiye kadar SQL Injection sald›r›lar›-
n›n tehlikeli yüzünü gördük. Peki bu ko-
nuda çaresiz miyiz? Tabii ki hay›r…
Merak etmeyin; ne yapt›¤›n› bilen dik-
katli bir programc›, sitesini SQL Injecti-
on sald›r›lar›na karfl› kolayca
koruyabilir. Bu konudaki temel tavsiye-
lerimi sizlerle paylaflaca¤›m.
Birinci ve en önemli kural, Web üze-
rinden gönderilen verileri tehlikeli ka-
rakterlerden ar›nd›rmakt›r. Örne¤in '
karakteri, SQL sorgular›nda metin de¤er-
lerini tan›mlamak için kullan›lan anah-
tar karakterdir. ‹ncelemifl oldu¤umuz
canl› örnekte, bu küçük sevimli karakte-
rin tafl›d›¤› tehlike potansiyelinin ne ka-
dar büyük oldu¤unu gördük. Tehlikeli
olabilecek baflka karakterler de söz ko-
nusu oldu¤undan [ % - ( ) gibi ]; size tav-
siyem, kritik sorgularda sadece
alfanumerik karakterlerin kullan›m›na
izin vermeniz. E¤er tehlikeli karakterle-
re izin vermek zorundaysan›z, kodunu-
za sorgular›n›z›n manipule edilmesini
önleyecek güvenlik kontrolleri ekleyin.
Bir di¤er önemli nokta, kullan›c›lar›n
girifl yapt›¤› kutular›n uzunlu¤uyla ilgi-
li. E¤er kutular›n karakter uzunlu¤unu
s›n›rlamazsan›z, SQL bilen kötü niyetli
bir kifliye diledi¤i herfleyi yapabilece¤i
genifl bir alan b›rakm›fl olursunuz; zira
fiekil 4: SQL Injection tekni¤ini bilen bir
kiflinin sitenize izinsiz girmesi için Neo
olmas›na gerek yok…
private void login_Click(object sender,
System.EventArgs e)
{
string
sqlString;
string
connString;
OleDbConnection conn;
OleDbDataAdapter adap;
DataTable data;
// Ba¤lant›m›z› açal›m
connString = "Provider=Micro-
soft.Jet.OLEDB.4.0;Data Source=";
connString += Server.MapPath("cgi-
bin/sin.mdb");
conn = new OleDbConnection(connSt-
ring);
conn.Open();
// Komut sat›r›n› olufltural›m
sqlString = "SELECT * FROM users
WHERE username = '";
sqlString += uname.Text;
sqlString += "' AND password = '";
sqlString += pword.Text;
sqlString += "'";
adap = new OleDbDataAdap-
ter(sqlString, conn);
// Veriyi çekelim
data = new DataTable();
adap.Fill(data);
// E¤er veri döndüyse, girifl do¤-
rudur
if (data.Rows.Count > 0)
{
bilgi.Text = "Hoflgeldin
";
bilgi.Text += da-
ta.Rows[0]["username"].ToString();
}
else
{
bilgi.Text="Yanl›flgi-
rifl...";
}
}
Liste 1: Kullan›c› girifl kodu.
Cözümler | SQL Injection
MAYIS 2004 Windows & .NET Magazine www.winnetmag.com.tr30
uzun bir SQL komutunun yarataca¤›
tehlike daha büyük olacakt›r. Deminki
örne¤imizde, kullan›c› ad› ve flifre alan-
lar›n› 8 karakterle s›n›rlamak iyi bir fikir
olacakt›r. Tutarl›l›¤› sa¤lamak ad›na, ay-
n› s›n›rland›rmay› yapman›z gereken iki
yer daha vard›r: Veritaban›ndaki users
tablosu, ve kodun kendisi! sqlString de-
¤iflkenindeki komutu oluflturdu¤umuz
kodu flu flekilde yazd›¤›m›z› varsayal›m:
// Komut sat›r›n› olufltural›m
sqlString = "SELECT * FROM
users WHERE username = '";
sqlString+=uname.Text.Subst-
ring(0, 8);
sqlString += "' AND password
= '";
sqlString+=pword.Text.Subst-
ring(0, 8);
sqlString += "'";
Art›k kötü niyetli kullan›c›lar kutula-
ra ne yazarsa yazs›n, sunucu taraf›nda
gönderilen verinin sadece ilk 8 karakte-
rini dikkate al›yor olaca¤›z. Bu flekilde
güvenli¤imiz bir derece daha artm›fl ola-
cakt›r. Bunun yan› s›ra, Referrer Spoof ile
Form Post etmek isteyebilecek kiflilerin
uzun SQL cümleleri göndermesini de
engellemifl oluruz.
.NET programc›lar›n› ilgilendiren bir
di¤er önemli nokta, hatalar›n yakalan-
mas›d›r. Yukar›da inceledi¤imiz örnekte;
siteye flu bilgilerle girildi¤ini varsayal›m:
Kullan›c› Ad› : neo
fiifre : '
Tek bafl›na kullan›lan ' karakteri sor-
gumuzu bozaca¤› ve yanl›fl çal›flmas›na
yol açaca¤› için, Web sitemiz ayr›nt›l› bir
hata mesaj› verecektir. Bu hata mesaj›,
kötü niyetli ziyaretçimizin siteyi daha
fazla zorlamas›n› sa¤layacak son derece
kritik bilgiler içeriyor olabilir.
Oysa veriyi çekece¤imiz noktaya bir
try…catch blo¤u ekleyerek hatalar› yaka-
lam›fl olsayd›k, karfl›laflaca¤›m›z görün-
tü çok farkl› olacakt›.
// Veriyi çekelim
data = new DataTable();
try
{
adap.Fill(data);
}
catch
{
}
Bu flekilde, hata mesajlar›na ait ayr›n-
t›lar›n kullan›c›lar taraf›ndan görüntü-
lenmesinin önüne geçebiliriz.
Include dosyalar›, dikkat edilmesi ge-
reken bir di¤er noktad›r. Eski al›flkanl›k-
lar› devam ettirerek dosyalar›m›za
“include.inc” gibi isimler verirsek, dos-
yan›n ad›n› ö¤renen herhangi biri içeri-
¤ini kolayca görüntüleyebilir. Bu tip
Include dosyalar›nda; veritaban› flifrele-
ri, tablo isimleri, SQL Server hesaplar› gi-
bi kritik bilgiler yer al›yor olabilir. Bu
yüzden yapmam›z gereken fley, söz ko-
nusu dosyalara sunucu taraf›nda derle-
nen dosya uzant›lar› atamam›zd›r.
Örne¤imizde ayn› dosyaya “include.asp”
ad›n› verecek olursak, birileri dosyan›n
ad›n› ö¤rense bile içeri¤ini Web üzerin-
den görüntülemesi o kadar kolay olma-
yacakt›r. “.asp” uzant›l› dosyalar
istemciye derlenerek gönderildi¤i için,
kötü niyetli ziyaretçimizin görebilece¤i
tek fley, üretilmifl bir tak›m HTML kod-
lar› olacakt›r.
fiimdiye kadar hep iflin kodlama k›s-
m›ndan bahsettik. Ne var ki, veritaban›
taraf›nda almam›z gereken önlemler de
var. Bu önlemlerin en önemlisi, kullan›-
c›lar ve yetkilendirme konusudur. Siteni-
zin arkas›nda SQL Server veya Oracle
gibi bir RDBMS çal›fl›yorsa, Web üzerin-
den yürütülecek sorgularda kullanaca¤›z
veritaban› hesab›n›n yetkilerini müm-
kün oldu¤u kadar s›n›rland›rmal›s›n›z.
Bunun yan› s›ra, veritaban› yüklendi¤in-
de haz›r gelen hesaplara ait flifreler mut-
laka de¤ifltirilmifl olmal›d›r. SQL Ser-
ver’›n “sa” hesab›, Oracle’›n “sys”, “sys-
tem” ve “scott” hesaplar›, bu konunun
belirgin örnekleridir.
Veritaban›ndaki kritik bilgileri flifrele-
yerek saklamak, al›nmas› gereken bir di-
¤er güvenlik önlemidir. Örne¤in; kredi
kart› numaralar›n› “5888 4300 4565
4565” gibi ç›plak bir flekilde saklamak,
tabloya s›zan bir kiflinin bütün numara-
lar› ele geçirmesine ve bu numaralar›
kullanarak gönlünce al›flverifl yapmas›-
na izin vermek anlam›na gelir. Buna
karfl›l›k, numaralar› sa¤lam bir algorit-
ma ile flifreleyerek “HK2omuDFf52ScK-
dE223R” fleklinde saklayacak olursak,
numaralar SQL Injection yöntemi ile ele
geçirilse bile kimseye bir fley ifade etme-
yecektir.
Sonuç
Bu yaz›da, SQL Injection sald›r›lar›n› ve
.NET programc›lar›n›n alabilece¤i temel
güvenlik önlemlerini incelemifl olduk.
SQL Injection sald›r›lar›n›n bütün var-
yasyonlar›n› ve al›nabilecek güvenlik
önlemlerinin tamam›n› tek bir makale-
ye s›¤d›rmak ne yaz›k ki mümkün de¤il.
Buna karfl›l›k, iflin temel mant›¤›n› ve püf
noktalar›n› herkesin anlad›¤›n› tahmin
ediyorum. .NET d›fl›ndaki platformlarda
uygulama gelifltirenler, yaz›da dile getir-
di¤im fikirleri kendi platformlar›na
adapte ederek kolayca hayata geçirebilir-
ler.
fiekil 5: Sitelerin standart hata mesajlar›,
kötü niyetli ziyaretçiler için hazine de¤erinde
olabilir…
fiekil 6: Hatalar›m›z› kullan›c›larla paylaflmak
zorunda de¤iliz…
Eğer önemli bilgileri şifrelenmiş
olarak saklarsanız SQL Injection
yöntemiyle çalınması muhtemel
veriler çalanın işine yaramaz.

More Related Content

SQL Injection - Web siteniz tehdit altında mı?

  • 1. Çözümler MAYIS 2004 Windows & .NET Magazine www.winnetmag.com.tr30 Çözümler u ay, Web sitelerini ciddi ölçüde tehdit eden SQL Injection sald›r›lar›n› inceleyece¤iz. Bunun yan› s›- ra, .NET programc›lar›n›n SQL Injection sald›r›la- r›na karfl› ne gibi önlemler alabilece¤ini de hep birlikte görece¤iz. SQL Injection Nedir? Aram›zda Internet üzerinden düzenli bir flekilde al›flverifl ya- pan kimse var m›? Pekala… fiimdi Web üzerinden maillerini kontrol edenleri görelim? Güzel… Ya bankac›l›k ifllemlerini In- ternet üzerinden halledenler? Günümüzde Internet üzerinden yap›lan ifllemlerin büyük bir k›sm›nda, ziyaret etti¤imiz siteye kendimizi tan›tmak için bir kullan›c› ad› ve flifre girmemiz gerekir. “Kullan›c› Ad›” ve “fiifre” kutucuklar›na girmifl oldu¤umuz de¤erler Web sunu- cusunda çal›flan bir program taraf›ndan kontrol edilir ve do¤- rulama ifllemi sonucunda yetkimiz olan ifllemleri yapabilir hale geliriz. Peki ama, sahnenin arkas›nda neler olup bitiyor? Sunucu, biz bilgilerimizi girdikten sonra bu bilgileri içeren bir SQL cümleci¤i oluflturacak ve hesap bilgilerimizin kullan›c› veri- taban›nda bulunup bulunmad›¤›n› kontrol edecektir. SQL Injection sald›r›lar›n›n yaratt›¤› tehlike, iflte tam bu noktada ortaya ç›kar. Sitenin programc›s› dikkatsiz davrand›y- sa; “Kullan›c› ad›” ve “fiifre” kutucuklar›- na özel SQL kodlar› giren kötü niyetli bir flah›s, veritaban› üzerinde yap›lan do¤ru- lama ifllemini manipule ederek siteye is- tedi¤i hesapla ba¤lanabilir. Söz konusu hesap üzerinde istedi¤i her türlü oynama- y› yapabilir. Bunun yan› s›ra, ayn› verita- ban›n›n farkl› tablolar›nda yer alan bilgileri de okuyabilir ve de¤ifltirebilir. K›saca; SQL Injection, Web siteleri üzerindeki formlara özel bir tak›m SQL kodlar› girerek normal flartlarda yap›lmamas› gereken ifllemlerin yap›lmas›na verilen add›r. SQL Injection nas›l yap›l›yor? Bu genel aç›klaman›n ard›ndan, konuyu basit bir örnekle pe- kifltirmekte fayda var. Örnek senaryomuzda, C# ile haz›rlanm›fl bir Web sayfas›- n› inceleyece¤iz. Bu sayfa, üyelerimizin siteye girifl yapmas›- n› sa¤layan standart bir Login ekran› içerecek. Gelelim kullan›c›lar›n girifl yapabilmesini sa¤layan koda… Gereksiz ayr›nt›lara sap›p konuyu kar›flt›rmamak ad›na, ko- du mümkün oldu¤u kadar basit tuttum (Liste 1). Kodun yapt›¤› ifl oldukça aç›k… Birinci ad›mda, cgi-bin kla- sörü alt›nda yer alan “sin.mbd” adl› veritaban›na ba¤lan›yo- ruz. ‹kinci ad›mda, kullan›c›n›n formdan girdi¤i kullan›c› ad› & flifreyi kullanarak bir SQL cümlesi oluflturuyoruz. Üçüncü ad›mda ise; oluflturdu¤umuz SQL cümlesini veritaban›nda ça- l›flt›rarak, girilen kullan›c› ad› & flifrenin do¤ru olup olmad›- ¤›n› kontrol ediyoruz. Kullan›c› bilgilerini tutan veritaban› tablosu ise, flu flekilde tasarlanm›flt›r: Buraya kadar anlafl›lmayan birfley olmad›¤›n› tahmin edi- yorum… fiimdi; siteye whitesaint kullan›c› ad› ve 12345 flifre- siyle girifl yapmaya çal›flt›¤›m›z› varsayal›m. Veritaban› Kerem Köseo¤lu keremk@winnetmag.com.tr SQL Injection: Web siteniz tehdit altında mı? SQL Injection ad› verilen sald›r› yönteminden haberdar m›s›n›z? Cevab›n›z olumsuz ise, Web siteleriniz ciddi anlamda tehlikede olabilir. B KEREM KÖSEO⁄LU Windows & .NET Magazine'in katk›da bulunan yazarlar›ndand›r. Çözümevi firmas›nda analist programc› ve SAP dan›flman› olarak çal›flmaktad›r. Kendisine keremk@ winnetmag.com.tr adresinden ulaflabilirsiniz. fiekil 1: Web sitelerindeki Login sürecinin standart iflleyifli… fiekil 2: Kötü niyetli bir kullan›c›n›n SQL Injection ile yanl›fl çal›flmas›n› sa¤lad›¤› ö¤eler… fiekil 3: Kullan›c›lar›n girifl yaparken kullanaca¤› Login ekran›…
  • 2. Cözümler | SQL Injection www.winnetmag.com.tr Windows & .NET Magazine MAYIS 2004 30 ba¤lant›s› aç›ld›ktan sonra; sqlString de- ¤iflkenine flu de¤er atanacakt›r: SELECT * FROM users WHERE username = 'whitesaint' AND password = '12345' Bu komut veritaban›nda çal›flt›r›ld›- ¤›nda, users tablosundaki ilk kay›t geri dönecek ve whitesaint kullan›c›s› siteye girifl yapm›fl olacakt›r. Peki, ya siteye girerken yanl›fl bir flif- re yazacak olursak? E¤er kullan›c› ad› kutusuna azade ve flifre kutusuna porta- kal yazacak olursak, sqlString de¤iflkeni- ne flu de¤er atanacakt›r: SELECT * FROM users WHERE username = 'azade' and password = 'portakal' users tablosunda “azade-portakal” fleklinde bir kay›t olmad›¤› için, tablodan geriye hiçbir de¤er dönmeyecek ve kul- lan›c› siteye girifl yapamayacakt›r. Bu noktaya kadar, kadar her prog- ramc›n›n tahmin etti¤i ve bekledi¤i se- naryolar› incelemifl olduk… fiimdi s›ra, sab›rs›zl›kla bekledi¤iniz konuya geldi: Kötü niyetli bir kullan›c›, SQL Injection tekni¤i ile siteye nas›l s›zabilir? Gayet ko- lay! Sayfam›za giren kiflinin, kutucukla- ra flu bilgileri girdi¤ini düflünelim: Kullan›c› Ad› : neo fiifre : neo' OR 'a' = 'a Bu flekilde girifl yap›ld›¤›nda, sqlString de¤iflkenine flu de¤er atanacakt›r: SELECT * FROM users WHERE username = 'neo' AND password = 'neo' OR 'a' = 'a' ‹ster inan›n ister inanmay›n; bu sor- gu, users tablosunda yer alan bütün ka- y›tlar› geri döndürecektir. Neden mi? Sorgunun en sonundaki “OR 'a' = 'a'” ifa- desine dikkat edin. “a” karakteri kendi kendisine her zaman eflit olaca¤› için; tablodaki sat›rlar›n her biri, kontrolden rahatça geçecektir. Kötü niyetli kullan›- c› ise, tabloda kay›tl› ilk kullan›c› olan “whitesaint” hesab›yla siteye ba¤lanma flans›n› elde etmifl olacakt›r. Ürkütücü, öyle de¤il mi? SQL Injection neden tehlikelidir? SQL Injection sald›r›lar›n›n ard›ndaki te- mel fikri herkesin kavrad›¤›n› tahmin ediyorum. Bu yaz›n›n amac› sanal hay- dut yetifltirmek olmad›¤› için, daha fazla canl› sald›r› örne¤i vermeyece¤im. Buna karfl›l›k, bu tekni¤i kullanan birinin site- nizde neler yapabilece¤ini bilmenizde fayda var: • Korunan bölgelere kaçak girifl yap- mak. Bu tehlikeyi örne¤imizde yak›n- dan incelemifl bulunuyoruz. • Veritaban›ndaki kritik bilgilere erifl- mek. SQL diline hakim biri, UNION komutundan faydalanarak veritaba- n›ndaki di¤er tablolardan da veri çe- kebilir. Bu tablolar›n bir tanesinin kredi kart› numaralar›n› sakl›yor ol- du¤unu düflünürsek, tehlikenin bo- yutlar› konusunda daha iyi bir fikrimiz olabilir. Müflteri listemizi ele geçirmek için can atan rakiplerimiz ise, adres & telefon bilgilerinin tutul- du¤u tablolar›n pefline düflecektir. • Verileri bozmak. SQL diline hakim bi- ri, INSERT komutundan faydalanarak ve biraz deneme / yan›lma yaparak, di¤er tablolara veri de ekleyebilir. Bu flekilde; örne¤in sitenin haberler bölü- münde yalan yanl›fl metinlerin görün- tülenmesini sa¤layabilir. • Sitenin ifllemesini engellemek. SQL Injection sald›r›s›nda DELETE komu- tunu seçen biri, tablolarda yer alan içeri¤i tamamen silebilir. E¤er düzen- li yedekleme yapm›yorsan›z, sitenize veda edebilirsiniz. Sitemi SQL Injection’a karfl› nas›l koruyabilirim? fiimdiye kadar SQL Injection sald›r›lar›- n›n tehlikeli yüzünü gördük. Peki bu ko- nuda çaresiz miyiz? Tabii ki hay›r… Merak etmeyin; ne yapt›¤›n› bilen dik- katli bir programc›, sitesini SQL Injecti- on sald›r›lar›na karfl› kolayca koruyabilir. Bu konudaki temel tavsiye- lerimi sizlerle paylaflaca¤›m. Birinci ve en önemli kural, Web üze- rinden gönderilen verileri tehlikeli ka- rakterlerden ar›nd›rmakt›r. Örne¤in ' karakteri, SQL sorgular›nda metin de¤er- lerini tan›mlamak için kullan›lan anah- tar karakterdir. ‹ncelemifl oldu¤umuz canl› örnekte, bu küçük sevimli karakte- rin tafl›d›¤› tehlike potansiyelinin ne ka- dar büyük oldu¤unu gördük. Tehlikeli olabilecek baflka karakterler de söz ko- nusu oldu¤undan [ % - ( ) gibi ]; size tav- siyem, kritik sorgularda sadece alfanumerik karakterlerin kullan›m›na izin vermeniz. E¤er tehlikeli karakterle- re izin vermek zorundaysan›z, kodunu- za sorgular›n›z›n manipule edilmesini önleyecek güvenlik kontrolleri ekleyin. Bir di¤er önemli nokta, kullan›c›lar›n girifl yapt›¤› kutular›n uzunlu¤uyla ilgi- li. E¤er kutular›n karakter uzunlu¤unu s›n›rlamazsan›z, SQL bilen kötü niyetli bir kifliye diledi¤i herfleyi yapabilece¤i genifl bir alan b›rakm›fl olursunuz; zira fiekil 4: SQL Injection tekni¤ini bilen bir kiflinin sitenize izinsiz girmesi için Neo olmas›na gerek yok… private void login_Click(object sender, System.EventArgs e) { string sqlString; string connString; OleDbConnection conn; OleDbDataAdapter adap; DataTable data; // Ba¤lant›m›z› açal›m connString = "Provider=Micro- soft.Jet.OLEDB.4.0;Data Source="; connString += Server.MapPath("cgi- bin/sin.mdb"); conn = new OleDbConnection(connSt- ring); conn.Open(); // Komut sat›r›n› olufltural›m sqlString = "SELECT * FROM users WHERE username = '"; sqlString += uname.Text; sqlString += "' AND password = '"; sqlString += pword.Text; sqlString += "'"; adap = new OleDbDataAdap- ter(sqlString, conn); // Veriyi çekelim data = new DataTable(); adap.Fill(data); // E¤er veri döndüyse, girifl do¤- rudur if (data.Rows.Count > 0) { bilgi.Text = "Hoflgeldin "; bilgi.Text += da- ta.Rows[0]["username"].ToString(); } else { bilgi.Text="Yanl›flgi- rifl..."; } } Liste 1: Kullan›c› girifl kodu.
  • 3. Cözümler | SQL Injection MAYIS 2004 Windows & .NET Magazine www.winnetmag.com.tr30 uzun bir SQL komutunun yarataca¤› tehlike daha büyük olacakt›r. Deminki örne¤imizde, kullan›c› ad› ve flifre alan- lar›n› 8 karakterle s›n›rlamak iyi bir fikir olacakt›r. Tutarl›l›¤› sa¤lamak ad›na, ay- n› s›n›rland›rmay› yapman›z gereken iki yer daha vard›r: Veritaban›ndaki users tablosu, ve kodun kendisi! sqlString de- ¤iflkenindeki komutu oluflturdu¤umuz kodu flu flekilde yazd›¤›m›z› varsayal›m: // Komut sat›r›n› olufltural›m sqlString = "SELECT * FROM users WHERE username = '"; sqlString+=uname.Text.Subst- ring(0, 8); sqlString += "' AND password = '"; sqlString+=pword.Text.Subst- ring(0, 8); sqlString += "'"; Art›k kötü niyetli kullan›c›lar kutula- ra ne yazarsa yazs›n, sunucu taraf›nda gönderilen verinin sadece ilk 8 karakte- rini dikkate al›yor olaca¤›z. Bu flekilde güvenli¤imiz bir derece daha artm›fl ola- cakt›r. Bunun yan› s›ra, Referrer Spoof ile Form Post etmek isteyebilecek kiflilerin uzun SQL cümleleri göndermesini de engellemifl oluruz. .NET programc›lar›n› ilgilendiren bir di¤er önemli nokta, hatalar›n yakalan- mas›d›r. Yukar›da inceledi¤imiz örnekte; siteye flu bilgilerle girildi¤ini varsayal›m: Kullan›c› Ad› : neo fiifre : ' Tek bafl›na kullan›lan ' karakteri sor- gumuzu bozaca¤› ve yanl›fl çal›flmas›na yol açaca¤› için, Web sitemiz ayr›nt›l› bir hata mesaj› verecektir. Bu hata mesaj›, kötü niyetli ziyaretçimizin siteyi daha fazla zorlamas›n› sa¤layacak son derece kritik bilgiler içeriyor olabilir. Oysa veriyi çekece¤imiz noktaya bir try…catch blo¤u ekleyerek hatalar› yaka- lam›fl olsayd›k, karfl›laflaca¤›m›z görün- tü çok farkl› olacakt›. // Veriyi çekelim data = new DataTable(); try { adap.Fill(data); } catch { } Bu flekilde, hata mesajlar›na ait ayr›n- t›lar›n kullan›c›lar taraf›ndan görüntü- lenmesinin önüne geçebiliriz. Include dosyalar›, dikkat edilmesi ge- reken bir di¤er noktad›r. Eski al›flkanl›k- lar› devam ettirerek dosyalar›m›za “include.inc” gibi isimler verirsek, dos- yan›n ad›n› ö¤renen herhangi biri içeri- ¤ini kolayca görüntüleyebilir. Bu tip Include dosyalar›nda; veritaban› flifrele- ri, tablo isimleri, SQL Server hesaplar› gi- bi kritik bilgiler yer al›yor olabilir. Bu yüzden yapmam›z gereken fley, söz ko- nusu dosyalara sunucu taraf›nda derle- nen dosya uzant›lar› atamam›zd›r. Örne¤imizde ayn› dosyaya “include.asp” ad›n› verecek olursak, birileri dosyan›n ad›n› ö¤rense bile içeri¤ini Web üzerin- den görüntülemesi o kadar kolay olma- yacakt›r. “.asp” uzant›l› dosyalar istemciye derlenerek gönderildi¤i için, kötü niyetli ziyaretçimizin görebilece¤i tek fley, üretilmifl bir tak›m HTML kod- lar› olacakt›r. fiimdiye kadar hep iflin kodlama k›s- m›ndan bahsettik. Ne var ki, veritaban› taraf›nda almam›z gereken önlemler de var. Bu önlemlerin en önemlisi, kullan›- c›lar ve yetkilendirme konusudur. Siteni- zin arkas›nda SQL Server veya Oracle gibi bir RDBMS çal›fl›yorsa, Web üzerin- den yürütülecek sorgularda kullanaca¤›z veritaban› hesab›n›n yetkilerini müm- kün oldu¤u kadar s›n›rland›rmal›s›n›z. Bunun yan› s›ra, veritaban› yüklendi¤in- de haz›r gelen hesaplara ait flifreler mut- laka de¤ifltirilmifl olmal›d›r. SQL Ser- ver’›n “sa” hesab›, Oracle’›n “sys”, “sys- tem” ve “scott” hesaplar›, bu konunun belirgin örnekleridir. Veritaban›ndaki kritik bilgileri flifrele- yerek saklamak, al›nmas› gereken bir di- ¤er güvenlik önlemidir. Örne¤in; kredi kart› numaralar›n› “5888 4300 4565 4565” gibi ç›plak bir flekilde saklamak, tabloya s›zan bir kiflinin bütün numara- lar› ele geçirmesine ve bu numaralar› kullanarak gönlünce al›flverifl yapmas›- na izin vermek anlam›na gelir. Buna karfl›l›k, numaralar› sa¤lam bir algorit- ma ile flifreleyerek “HK2omuDFf52ScK- dE223R” fleklinde saklayacak olursak, numaralar SQL Injection yöntemi ile ele geçirilse bile kimseye bir fley ifade etme- yecektir. Sonuç Bu yaz›da, SQL Injection sald›r›lar›n› ve .NET programc›lar›n›n alabilece¤i temel güvenlik önlemlerini incelemifl olduk. SQL Injection sald›r›lar›n›n bütün var- yasyonlar›n› ve al›nabilecek güvenlik önlemlerinin tamam›n› tek bir makale- ye s›¤d›rmak ne yaz›k ki mümkün de¤il. Buna karfl›l›k, iflin temel mant›¤›n› ve püf noktalar›n› herkesin anlad›¤›n› tahmin ediyorum. .NET d›fl›ndaki platformlarda uygulama gelifltirenler, yaz›da dile getir- di¤im fikirleri kendi platformlar›na adapte ederek kolayca hayata geçirebilir- ler. fiekil 5: Sitelerin standart hata mesajlar›, kötü niyetli ziyaretçiler için hazine de¤erinde olabilir… fiekil 6: Hatalar›m›z› kullan›c›larla paylaflmak zorunda de¤iliz… Eğer önemli bilgileri şifrelenmiş olarak saklarsanız SQL Injection yöntemiyle çalınması muhtemel veriler çalanın işine yaramaz.