2004 yılında Windows .NET Magazine'de yayınlanan bir makalem
1 of 3
Downloaded 23 times
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.