You are on page 1of 3

Çözümler

Kerem Köseo¤lu keremk@winnetmag.com.tr


Çözümler

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
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? fiekil 2: Kötü niyetli bir kullan›c›n›n SQL Injection ile yanl›fl çal›flmas›n›
sa¤lad›¤› ö¤eler…
Aram›zda Internet üzerinden düzenli bir flekilde al›flverifl ya-
pan kimse var m›? Pekala… fiimdi Web üzerinden maillerini K›saca; SQL Injection, Web siteleri üzerindeki formlara özel
kontrol edenleri görelim? Güzel… Ya bankac›l›k ifllemlerini In- bir tak›m SQL kodlar› girerek normal flartlarda yap›lmamas›
ternet üzerinden halledenler? gereken ifllemlerin yap›lmas›na verilen add›r.
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 SQL Injection nas›l yap›l›yor?
bir kullan›c› ad› ve flifre girmemiz gerekir. “Kullan›c› Ad›” ve Bu genel aç›klaman›n ard›ndan, konuyu basit bir örnekle pe-
“fiifre” kutucuklar›na girmifl oldu¤umuz de¤erler Web sunu- kifltirmekte fayda var.
cusunda çal›flan bir program taraf›ndan kontrol edilir ve do¤- Örnek senaryomuzda, C# ile haz›rlanm›fl bir Web sayfas›-
rulama ifllemi sonucunda yetkimiz olan ifllemleri yapabilir n› inceleyece¤iz. Bu sayfa, üyelerimizin siteye girifl yapmas›-
hale geliriz. n› sa¤layan standart bir Login ekran› içerecek.
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.

fiekil 3: Kullan›c›lar›n girifl yaparken kullanaca¤› Login ekran›…

Gelelim kullan›c›lar›n girifl yapabilmesini sa¤layan koda…


fiekil 1: Web sitelerindeki Login sürecinin standart iflleyifli… Gereksiz ayr›nt›lara sap›p konuyu kar›flt›rmamak ad›na, ko-
du mümkün oldu¤u kadar basit tuttum (Liste 1).
SQL Injection sald›r›lar›n›n yaratt›¤› Kodun yapt›¤› ifl oldukça aç›k… Birinci ad›mda, cgi-bin kla-
tehlike, iflte tam bu noktada ortaya ç›kar. KEREM sörü alt›nda yer alan “sin.mbd” adl› veritaban›na ba¤lan›yo-
Sitenin programc›s› dikkatsiz davrand›y- KÖSEO⁄LU ruz. ‹kinci ad›mda, kullan›c›n›n formdan girdi¤i kullan›c› ad›
Windows & .NET
sa; “Kullan›c› ad›” ve “fiifre” kutucuklar›- Magazine'in katk›da & flifreyi kullanarak bir SQL cümlesi oluflturuyoruz. Üçüncü
na özel SQL kodlar› giren kötü niyetli bir bulunan ad›mda ise; oluflturdu¤umuz SQL cümlesini veritaban›nda ça-
flah›s, veritaban› üzerinde yap›lan do¤ru- yazarlar›ndand›r. l›flt›rarak, girilen kullan›c› ad› & flifrenin do¤ru olup olmad›-
lama ifllemini manipule ederek siteye is- Çözümevi firmas›nda ¤›n› kontrol ediyoruz.
tedi¤i hesapla ba¤lanabilir. Söz konusu analist programc› Kullan›c› bilgilerini tutan veritaban› tablosu ise, flu flekilde
ve SAP dan›flman›
hesap üzerinde istedi¤i her türlü oynama- olarak çal›flmaktad›r. tasarlanm›flt›r:
y› yapabilir. Bunun yan› s›ra, ayn› verita- Kendisine keremk@ Buraya kadar anlafl›lmayan birfley olmad›¤›n› tahmin edi-
ban›n›n farkl› tablolar›nda yer alan winnetmag.com.tr yorum… fiimdi; siteye whitesaint kullan›c› ad› ve 12345 flifre-
bilgileri de okuyabilir ve de¤ifltirebilir. adresinden siyle girifl yapmaya çal›flt›¤›m›z› varsayal›m. Veritaban›
ulaflabilirsiniz.

30 MAYIS 2004 Windows & .NET Magazine www.winnetmag.com.tr


Cözümler | SQL Injection

Liste 1: Kullan›c› girifl kodu. geriye hiçbir de¤er dönmeyecek ve kul-


