SQL Injection: Web Siteniz Tehdit Altında Mı?

download SQL Injection: Web Siteniz Tehdit Altında Mı?

of 3

Transcript of SQL Injection: Web Siteniz Tehdit Altında Mı?

  • 8/9/2019 SQL Injection: Web Siteniz Tehdit Altnda M?

    1/3

    zmler

    MAYIS 2004 Windows & .NET Magazine www.winnetmag.com.tr30

    zmler

    u ay, Web sitelerini ciddi lde tehdit eden SQL

    Injection saldrlarn inceleyeceiz. Bunun yan s-ra, .NET programclarnn SQL Injection saldrla-rna karfl ne gibi nlemler alabileceini de hepbirlikte greceiz.

    SQL Injection Nedir?Aramzda Internet zerinden dzenli bir flekilde alflverifl ya-pan kimse var m? Pekala fiimdi Web zerinden maillerinikontrol edenleri grelim? Gzel Ya bankaclk ifllemlerini In-ternet zerinden halledenler?

    Gnmzde Internet zerinden yaplan ifllemlerin bykbir ksmnda, ziyaret ettiimiz siteye kendimizi tantmak iin

    bir kullanc ad ve flifre girmemiz gerekir. Kullanc Ad vefiifre kutucuklarna girmifl olduumuz deerler Web sunu-cusunda alflan bir program tarafndan kontrol edilir ve do-rulama ifllemi sonucunda yetkimiz olan ifllemleri yapabilirhale geliriz.

    Peki ama, sahnenin arkasnda neler olup bitiyor? Sunucu,biz bilgilerimizi girdikten sonra bu bilgileri ieren bir SQLcmlecii oluflturacak ve hesap bilgilerimizin kullanc veri-tabannda bulunup bulunmadn kontrol edecektir.

    SQL Injection saldrlarnn yaratttehlike, iflte tam bu noktada ortaya kar.Sitenin programcs dikkatsiz davrandy-sa; Kullanc ad ve fiifre kutucuklar-na zel SQL kodlar giren kt niyetli birflahs, veritaban zerinde yaplan doru-lama ifllemini manipule ederek siteye is-tedii hesapla balanabilir. Sz konusu

    hesap zerinde istedii her trl oynama-y yapabilir. Bunun yan sra, ayn verita-bannn farkl tablolarnda yer alanbilgileri de okuyabilir ve deifltirebilir.

    Ksaca; SQL Injection, Web siteleri zerindeki formlara zelbir takm SQL kodlar girerek normal flartlarda yaplmamasgereken ifllemlerin yaplmasna verilen addr.

    SQL Injection nasl yaplyor?

    Bu genel aklamann ardndan, konuyu basit bir rnekle pe-kifltirmekte fayda var.rnek senaryomuzda, C# ile hazrlanmfl bir Web sayfas-

    n inceleyeceiz. Bu sayfa, yelerimizin siteye girifl yapmas-n salayan standart bir Login ekran ierecek.

    Gelelim kullanclarn girifl yapabilmesini salayan kodaGereksiz ayrntlara sapp konuyu karfltrmamak adna, ko-du mmkn olduu kadar basit tuttum (Liste 1).

    Kodun yapt ifl olduka ak Birinci admda, cgi-bin kla-sr altnda yer alan sin.mbd adl veritabanna balanyo-ruz. kinci admda, kullancnn formdan girdii kullanc ad& flifreyi kullanarak bir SQL cmlesi oluflturuyoruz. ncadmda ise; oluflturduumuz SQL cmlesini veritabannda a-lfltrarak, girilen kullanc ad & flifrenin doru olup olmad-n kontrol ediyoruz.

    Kullanc bilgilerini tutan veritaban tablosu ise, flu flekilde

    tasarlanmfltr:Buraya kadar anlafllmayan birfley olmadn tahmin edi-

    yorum fiimdi; siteye whitesaint kullanc ad ve 12345 flifre-siyle girifl yapmaya alfltmz varsayalm. Veritaban

    Kerem Kseolu [email protected]

    SQL Injection:Web siteniz tehdit altnda m?SQL Injection ad verilen saldr ynteminden haberdarmsnz? Cevabnz olumsuz ise, Web siteleriniz ciddianlamda tehlikede olabilir.

    B

    KEREMKSEOLUWindows & .NET

    Magazine'in katkda

    bulunan

    yazarlarndandr.

    zmevi firmasnda

    analist programc

    ve SAP danflman

    olarak alflmaktadr.

    Kendisine keremk@

    winnetmag.com.tr

    adresinden

    ulaflabilirsiniz.

    fiekil 1: Web sitelerindeki Login srecinin standart iflleyifli

    fiekil 2: Kt niyetli bir kullancnn SQL Injection ile yanlfl alflmasnsalad eler

    fiekil 3: Kullanclarn girifl yaparken kullanaca Login ekran

  • 8/9/2019 SQL Injection: Web Siteniz Tehdit Altnda M?

    2/3

    Czmler | SQL Injection

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

    balants aldktan sonra; sqlString de-iflkenine flu deer atanacaktr:

    SELECT * FROM users WHERE username= 'whitesaint' AND password = '12345'

    Bu komut veritabannda alfltrld-nda, users tablosundaki ilk kayt geridnecek ve whitesaint kullancs siteyegirifl yapmfl olacaktr.

    Peki, ya siteye girerken yanlfl bir flif-re yazacak olursak? Eer kullanc adkutusuna azade ve flifre kutusuna porta-kal yazacak olursak, sqlString deiflkeni-ne flu deer atanacaktr:SELECT * FROM users WHERE username

    = 'azade' and password = 'portakal'

    users tablosunda azade-portakalfleklinde bir kayt olmad iin, tablodan

    geriye hibir deer dnmeyecek ve kul-lanc siteye girifl yapamayacaktr.

    Bu noktaya kadar, kadar her prog-ramcnn tahmin ettii ve bekledii se-naryolar incelemifl olduk fiimdi sra,sabrszlkla beklediiniz konuya geldi:Kt niyetli bir kullanc, SQL Injectionteknii ile siteye nasl szabilir? Gayet ko-lay! Sayfamza giren kiflinin, kutucukla-ra flu bilgileri girdiini dflnelim:Kullanc Ad : neo

    fiifre : neo' OR 'a' = 'a

    Bu flekilde girifl yapldnda, sqlStringdeiflkenine flu deer atanacaktr:SELECT * FROM users WHERE username

    = 'neo' AND password = 'neo' OR 'a' ='a'

    ster inann ister inanmayn; bu sor-gu, users tablosunda yer alan btn ka-ytlar geri dndrecektir. Neden mi?Sorgunun en sonundaki OR 'a' = 'a' ifa-desine dikkat edin. a karakteri kendikendisine her zaman eflit olaca iin;tablodaki satrlarn her biri, kontroldenrahata geecektir. Kt niyetli kullan-c ise, tabloda kaytl ilk kullanc olan

    whitesaint hesabyla siteye balanmaflansn elde etmifl olacaktr.

    rktc, yle deil mi?SQL Injection neden tehlikelidir?SQL Injection saldrlarnn ardndaki te-mel fikri herkesin kavradn tahminediyorum. Bu yaznn amac sanal hay-dut yetifltirmek olmad iin, daha fazlacanl saldr rnei vermeyeceim. Bunakarfllk, bu teknii kullanan birinin site-nizde neler yapabileceini bilmenizdefayda var:

    Korunan blgelere kaak girifl yap-mak. Bu tehlikeyi rneimizde yakn-dan incelemifl bulunuyoruz.

    Veritabanndaki kritik bilgilere erifl-mek. SQL diline hakim biri, UNIONkomutundan faydalanarak veritaba-nndaki dier tablolardan da veri e-kebilir. Bu tablolarn bir tanesininkredi kart numaralarn saklyor ol-duunu dflnrsek, tehlikenin bo-yutlar konusunda daha iyi birfikrimiz olabilir. Mflteri listemizi ele

    geirmek iin can atan rakiplerimizise, adres & telefon bilgilerinin tutul-duu tablolarn pefline dflecektir.

    Verileri bozmak. SQL diline hakim bi-ri, INSERT komutundan faydalanarak

    ve biraz deneme / yanlma yaparak,dier tablolara veri de ekleyebilir. Buflekilde; rnein sitenin haberler bl-

    mnde yalan yanlfl metinlerin grn-tlenmesini salayabilir.

    Sitenin ifllemesini engellemek. SQLInjection saldrsnda DELETE komu-tunu seen biri, tablolarda yer alanierii tamamen silebilir. Eer dzen-li yedekleme yapmyorsanz, sitenizeveda edebilirsiniz.

    Sitemi SQL Injectiona karfl naslkoruyabilirim?fiimdiye kadar SQL Injection saldrlar-

    nn tehlikeli yzn grdk. Peki bu ko-nuda aresiz miyiz? Tabii ki hayrMerak etmeyin; ne yaptn bilen dik-katli bir programc, sitesini SQL Injecti-on saldrlarna karfl kolaycakoruyabilir. Bu konudaki temel tavsiye-lerimi sizlerle paylaflacam.

    Birinci ve en nemli kural, Web ze-rinden gnderilen verileri tehlikeli ka-rakterlerden arndrmaktr. rnein 'karakteri, SQL sorgularnda metin deer-lerini tanmlamak iin kullanlan anah-tar karakterdir. ncelemifl olduumuz

    canl rnekte, bu kk sevimli karakte-rin tafld tehlike potansiyelinin ne ka-dar byk olduunu grdk. Tehlikeliolabilecek baflka karakterler de sz ko-nusu olduundan [ % - ( ) gibi ]; size tav-siyem, kritik sorgularda sadecealfanumerik karakterlerin kullanmnaizin vermeniz. Eer tehlikeli karakterle-re izin vermek zorundaysanz, kodunu-za sorgularnzn manipule edilmesininleyecek gvenlik kontrolleri ekleyin.

    Bir dier nemli nokta, kullanclarn

    girifl yapt kutularn uzunluuyla ilgi-li. Eer kutularn karakter uzunluunusnrlamazsanz, SQL bilen kt niyetlibir kifliye diledii herfleyi yapabileceigenifl bir alan brakmfl olursunuz; zira

    fiekil 4: SQL Injection tekniini bilen birkiflinin sitenize izinsiz girmesi iin Neo

    olmasna gerek yok

    private void login_Click(object sender,

    System.EventArgs e)

    {

    stringsqlString;

    string

    connString;

    OleDbConnection conn;

    OleDbDataAdapter adap;

    DataTable data;

    // Balantmz aalm

    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 satrn oluflturalmsqlString = "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);

    // Eer veri dndyse, girifl do-

    rudur

    if (data.Rows.Count > 0){

    bilgi.Text = "Hoflgeldin

    ";

    bilgi.Text += da-

    ta.Rows[0]["username"].ToString();

    }

    else

    {

    bilgi.Text = "Yanlfl gi-

    rifl...";

    }

    }

    Liste 1: Kullanc girifl kodu.

  • 8/9/2019 SQL Injection: Web Siteniz Tehdit Altnda M?

    3/3

    Czmler | SQL Injection

    MAYIS 2004 Windows & .NET Magazine www.winnetmag.com.tr30

    uzun bir SQL komutunun yaratacatehlike daha byk olacaktr. Deminkirneimizde, kullanc ad ve flifre alan-larn 8 karakterle snrlamak iyi bir fikirolacaktr. Tutarll salamak adna, ay-n snrlandrmay yapmanz gereken ikiyer daha vardr: Veritabanndaki userstablosu, ve kodun kendisi! sqlString de-iflkenindeki komutu oluflturduumuzkodu flu flekilde yazdmz varsayalm:// Komut satrn oluflturalm

    sqlString = "SELECT * FROM

    users WHERE username = '";

    sqlString += uname.Text.Subst-

    ring(0, 8);

    sqlString += "' AND password

    = '";sqlString += pword.Text.Subst-

    ring(0, 8);

    sqlString += "'";

    Artk kt niyetli kullanclar kutula-ra ne yazarsa yazsn, sunucu tarafndagnderilen verinin sadece ilk 8 karakte-rini dikkate alyor olacaz. Bu flekildegvenliimiz bir derece daha artmfl ola-caktr. Bunun yan sra, Referrer Spoof ileForm Post etmek isteyebilecek kiflilerin

    uzun SQL cmleleri gndermesini deengellemifl oluruz..NET programclarn ilgilendiren bir

    dier nemli nokta, hatalarn yakalan-masdr. Yukarda incelediimiz rnekte;siteye flu bilgilerle girildiini varsayalm:Kullanc Ad : neo

    fiifre : '

    Tek baflna kullanlan ' karakteri sor-gumuzu bozaca ve yanlfl alflmasnayol aaca iin, Web sitemiz ayrntl birhata mesaj verecektir. Bu hata mesaj,

    kt niyetli ziyaretimizin siteyi dahafazla zorlamasn salayacak son derecekritik bilgiler ieriyor olabilir.

    Oysa veriyi ekeceimiz noktaya birtrycatch blou ekleyerek hatalar yaka-lamfl olsaydk, karfllaflacamz grn-t ok farkl olacakt.// Veriyi ekelim

    data = new DataTable();

    try

    {

    adap.Fill(data);

    }

    catch

    {

    }

    Bu flekilde, hata mesajlarna ait ayrn-tlarn kullanclar tarafndan grnt-lenmesinin nne geebiliriz.

    Include dosyalar, dikkat edilmesi ge-reken bir dier noktadr. Eski alflkanlk-lar devam ettirerek dosyalarmzainclude.inc gibi isimler verirsek, dos-yann adn renen herhangi biri ieri-ini kolayca grntleyebilir. Bu tipInclude dosyalarnda; veritaban flifrele-

    ri, tablo isimleri, SQL Server hesaplar gi-bi kritik bilgiler yer alyor olabilir. Buyzden yapmamz gereken fley, sz ko-nusu dosyalara sunucu tarafnda derle-nen dosya uzantlar atamamzdr.rneimizde ayn dosyaya include.aspadn verecek olursak, birileri dosyannadn rense bile ieriini Web zerin-den grntlemesi o kadar kolay olma-

    yacaktr. .asp uzantl dosyalaristemciye derlenerek gnderildii iin,kt niyetli ziyaretimizin grebileceitek fley, retilmifl bir takm HTML kod-lar olacaktr.

    fiimdiye kadar hep iflin kodlama ks-mndan bahsettik. Ne var ki, veritabantarafnda almamz gereken nlemler devar. Bu nlemlerin en nemlisi, kullan-clar ve yetkilendirme konusudur. Siteni-zin arkasnda SQL Server veya Oraclegibi bir RDBMS alflyorsa, Web zerin-

    den yrtlecek sorgularda kullanacazveritaban hesabnn yetkilerini mm-kn olduu kadar snrlandrmalsnz.Bunun yan sra, veritaban yklendiin-de hazr gelen hesaplara ait flifreler mut-

    laka deifltirilmifl olmaldr. SQL Ser-vern sa hesab, Oraclen sys, sys-

    tem ve scott hesaplar, bu konununbelirgin rnekleridir.

    Veritabanndaki kritik bilgileri flifrele-yerek saklamak, alnmas gereken bir di-er gvenlik nlemidir. rnein; kredikart numaralarn 5888 4300 45654565 gibi plak bir flekilde saklamak,

    tabloya szan bir kiflinin btn numara-lar ele geirmesine ve bu numaralarkullanarak gnlnce alflverifl yapmas-na izin vermek anlamna gelir. Bunakarfllk, numaralar salam bir algorit-ma ile flifreleyerek HK2omuDFf52ScK-dE223R fleklinde saklayacak olursak,numaralar SQL Injection yntemi ile elegeirilse bile kimseye bir fley ifade etme-

    yecektir.

    SonuBu yazda, SQL Injection saldrlarn ve.NET programclarnn alabilecei temelgvenlik nlemlerini incelemifl olduk.SQL Injection saldrlarnn btn var-yasyonlarn ve alnabilecek gvenliknlemlerinin tamamn tek bir makale-ye sdrmak ne yazk ki mmkn deil.Buna karfllk, iflin temel mantn ve pfnoktalarn herkesin anladn tahmin

    ediyorum. .NET dflndaki platformlardauygulama gelifltirenler, yazda dile getir-diim fikirleri kendi platformlarnaadapte ederek kolayca hayata geirebilir-ler.

    fiekil 5: Sitelerin standart hata mesajlar,kt niyetli ziyaretiler iin hazine deerinde

    olabilir

    fiekil 6: Hatalarmz kullanclarla paylaflmakzorunda deiliz

    Eer nemli bilgileri ifrelenmiolarak saklarsanz SQL Injection

    yntemiyle alnmas muhtemelveriler alann iine yaramaz.