18
Ubacivanje SQL koda (SQL injection)
0 Komentara | Postavio Miloš Milošević u Baze podataka i SQL injection
3.4.2 Ubacivanje SQL koda (SQL Injection)
(izvor: Diplomski rad Miloša Miloševića, VETŠ Beograd 2008/09)
Ubacivanje SQL koda je jedna od najčešćih slabosti u PHP aplikacijama. Da bi neka aplikacija mogla da ima ovu vrstu propusta developer zapravo mora napraviti dve greške pri pravljenju aplikacije:
- Propust pri filtriranju ulaznih podataka u aplikaciju
- Propust da se uradi “escape” ulaznih podataka pre nego što se pošalju bazi podataka
Nijedan od ovih koraka ne treba zaobići i oba koraka mogu značajno da umanje rizik od napada. Napadači moraju da imaju neko znanje o bazama podataka, da poznaju SQL jezik i da pogode šemu baze podataka, imena tabela i atributa tabela ili da imaju izvorni kod aplikacije kako bi mogli da izvrše napad.
Kada napadač prvi put vidi formu on mora da pogodi kakav tip upita stoji iza forme koji vrši validaciju podataka. Pošto pogleda HTML izvorni kod napadač može da pogodi koje konvencije se držao programer pri pravljenju aplikacije. Obično je konvencija imenovanja atributa u formama ista kao i atributi koji stoje u tabelama baze podataka.
Napadaču nije neophodno da iz prvog puta pogodi šemu baze podataka. Mnogi developeri koriste funkciju mysql_error() koja vraća tekst greške tokom izvršavanja upita.
Ukoliko napadač unese znak ‘ umesto korisničkog imena na ekranu se može ispisati deo upita u kome je došlo do greške i samim time napadaču je olakšan posao. Napadač može da sazna i da li se podaci pravilno filtriraju (ukoliko aplikacija ne pokazuje da je korisničko ime pogrešno) i da li se vrši ‘escape’ podataka (ukoliko aplikacija prikazuje grešku baze podataka). Napadač sa ovim podacima može da proba više načina da zaobiđe autentifikaciju. Najčešči oblik napada je da se kod korisničkog imena unese korisnicko’ or ‘bilo_sta’ = ‘bilo_sta’ — .
Zato što počinje sa SQL komentarom (–) upit se tu prekida. Ovaj pristup dozvoljava napadaču upad čak i ako ne zna ni korisničko ime. A ako napadač zna neko korisničko ime onda može i da preuzme taj nalog. Sprečavaje napada se sastoji u tome da se podaci pravilno filtriraju i da se vrši ‘escape’ podataka.
Za ‘escape’ podataka se koristi PHP ugrađena funkcija, za MySQL bazu podataka ovo je funkcija mysql_real_escape_string( ). Ali ako funkcija za bazu podataka ne postoji onda se može koristiti i funkcija addslashes(). Sa ovakvom zaštitom rizik od napada gotovo i da ne postoji.






