Çözümler

Kerem Köseo¤lu Çözümler 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

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›lar›na karfl› ne gibi önlemler alabilece¤ini de hep birlikte görece¤iz.
fiekil 2: Kötü niyetli bir kullan›c›n›n SQL Injection ile yanl›fl çal›flmas›n› sa¤lad›¤› ö¤eler…

SQL Injection Nedir?
Aram›zda Internet üzerinden düzenli bir flekilde al›flverifl yapan kimse var m›? Pekala… fiimdi Web üzerinden maillerini kontrol edenleri görelim? Güzel… Ya bankac›l›k ifllemlerini Internet ü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 sunucusunda ç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› veritaban›nda bulunup bulunmad›¤›n› kontrol edecektir.

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 pekifltirmekte 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.

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

fiekil 1: Web sitelerindeki Login sürecinin standart iflleyifli…

SQL Injection sald›r›lar›n›n yaratt›¤› tehlike, iflte tam bu noktada ortaya ç›kar. KEREM Sitenin programc›s› dikkatsiz davrand›y- KÖSEO⁄LU Windows & .NET sa; “Kullan›c› ad›” ve “fiifre” kutucuklar›- Magazine'in katk›da na özel SQL kodlar› giren kötü niyetli bir bulunan flah›s, veritaban› üzerinde yap›lan do¤ru- yazarlar›ndand›r. lama ifllemini manipule ederek siteye is- Çözümevi firmas›nda tedi¤i hesapla ba¤lanabilir. Söz konusu analist programc› ve SAP dan›flman› hesap üzerinde istedi¤i her türlü oynama- olarak çal›flmaktad›r. y› yapabilir. Bunun yan› s›ra, ayn› verita- Kendisine keremk@ ban›n›n farkl› tablolar›nda yer alan winnetmag.com.tr adresinden bilgileri de okuyabilir ve de¤ifltirebilir.
ulaflabilirsiniz.

Gelelim kullan›c›lar›n girifl yapabilmesini sa¤layan koda… Gereksiz ayr›nt›lara sap›p konuyu kar›flt›rmamak ad›na, kodu mümkün oldu¤u kadar basit tuttum (Liste 1). Kodun yapt›¤› ifl oldukça aç›k… Birinci ad›mda, cgi-bin klasörü alt›nda yer alan “sin.mbd” adl› veritaban›na ba¤lan›yoruz. ‹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 çal›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 ediyorum… fiimdi; siteye whitesaint kullan›c› ad› ve 12345 flifresiyle girifl yapmaya çal›flt›¤›m›z› varsayal›m. Veritaban›

30 MAYIS 2004 Windows & .NET Magazine

www.winnetmag.com.tr

Cözümler

| SQL Injection