private void login_Click(object sender, lan›c› siteye girifl yapamayacakt›r.
System.EventArgs e) Bu noktaya kadar, kadar her prog-
{
string
ramc›n›n tahmin etti¤i ve bekledi¤i se-
sqlString; naryolar› incelemifl olduk… fiimdi s›ra,
string sab›rs›zl›kla bekledi¤iniz konuya geldi:
connString;
OleDbConnection conn;
Kötü niyetli bir kullan›c›, SQL Injection
OleDbDataAdapter adap; tekni¤i ile siteye nas›l s›zabilir? Gayet ko-
DataTable data; lay! Sayfam›za giren kiflinin, kutucukla-
// Ba¤lant›m›z› açal›m
ra flu bilgileri girdi¤ini düflünelim:
connString = "Provider=Micro- Kullan›c› Ad› : neo fiekil 4: SQL Injection tekni¤ini bilen bir
soft.Jet.OLEDB.4.0;Data Source="; fiifre : neo' OR 'a' = 'a kiflinin sitenize izinsiz girmesi için Neo
connString += Server.MapPath("cgi- olmas›na gerek yok…
bin/sin.mdb");
conn = new OleDbConnection(connSt- Bu flekilde girifl yap›ld›¤›nda, sqlString ve biraz deneme / yan›lma yaparak,
ring); de¤iflkenine flu de¤er atanacakt›r: di¤er tablolara veri de ekleyebilir. Bu
conn.Open();
SELECT * FROM users WHERE username flekilde; örne¤in sitenin haberler bölü-
// Komut sat›r›n› olufltural›m = 'neo' AND password = 'neo' OR 'a' = münde yalan yanl›fl metinlerin görün-
sqlString = "SELECT * FROM users 'a' tülenmesini sa¤layabilir.
WHERE username = '";
sqlString += uname.Text;
• Sitenin ifllemesini engellemek. SQL
sqlString += "' AND password = '"; ‹ster inan›n ister inanmay›n; bu sor- Injection sald›r›s›nda DELETE komu-
sqlString += pword.Text; gu, users tablosunda yer alan bütün ka- tunu seçen biri, tablolarda yer alan
sqlString += "'";
adap = new OleDbDataAdap-
y›tlar› geri döndürecektir. Neden mi? içeri¤i tamamen silebilir. E¤er düzen-
ter(sqlString, conn); Sorgunun en sonundaki “OR 'a' = 'a'” ifa- li yedekleme yapm›yorsan›z, sitenize
desine dikkat edin. “a” karakteri kendi veda edebilirsiniz.
// Veriyi çekelim
data = new DataTable();
kendisine her zaman eflit olaca¤› için;
adap.Fill(data); tablodaki sat›rlar›n her biri, kontrolden Sitemi SQL Injection’a karfl› nas›l
rahatça geçecektir. Kötü niyetli kullan›- koruyabilirim?
// E¤er veri döndüyse, girifl do¤-
rudur
c› ise, tabloda kay›tl› ilk kullan›c› olan fiimdiye kadar SQL Injection sald›r›lar›-
if (data.Rows.Count > 0) “whitesaint” hesab›yla siteye ba¤lanma n›n tehlikeli yüzünü gördük. Peki bu ko-
{ flans›n› elde etmifl olacakt›r. nuda çaresiz miyiz? Tabii ki hay›r…
bilgi.Text = "Hoflgeldin
";
Merak etmeyin; ne yapt›¤›n› bilen dik-
bilgi.Text += da- Ürkütücü, öyle de¤il mi? katli bir programc›, sitesini SQL Injecti-
ta.Rows[0]["username"].ToString(); SQL Injection neden tehlikelidir? on sald›r›lar›na karfl› kolayca
}
else
SQL Injection sald›r›lar›n›n ard›ndaki te- koruyabilir. Bu konudaki temel tavsiye-
{ mel fikri herkesin kavrad›¤›n› tahmin lerimi sizlerle paylaflaca¤›m.
bilgi.Text = "Yanl›fl gi- ediyorum. Bu yaz›n›n amac› sanal hay- Birinci ve en önemli kural, Web üze-
rifl...";
}
dut yetifltirmek olmad›¤› için, daha fazla rinden gönderilen verileri tehlikeli ka-
} canl› sald›r› örne¤i vermeyece¤im. Buna rakterlerden ar›nd›rmakt›r. Örne¤in '
karfl›l›k, bu tekni¤i kullanan birinin site- karakteri, SQL sorgular›nda metin de¤er-
ba¤lant›s› aç›ld›ktan sonra; sqlString de- nizde neler yapabilece¤ini bilmenizde lerini tan›mlamak için kullan›lan anah-
¤iflkenine flu de¤er atanacakt›r: fayda var: tar karakterdir. ‹ncelemifl oldu¤umuz
SELECT * FROM users WHERE username • Korunan bölgelere kaçak girifl yap- canl› örnekte, bu küçük sevimli karakte-
= 'whitesaint' AND password = '12345' mak. Bu tehlikeyi örne¤imizde yak›n- rin tafl›d›¤› tehlike potansiyelinin ne ka-
Bu komut veritaban›nda çal›flt›r›ld›- dan incelemifl bulunuyoruz. dar büyük oldu¤unu gördük. Tehlikeli
¤›nda, users tablosundaki ilk kay›t geri • Veritaban›ndaki kritik bilgilere erifl- olabilecek baflka karakterler de söz ko-
dönecek ve whitesaint kullan›c›s› siteye mek. SQL diline hakim biri, UNION nusu oldu¤undan [ % - ( ) gibi ]; size tav-
girifl yapm›fl olacakt›r. komutundan faydalanarak veritaba- siyem, kritik sorgularda sadece
Peki, ya siteye girerken yanl›fl bir flif- n›ndaki di¤er tablolardan da veri çe- alfanumerik karakterlerin kullan›m›na
re yazacak olursak? E¤er kullan›c› ad› kebilir. Bu tablolar›n bir tanesinin izin vermeniz. E¤er tehlikeli karakterle-
kutusuna azade ve flifre kutusuna porta- kredi kart› numaralar›n› sakl›yor ol- re izin vermek zorundaysan›z, kodunu-
kal yazacak olursak, sqlString de¤iflkeni- du¤unu düflünürsek, tehlikenin bo- za sorgular›n›z›n manipule edilmesini
ne flu de¤er atanacakt›r: yutlar› konusunda daha iyi bir önleyecek güvenlik kontrolleri ekleyin.
SELECT * FROM users WHERE username fikrimiz olabilir. Müflteri listemizi ele Bir di¤er önemli nokta, kullan›c›lar›n
= 'azade' and password = 'portakal' geçirmek için can atan rakiplerimiz girifl yapt›¤› kutular›n uzunlu¤uyla ilgi-
ise, adres & telefon bilgilerinin tutul- li. E¤er kutular›n karakter uzunlu¤unu
users tablosunda “azade-portakal” du¤u tablolar›n pefline düflecektir. s›n›rlamazsan›z, SQL bilen kötü niyetli
fleklinde bir kay›t olmad›¤› için, tablodan • Verileri bozmak. SQL diline hakim bi- bir kifliye diledi¤i herfleyi yapabilece¤i
ri, INSERT komutundan faydalanarak genifl bir alan b›rakm›fl olursunuz; zira

www.winnetmag.com.tr Windows & .NET Magazine MAYIS 2004 30


Cözümler | SQL Injection

uzun bir SQL komutunun yarataca¤› Oysa veriyi çekece¤imiz noktaya bir
tehlike daha büyük olacakt›r. Deminki try…catch blo¤u ekleyerek hatalar› yaka-
örne¤imizde, kullan›c› ad› ve flifre alan- lam›fl olsayd›k, karfl›laflaca¤›m›z görün-
lar›n› 8 karakterle s›n›rlamak iyi bir fikir tü çok farkl› olacakt›.
olacakt›r. Tutarl›l›¤› sa¤lamak ad›na, ay- // Veriyi çekelim
n› s›n›rland›rmay› yapman›z gereken iki data = new DataTable();
yer daha vard›r: Veritaban›ndaki users try
tablosu, ve kodun kendisi! sqlString de- {
¤iflkenindeki komutu oluflturdu¤umuz adap.Fill(data);
kodu flu flekilde yazd›¤›m›z› varsayal›m: }
// Komut sat›r›n› olufltural›m catch
sqlString = "SELECT * FROM { fiekil 6: Hatalar›m›z› kullan›c›larla paylaflmak
users WHERE username = '"; } zorunda de¤iliz…
sqlString += uname.Text.Subst- Bu flekilde, hata mesajlar›na ait ayr›n-
ring(0, 8); t›lar›n kullan›c›lar taraf›ndan görüntü- laka de¤ifltirilmifl olmal›d›r. SQL Ser-
sqlString += "' AND password lenmesinin önüne geçebiliriz. ver’›n “sa” hesab›, Oracle’›n “sys”, “sys-
= '"; Include dosyalar›, dikkat edilmesi ge- tem” ve “scott” hesaplar›, bu konunun
sqlString += pword.Text.Subst- reken bir di¤er noktad›r. Eski al›flkanl›k- belirgin örnekleridir.
ring(0, 8); lar› devam ettirerek dosyalar›m›za Veritaban›ndaki kritik bilgileri flifrele-
sqlString += "'"; “include.inc” gibi isimler verirsek, dos- yerek saklamak, al›nmas› gereken bir di-
yan›n ad›n› ö¤renen herhangi biri içeri- ¤er güvenlik önlemidir. Örne¤in; kredi
Art›k kötü niyetli kullan›c›lar kutula- ¤ini kolayca görüntüleyebilir. Bu tip kart› numaralar›n› “5888 4300 4565
ra ne yazarsa yazs›n, sunucu taraf›nda Include dosyalar›nda; veritaban› flifrele- 4565” gibi ç›plak bir flekilde saklamak,
gönderilen verinin sadece ilk 8 karakte-
rini dikkate al›yor olaca¤›z. Bu flekilde Eğer önemli bilgileri şifrelenmiş
güvenli¤imiz bir derece daha artm›fl ola-
cakt›r. Bunun yan› s›ra, Referrer Spoof ile olarak saklarsanız SQL Injection
Form Post etmek isteyebilecek kiflilerin
uzun SQL cümleleri göndermesini de yöntemiyle çalınması muhtemel
engellemifl oluruz.
.NET programc›lar›n› ilgilendiren bir
veriler çalanın işine yaramaz.
di¤er önemli nokta, hatalar›n yakalan-
mas›d›r. Yukar›da inceledi¤imiz örnekte; ri, tablo isimleri, SQL Server hesaplar› gi- tabloya s›zan bir kiflinin bütün numara-
siteye flu bilgilerle girildi¤ini varsayal›m: bi kritik bilgiler yer al›yor olabilir. Bu lar› ele geçirmesine ve bu numaralar›
Kullan›c› Ad› : neo yüzden yapmam›z gereken fley, söz ko- kullanarak gönlünce al›flverifl yapmas›-
fiifre :' nusu dosyalara sunucu taraf›nda derle- na izin vermek anlam›na gelir. Buna
nen dosya uzant›lar› atamam›zd›r. karfl›l›k, numaralar› sa¤lam bir algorit-
Tek bafl›na kullan›lan ' karakteri sor- Örne¤imizde ayn› dosyaya “include.asp” ma ile flifreleyerek “HK2omuDFf52ScK-
gumuzu bozaca¤› ve yanl›fl çal›flmas›na ad›n› verecek olursak, birileri dosyan›n dE223R” fleklinde saklayacak olursak,
yol açaca¤› için, Web sitemiz ayr›nt›l› bir ad›n› ö¤rense bile içeri¤ini Web üzerin- numaralar SQL Injection yöntemi ile ele
hata mesaj› verecektir. Bu hata mesaj›, den görüntülemesi o kadar kolay olma- geçirilse bile kimseye bir fley ifade etme-
kötü niyetli ziyaretçimizin siteyi daha yacakt›r. “.asp” uzant›l› dosyalar yecektir.
fazla zorlamas›n› sa¤layacak son derece istemciye derlenerek gönderildi¤i için,
kritik bilgiler içeriyor olabilir. kötü niyetli ziyaretçimizin görebilece¤i Sonuç
tek fley, üretilmifl bir tak›m HTML kod- Bu yaz›da, SQL Injection sald›r›lar›n› ve
lar› olacakt›r. .NET programc›lar›n›n alabilece¤i temel
fiimdiye kadar hep iflin kodlama k›s- güvenlik önlemlerini incelemifl olduk.
m›ndan bahsettik. Ne var ki, veritaban› SQL Injection sald›r›lar›n›n bütün var-
taraf›nda almam›z gereken önlemler de yasyonlar›n› ve al›nabilecek güvenlik
var. Bu önlemlerin en önemlisi, kullan›- önlemlerinin tamam›n› tek bir makale-
c›lar ve yetkilendirme konusudur. Siteni- ye s›¤d›rmak ne yaz›k ki mümkün de¤il.
zin arkas›nda SQL Server veya Oracle Buna karfl›l›k, iflin temel mant›¤›n› ve püf
gibi bir RDBMS çal›fl›yorsa, Web üzerin- noktalar›n› herkesin anlad›¤›n› tahmin
den yürütülecek sorgularda kullanaca¤›z ediyorum. .NET d›fl›ndaki platformlarda
veritaban› hesab›n›n yetkilerini müm- uygulama gelifltirenler, yaz›da dile getir-
fiekil 5: Sitelerin standart hata mesajlar›, kün oldu¤u kadar s›n›rland›rmal›s›n›z. di¤im fikirleri kendi platformlar›na
kötü niyetli ziyaretçiler için hazine de¤erinde Bunun yan› s›ra, veritaban› yüklendi¤in- adapte ederek kolayca hayata geçirebilir-
olabilir… de haz›r gelen hesaplara ait flifreler mut- ler.

30 MAYIS 2004 Windows & .NET Magazine www.winnetmag.com.tr

You might also like