Ja mēs uzskaitām tīmekļa lietojumprogrammu ievainojamības, kurām ir bijusi vislielākā ietekme to radīto nopietnības pakāpes dēļ, bez šaubām, mēs atradīsim SQL injekcija. Šī ievainojamība tas var pat ļaut uzbrucējam pāriet no datu bāzes satura uzskaitīšanas līdz pilnīgai piekļuvei serverimApskatīsim, no kā tas sastāv.
Termiņš injekcija, attiecas uz SQL paziņojumu ievadīšanu vai pievienošanu vaicājumā, ko lietojumprogramma izpilda datu bāzē; tas tiek darīts, izmantojot visas datu ievades iespējas, kuras lietojumprogramma tieši vai netieši pieprasa no lietotāja, mēs atsaucamies tieši uz laukiem, piemēram, veidlapām ja lietotājs ievada noteiktus datus, tie netieši var būt parametri, kas tiek nodoti caur URL (GET). SQL paziņojumu ievadīšanas mērķis vaicājumā ir mainīt minētā vaicājuma loģiku vai rezultātu, ko atgriezīs datu bāze.
Šī ir tipiska forma, kurā, lai piekļūtu privātai zonai, tiek prasīts lietotājvārds un parole. Vaicājumu veidojošais servera puses kods būtu aptuveni šāds:
$ username = $ _POST ['lietotājvārds']; $ parole = $ _POST ['parole']; $ sql = "SELECT * FROM users WHERE username = '$ username' AND password = '$ password'";Kā redzam, vispirms tiek saglabāts lietotājvārda un paroles mainīgajos ievadītais lietotājvārds un parole, pēc tam šīs vērtības tiek iekļautas vaicājumā, kas tiks nosūtīts uz datu bāzi, lai pārbaudītu, vai minētais lietotājs eksistē. Pieņemsim, ka mūsu piemērā lietotājs ievada lietotājvārdu admin un paroli 123, nosūtot veidlapu, izveidotais vaicājums būs šāds:
SELECT * FROM users WHERE username = 'admin' AND password = 'pass123'Kā redzam, ievietojot ievades datus, tie atrodas starp pēdiņām, lai parādītu, ka tā ir teksta virkne. Šis vaicājums tiks nosūtīts uz datu bāzi un atgriezīs rezultātu ar minētā lietotāja datiem, ja tādi būs, un piekļuve privātajai zonai tiks atļauta, pretējā gadījumā tiks atgriezts tukšs rezultāts un piekļuve tiks liegta.
Kā jau iepriekš minējām, SQL injekcija Tas sastāv no SQL koda pievienošanas vaicājumam, un šī veidlapa to ļauj ievades laukos, lai mums būtu lietojumprogramma, kas ir neaizsargāta pret SQL ievadīšanu.
Ievainojamības izmantošana
Šīs ievainojamības izmantošanas mērķis ir piekļūt privātajai zonai, nezinot pareizo lietotājvārdu vai paroli, un izmantot ievainojamību. Tātad mums ir jāsasniedz SQL kods, lai izveidotu vaicājumu, kas atgriež derīgu rezultātu.
Apskatīsim, kā tiek veidots vaicājums, ja paroles laukā ievadām šādu SQL kodu:
Kad vaicājums ir izveidots, tas būs šāds:
SELECT * FROM users WHERE username = 'hacker' AND password = '' or 1 = 1 # 'Svarīga uzmanība jāpievērš faktam, ka ievietotais kods atrodas starp pēdiņām, kas ietver paroli, un vienotā pēdiņa ievietotā koda sākumā ir atbildīga par atvērtās pēdiņas aizpildīšanu paroles = 'daļā. vaicājums, šādā veidā mēs īslaicīgi iegūstam šādu vaicājumu:
SELECT * FROM users WHERE username = 'hacker' AND password = ''Šis vaicājums pašlaik neatgriezīs rezultātus, jo nav šādu lietotāju ar šiem akreditācijas datiem, tomēr analizēsim pārējo ievietoto kodu:
vai 1 = 1 #Teikums vai 1 = 1 radikāli maina vaicājuma loģiku, jo, kā mēs zinām, nosacījuma veidotajā vaicājumā VAI Tā atgriezīsies taisnība, kad būs izpildīta vismaz viena no divām izteiksmēm, mūsu gadījumā pirmā izteiksme ir lietotājvārds = "hakeris" UN parole = "" , un otrais vai 1 = 1 , pēdējais vienmēr ir taisnība, tas ir, 1 vienmēr ir vienāds ar 1, jo vaicājums atgriezīs derīgu rezultātu.
Visbeidzot, mums ir jāatbrīvojas no pēdiņas, kas aizver teikumu, tāpēc mēs varam izmantot komentārus, kas izmantoti SQL: #, - (dubultā svītra), Ak labi /* */ . tāpēc pilnīgs vaicājums ir šāds:
SELECT * FROM users WHERE username = 'hacker' AND password = '' or 1 = 1 # 'Viss pēc # tiks ņemts vērā kā komentārs un netiks iekļauts vaicājumā.
Lai iegūtu derīgu rezultātu, mēs varam ievietot daudzus citus koda variantus, piemēram: