SQL injekcija
SQL injekcija ir datorsistēmu ielaušanās veids, kurā uzbrucējs ar klienta tiesībām mēģina piekļūt datubāzei, kas ir dotās tīmekļa lapas vai aplikācijas pamatā. Mūsdienās SQL injekcija ir vispopulārākais aplikācijas līmeņa uzbrukuma veids. SQL Injekcijas pamatā ir nepareizi uzrakstītas programmas vai web aplikācijas, kas lietotājam ļauj veikt datubāzes vaicājumus, kuras nav paredzējis programmatūras vai mājaslapas izstrādātājs. Šai situācijai pamatā parasti ir nepietiekoša lietotāju ievadītās informācijas pārbaude, kuras rezultātā netiek filtrēti SQL īpašie simboli.
SQL injekcijas piemērs
Autorizācijas forma, kurā jāievada lietotājvārds un parole. Formas nosūtīšanas rezultātā tiek izpildīts sekojošs SQL pieprasījums:
SELECT * FROM lietotaji WHERE lietotajvards='LIETOTAJVARDS' AND parole='PAROLE';
Uzbrucējam nepieciešams piekļūt attiecīgās aplikācijas administratora ierakstam. Lai to izdarītu SQL vaicājumu nepieciešams modificēt sekojošā veidā:
SELECT * FROM lietotaji WHERE lietotajvards='admin' OR lietotajvards=kautkas AND parole='%%'
Ievadot autorizācijas formā lietotājvārda vietā admin' OR lietotajvards=kautkas būs iespējams autorizēties kā lietotājam "admin" nezinot paroli. Dotais SQL piemērs pirmajā gadījumā atlasīs ierakstu lietotāju tabulā kā meklēšanas kritērijus izmantojot lietotāja vārdu UN paroli. Otrajā gadījumā kā meklēšanas kritērijs tiks izmantots lietotāja vārds UN parole VAI tikai lietotāja vārds.
Modificējot datubāzes vaicājumu un pievienojot tam galā loģisko nosacījumu, kas vienmēr izpildās, uzbrucējs lielākajā daļā gadījumu būs spējīgs nolasīt visus dotās datubāzes tabulas ierakstus, vai arī no kļūdas paziņojumiem izdarīt kādus tālākus secinājumus.
Praktiskā realizācija
Šeit dots ieskats SQL injekcijas praktiskai realizācijai, piemērā izmantojot MySQL DBVS.
Injekcijas iespējas meklēšana
Praktisks piemērs, kur tiek izmantota MySQL DB kļūdaina izmantošana. Pārbaudīt web lapu uz SQL injekcijas iespējamību var veikt ievadot pārlūkprogrammas adreses rindā modificētu pieprasījumu (piemēram: http://www.al_quaeda.org/news/iraq/newsarticle.php?id=666'), kas izraisa datu bāzes kļūdu. To var fiksēt, ja logā parādās šāds vai līdzīgs uzraksts: "You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near..." Tas liecina, ka netiek filtrēti nekorekti simboli, šajā gadījumā- apostrofs.
Pieprasījuma normalizēšana
Nākamais uzbrucēja uzdevums ir noskaidrot SQL tabulas kolonnu skaitu. To veic vispirms ievadot pieprasījumu ar acīmredzami lielāku ierakstu skaitu kā reāli tiek izmantots, piemēram 99999- http://www.al_quaeda.org/news/iraq/newsarticle.php?id=99999%20order%20by%2015. Izvadīts tiek apmēram šads paziņojums-Unknown column '15' in 'order clause'. Samazinot pēdējo skaitli, meklējam patieso kolonnu skaitu, ko var noteikt, ja neparādās kļūdas paziņojums: http://www.al_quaeda.org/news/iraq/newsarticle.php?id=99999%20order%20by%207- kļūdas nav http://www.al_quaeda.org/news/iraq/newsarticle.php?id=99999%20order%20by%2012- kļūda ir. Tā mainot pēdējo parametru, noskaidrojam, ka kļūdas paziņojums pazūd pie pieprasījuma "order by 10", kas arī ir meklētais skaitlis. Tālāk ievadām pieprasījumu http://www.al_quaeda.org/news/iraq/newsarticle.php?id=99999%20union%20select%201,2,3,4,5,6,7,8,9,10. Pārlūkprogramma izvada attēlu, kurā redzami daži no ciparu rindas simboliem- piem. 4, 5, 10.
Sensitīvas informācijas iegūšana
Modificējam pieprasījumu: http://www.al_quaeda.org/news/iraq/newsarticle.php?id=99999%20union%20select%201,2,3,version(),5,6,7,8,9,10. Ja datu tipi izvades laukā pieļauj teksta informācijas izvadi, tad tiek izvadīta datu bāzes MySQL versija. Ja četrnieku logā nomaina uzraksts, kas ir līdzīgs šim - 5.0.45-log, tad top zināma izmantotā MySQL versija. Šeit būtiskākais ir pirmais cipars- 3.xx versijās ir ļoti grūti darboties praktiski (aplūkotā metode vispār nebūs iespējama), 4.xx arī nākas paļauties uz intuīciju, kamēr 5.xx piedāvā ērtus instrumentus ne tikai MySQL lietotājam, bet arī hakerim. Tā aplūkotajā gadījumā, izmantojot piektās MySQL versijas sistēmas tabulu, var noskaidrot visu DB tabulu nosaukumus. Modificējot pieprasījumu uz ..%20union%20select%201,2,3,table_name,5,6,7,8,9,10 %20from%20information_schema.tables, iegūst pirmās tabulas nosaukumu. Tālāk, izmantojot komandu limit x.x, ko pievieno pieprasījuma beigās, var noskaidrot visu DB tabulu nosaukumus. Vēl viena sistēmas tabula - INFORMATION_SCHEMA.COLUMNS, ļauj līdzīgā veidā noskaidrot kolonnu nosaukumus. Kad tas ir izdarīts, tad iegūt attiecīgās mājas lapas lietotājvārdus un attiecīgo paroļu hešus ir tikai tehnisks jautājums.
Aizsardzība
Lai izvairītos no šāda tipa uzbrukumiem, nepieciešams veikt drošības pasākumus:
- Vienmēr un visur pārbaudīt vai lietotāju ievadītais teksts nesatur kādu no SQL robežsimboliem.
Ārējās saites
![]() | Šis ar informācijas tehnoloģijām saistītais raksts ir nepilnīgs. Jūs varat dot savu ieguldījumu Vikipēdijā, papildinot to. |