This is an old revision of the document!
Second order SQL injection
Second order SQL injection je podskup SQL injection ranjivosti, koji je kompliciraniji za izvršiti, ali je i razvojnim programerima teže detektirati takvu ranjivost . Razlika je što obični (first order) SQL injection je prisutan u slučajevima kada se korisnički unos, koji se odmah izvršava unutar nekog SQL upita, nije dobro sanitiziran i osiguran, dok second order SQL injection se izvršava tako da se neki korisnički unos prvo pohrani negdje na server ili u bazu podataka, a zatim se pozivanjem neke druge funkcionalnosti, koja koristi taj pohranjeni korisnički unos izvršava SQL injection.
Jednostavan primjer bi bio aplikacija, gdje je forma za registraciju korisnika zaštićena od SQL injectiona tako što dobro interpretira unos korisnika kao string i ne može se „escape-ati“ pomoću posebnih znakova, te bi korisnik pokušajem registracijom gdje unosi vrijednost
" user' or 'a' = 'a' — "
u polje imena novog korisnika, samo stvorio novog korisnika kojemu bi username bio
" user' or 'a' = 'a' — "
, ali kada bi taj korisnik koristio funkcionalnost promjene lozinke, gdje se pri promjeni lozinke koristi SQL upit u koji se ubacuje korisničko ime korisnika kojemu se mijenja lozinka, ako kod nije ispravno zaštićen, izvršio bi seSQL injection unutar SQL koda u kojemu bi se trebalo odabranom korisniku promijeniti lozinku.
Primjer nezaštićenog koda za izmjenu lozinke bio:
"UPDATE users SET password=" + novi_password + "WHERE username=" + korisnicko_ime "and password=" + stari password
(pretpostavka je da je korisnikov unos novog passworda također dobro filtriran)
Pri pokretanju ovog koda za prethodno registriranog korisnika s unosom novog passworda „moj_novi_password23“, kod koji bi se izvršio bi bio:
UPDATE users SET password= ’moj_novi_password23’ WHERE username= ’user' or 'a' = 'a' — ’ and password= 'stari_password'
No, uzimajući u obzir da je </code>—</code> jednako komentaru, prethodan kod jest ekvivalentan sljedećem:
UPDATE users SET password= ’moj_novi_password23’ WHERE username= ’user' or 'a' = 'a'
, čime bi se svim korisnicima password promijenio u
moj_novi_password23
.