Bezbednost u MySql-u
Faktori koji utiču na sigurnost MySql servera i aplikacija koje ga koriste Opšti faktori koji utiču na sigurnost Biranje adekvatnih šifara (passwords) Davanje odgovarajućih prava pristupa korisnicima Sprečavanje napada (npr SQL injection) Sigurnost same instalacije MySql servera Data files, log files, application files – njihovo čitanje i pisanje treba da bude dozvoljeno samo autorizovanim korisnicima Kontrola pristupa i sigurnost unutar baze podataka Korišćenje MySql sistema za kontrolu pristupa (MySql Access Privilege System) i MySql sistema za upravljanje korisničkim nalozima (MySql User Account Management System)
Faktori koji utiču na sigurnost MySql servera i aplikacija koje ga koriste - nastavak Instaliranje odgovarajućih dodataka za sigurnost (security plugins) i korišćenje njihovih funkcionalnosti Sigurnost mreže na kojoj se nalazi server Davanje pristupa autorizovanim korisnicima Ili, može se ograničiti pristup MySql-u tako da mu se može pristupiti samo lokalno, ili samo sa određenih spoljnih lokacija Obezbeđivanje načina za oporavak podataka Čuvanje kopija (backups) datoteka sa podacima (database files), kao i konfiguracionih i log datoteka Plan za oporavak (recovery) podataka iz backup datoteka i testiranje da li su svi podaci uspešno oporavljeni
Sql injection Napadač izvršava maliciozne Sql naredbe Osetljivost na Sql injection može postojati u zavisnosti od načina izvršavanja Sql skriptova u web aplikaciji
Sql injection – primer 1 Uobičajen programski kod na serverskoj strani koji autentifikuje korisnika (pseudo-kod) # Definisanje POST promenljivih uname = request.POST['username'] passwd = request.POST['password'] # SQL query osetljiv na SQLi sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’” # Izvršavanje SQL naredbe database.execute(sql)
Sql injection – primer 1 – nastavak SELECT id FROM users WHERE username=’nesto’ AND password=’nesto’ Postavljanje passsword polja na formi na vrednost: nesto' OR '1'='1' # SELECT id FROM users WHERE username=’nesto’ AND password=’nesto’ OR ’1 ’ = ’ 1 ’ # Često je rezultat userID prvog korisnika u tabeli, što je u velikom broju slučajeva upravo administrator baze!
Sql injection – uslovi RDBMS koji koristi SQL jezik Ugrađivanje podatka koji korisnik unosi direktno u SQL upit
Sql injection – primer 2 http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1,pass,cc FROM users WHERE uname='test'
Prevencija Sql injection Programski kod u kojem se pristupa bazi podataka i izvršavaju Sql upiti treba da bude takav da spreči Sql injection Postoje preporuke za svaki programski jezik i odgovarajuću tehnologiju za kreiranje web aplikacija koje rade sa bazom http://download.oracle.com/oll/tutorials/SQLInjection/index.htm https://www.acunetix.com/websitesecurity/sql-injection2/ http://bobby-tables.com/
http://bobby-tables.com/
Najčešći tipovi SQl injection napada In-band SQLi – napadač koristi isti komunikacioni kanal da sprovede napad i prikupi rezultate Error-based Oslanja se na poruku o grešci koju RDBMS generiše i prikazuje napadaču Poruka sadrži podatke o strukturi baze (nazivi tabela i kolona) Prevencija: Poruke o grešci treba da budu isključene na live-bazi, one se koriste samo u development fazi UNION-based Koristi UNION klauzulu da dobije rezultate drugih tabela koje nisu bile uključene u upit
Drugi tipovi SQl injection napada Inferential SQLi (Blind SQLi) Time-based Blind SQLi