Liste 1: Kullan›c› girifl kodu.
piae vi lgnCikojc sne, rvt od oi_lc(bet edr Sse.vnAg e ytmEetrs ) { srn tig sltig qSrn; srn tig cnSrn; ontig Oeboncin lDCneto cn; on Oebaadpe lDDtAatr aa; dp DtTbe aaal dt; aa / B¤atmz aa› / aln››› çlm cnSrn ontig = "rvdrMco Poie=irsf.e.LD..;aa Suc=; otJtOEB40Dt ore" cnSrn + Sre.aPt(ci ontig = evrMpah"gbnsnmb) i/i.d"; cn =nwOeboncincnSon e lDCneto(ont rn) ig; cn.pn) onOe(; / Kmt strn outrlm / ou a››› lflua› sltig = "EET * FO ues qSrn SLC RM sr WEE uenm = '; HR srae " sltig + uaeTx; qSrn = nm.et sltig+ " ADpswr ='; qSrn = ' N asod " sltig + podTx; qSrn = wr.et sltig + "" qSrn = '; aa dp = nw Oebaadp e lDDtAatrsltig cn) e(qSrn, on; / Vry çklm / eii eei dt = nw DtTbe) aa e aaal(; aa.ildt) dpFl(aa; / Ee vr dnüs, grfl d¤ / ¤r ei ödye ii ordr uu i (aaRw.on > 0 f dt.osCut ) { bliTx ="ogli ig.et Hfledn " ; bliTx ig.et + = da t.os0[uenm".otig) aRw[]"srae]TSrn(; } es le { b l i T x =" a l flg ig.et Yn› i rfl." i..; } }

geriye hiçbir de¤er dönmeyecek ve kullan›c› siteye girifl yapamayacakt›r. Bu noktaya kadar, kadar her programc›n›n tahmin etti¤i ve bekledi¤i senaryolar› 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 kolay! Sayfam›za giren kiflinin, kutucuklara flu bilgileri girdi¤ini düflünelim: Kla›› A› : no ulnc d e fife ir : no O '' = ' e' R a a Bu flekilde girifl yap›ld›¤›nda, sqlString de¤iflkenine flu de¤er atanacakt›r: SLC * FO ues WEE uenm EET RM sr HR srae = 'e' AD pswr = 'e' O '' = no N asod no R a '' a ‹ster inan›n ister inanmay›n; bu sorgu, users tablosunda yer alan bütün kay›tlar› geri döndürecektir. Neden mi? Sorgunun en sonundaki “OR 'a' = 'a'” ifadesine 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.

fiekil 4: SQL Injection tekni¤ini bilen bir kiflinin sitenize izinsiz girmesi için Neo olmas›na gerek yok…

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üntülenmesini sa¤layabilir. • Sitenin ifllemesini engellemek. SQL Injection sald›r›s›nda DELETE komutunu seçen biri, tablolarda yer alan içeri¤i tamamen silebilir. E¤er düzenli 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 konuda çaresiz miyiz? Tabii ki hay›r… Merak etmeyin; ne yapt›¤›n› bilen dikkatli bir programc›, sitesini SQL Injection sald›r›lar›na karfl› kolayca koruyabilir. Bu konudaki temel tavsiyelerimi sizlerle paylaflaca¤›m. Birinci ve en önemli kural, Web üzerinden gönderilen verileri tehlikeli karakterlerden ar›nd›rmakt›r. Örne¤in ' karakteri, SQL sorgular›nda metin de¤erlerini tan›mlamak için kullan›lan anahtar karakterdir. ‹ncelemifl oldu¤umuz canl› örnekte, bu küçük sevimli karakterin tafl›d›¤› tehlike potansiyelinin ne kadar büyük oldu¤unu gördük. Tehlikeli olabilecek baflka karakterler de söz konusu oldu¤undan [ % - ( ) gibi ]; size tavsiyem, kritik sorgularda sadece alfanumerik karakterlerin kullan›m›na izin vermeniz. E¤er tehlikeli karakterlere izin vermek zorundaysan›z, kodunuza 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 ilgili. 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
Windows & .NET Magazine MAYIS 2004 30

Ürkütücü, öyle de¤il mi? SQL Injection neden tehlikelidir?
SQL Injection sald›r›lar›n›n ard›ndaki temel fikri herkesin kavrad›¤›n› tahmin ediyorum. Bu yaz›n›n amac› sanal haydut yetifltirmek olmad›¤› için, daha fazla canl› sald›r› örne¤i vermeyece¤im. Buna karfl›l›k, bu tekni¤i kullanan birinin sitenizde neler yapabilece¤ini bilmenizde fayda var: • Korunan bölgelere kaçak girifl yapmak. Bu tehlikeyi örne¤imizde yak›ndan incelemifl bulunuyoruz. • Veritaban›ndaki kritik bilgilere eriflmek. SQL diline hakim biri, UNION komutundan faydalanarak veritaban›ndaki di¤er tablolardan da veri çekebilir. Bu tablolar›n bir tanesinin kredi kart› numaralar›n› sakl›yor oldu¤unu düflünürsek, tehlikenin boyutlar› konusunda daha iyi bir fikrimiz olabilir. Müflteri listemizi ele geçirmek için can atan rakiplerimiz ise, adres & telefon bilgilerinin tutuldu¤u tablolar›n pefline düflecektir. • Verileri bozmak. SQL diline hakim biri, INSERT komutundan faydalanarak

ba¤lant›s› aç›ld›ktan sonra; sqlString de¤iflkenine flu de¤er atanacakt›r: SLC * FO ues WEE uenm EET RM sr HR srae = 'htsit AD pswr = '24' wiean' N asod 135 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 flifre yazacak olursak? E¤er kullan›c› ad› kutusuna azade ve flifre kutusuna portakal yazacak olursak, sqlString de¤iflkenine flu de¤er atanacakt›r: SLC * FO ues WEE uenm EET RM sr HR srae = 'zd' ad pswr = 'otkl aae n asod praa' users tablosunda “azade-portakal” fleklinde bir kay›t olmad›¤› için, tablodan

www.winnetmag.com.tr

Cözümler

| SQL Injection

uzun bir SQL komutunun yarataca¤› tehlike daha büyük olacakt›r. Deminki örne¤imizde, kullan›c› ad› ve flifre alanlar›n› 8 karakterle s›n›rlamak iyi bir fikir olacakt›r. Tutarl›l›¤› sa¤lamak ad›na, ayn› 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: / Kmt strn outrlm / ou a››› lflua› sltig = "EET * FO qSrn SLC RM ues WEE uenm = '; sr HR srae " s l t i g+ u a e T x . u s qSrn = nm.etSbt rn(, 8; ig0 ) sltig + " AD pswr qSrn = ' N asod = '; " s l t i g+ p o d T x . u s qSrn = wr.etSbt rn(, 8; ig0 ) sltig + "" qSrn = '; Art›k kötü niyetli kullan›c›lar kutulara ne yazarsa yazs›n, sunucu taraf›nda gönderilen verinin sadece ilk 8 karakterini dikkate al›yor olaca¤›z. Bu flekilde güvenli¤imiz bir derece daha artm›fl olacakt›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 yakalanmas›d›r. Yukar›da inceledi¤imiz örnekte; siteye flu bilgilerle girildi¤ini varsayal›m: Kla›› A› : no ulnc d e fife ir :' Tek bafl›na kullan›lan ' karakteri sorgumuzu 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› yakalam›fl olsayd›k, karfl›laflaca¤›m›z görüntü çok farkl› olacakt›. / Vry çklm / eii eei dt = nw DtTbe) aa e aaal(; ty r { aa.ildt) dpFl(aa; } cth ac { } Bu flekilde, hata mesajlar›na ait ayr›nt›lar›n kullan›c›lar taraf›ndan görüntülenmesinin önüne geçebiliriz. Include dosyalar›, dikkat edilmesi gereken bir di¤er noktad›r. Eski al›flkanl›klar› devam ettirerek dosyalar›m›za “include.inc” gibi isimler verirsek, dosyan›n ad›n› ö¤renen herhangi biri içeri¤ini kolayca görüntüleyebilir. Bu tip Include dosyalar›nda; veritaban› flifrele-

fiekil 6: Hatalar›m›z› kullan›c›larla paylaflmak zorunda de¤iliz…

laka de¤ifltirilmifl olmal›d›r. SQL Server’›n “sa” hesab›, Oracle’›n “sys”, “system” ve “scott” hesaplar›, bu konunun belirgin örnekleridir. Veritaban›ndaki kritik bilgileri flifreleyerek 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,

Eğer önemli bilgileri şifrelenmiş olarak saklarsanız SQL Injection yöntemiyle çalınması muhtemel veriler çalanın işine yaramaz.
ri, tablo isimleri, SQL Server hesaplar› gibi kritik bilgiler yer al›yor olabilir. Bu yüzden yapmam›z gereken fley, söz konusu dosyalara sunucu taraf›nda derlenen 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 üzerinden görüntülemesi o kadar kolay olmayacakt›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 kodlar› olacakt›r. fiimdiye kadar hep iflin kodlama k›sm›ndan bahsettik. Ne var ki, veritaban› taraf›nda almam›z gereken önlemler de var. Bu önlemlerin en önemlisi, kullan›c›lar ve yetkilendirme konusudur. Sitenizin arkas›nda SQL Server veya Oracle gibi bir RDBMS çal›fl›yorsa, Web üzerinden yürütülecek sorgularda kullanaca¤›z veritaban› hesab›n›n yetkilerini mümkün oldu¤u kadar s›n›rland›rmal›s›n›z. Bunun yan› s›ra, veritaban› yüklendi¤inde haz›r gelen hesaplara ait flifreler muttabloya s›zan bir kiflinin bütün numaralar› 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 algoritma ile flifreleyerek “HK2omuDFf52ScKdE223R” fleklinde saklayacak olursak, numaralar SQL Injection yöntemi ile ele geçirilse bile kimseye bir fley ifade etmeyecektir.

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 varyasyonlar›n› ve al›nabilecek güvenlik önlemlerinin tamam›n› tek bir makaleye 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 getirdi¤im fikirleri kendi platformlar›na adapte ederek kolayca hayata geçirebilirler.
www.winnetmag.com.tr

fiekil 5: Sitelerin standart hata mesajlar›, kötü niyetli ziyaretçiler için hazine de¤erinde olabilir… 30 MAYIS 2004 Windows & .NET Magazine

Sign up to vote on this title
UsefulNot useful