Jei išvardysime žiniatinklio programų pažeidžiamumus, kurie turėjo didžiausią poveikį dėl jų sukeltų sunkumų, be jokios abejonės, rasime SQL įpurškimas. Tai pažeidžiamumas jis netgi gali leisti užpuolikui pereiti nuo duomenų bazės turinio sąrašo prie visiškos prieigos prie serverioPažiūrėkime, iš ko jis susideda.
Terminas injekcija, reiškia SQL sakinių įterpimą arba pridėjimą į užklausą, kurią programa vykdo į duomenų bazę; tai atliekama pasinaudojant bet kokiu duomenų įvedimu, kurio programa tiesiogiai ar netiesiogiai prašo iš vartotojo, mes tiesiogiai nurodome laukus, pavyzdžiui, formas kai vartotojas įveda tam tikrus duomenis, netiesiogiai jie gali būti parametrai, perduodami per URL (GET). SQL sakinių įterpimo į užklausą tikslas yra pakeisti minėtos užklausos logiką arba rezultatą, kurį grąžins duomenų bazė.
Tai tipiška forma, kai prašoma vartotojo vardo ir slaptažodžio, kad būtų galima pasiekti privačią zoną. Užklausą formuojantis serverio pusės kodas būtų toks:
$ username = $ _POST ['naudotojo vardas']; $ password = $ _POST ['slaptažodis']; $ sql = "SELECT * FROM users WHERE username = '$ username' AND password = '$ password'";Kaip matome, pirmiausia išsaugomas vartotojo vardas ir slaptažodis, įvesti į vartotojo vardo ir slaptažodžio kintamuosius, tada šios vertės įtraukiamos į užklausą, kuri bus išsiųsta į duomenų bazę, kad patikrintų, ar tas vartotojas egzistuoja. Tarkime, kad mūsų pavyzdyje vartotojas įveda kaip vartotojo vardą admin ir slaptažodį 123, siunčiant formą, suformuota užklausa bus tokia:
PASIRINKITE * NUO vartotojų, kur username = 'admin' IR password = 'pass123'Kaip matome, kai pateikiami įvesties duomenys, jie yra tarp atskirų kabučių, rodančių, kad tai yra teksto eilutė. Ši užklausa bus išsiųsta į duomenų bazę ir grąžins rezultatą su minėto vartotojo duomenimis, jei toks yra, ir bus suteikta prieiga prie privačios zonos, priešingu atveju bus pateiktas tuščias rezultatas ir prieiga bus uždrausta.
Kaip jau minėjome anksčiau, SQL injekcija Jį sudaro SQL kodo pridėjimas prie užklausos, ir ši forma leidžia tai padaryti per įvesties laukus, kad turėtume programą, kuri yra pažeidžiama SQL įvedimo.
Išnaudoti pažeidžiamumą
Šio pažeidžiamumo tikslas yra patekti į privačią zoną nežinant teisingo vartotojo vardo ar slaptažodžio ir išnaudoti pažeidžiamumą. Taigi, mes turime pasiekti SQL kodą, kad suformuotume užklausą, kuri grąžina galiojantį rezultatą.
Pažiūrėkime, kaip suformuojama užklausa, jei slaptažodžio lauke įvesime šį SQL kodą:
Kai užklausa bus suformuota, ji bus tokia:
PASIRINKITE * NUO vartotojų, kur naudotojo vardas = "įsilaužėlis" IR slaptažodis = "" arba 1 = 1 # "Reikėtų atkreipti ypatingą dėmesį į tai, kad įterptas kodas yra tarp kabučių, kuriose yra slaptažodis, o viena kabutė įterpto kodo pradžioje yra atsakinga už atviros kabutės užpildymą slaptažodžio dalyje. užklausą, tokiu būdu laikinai gauname šią užklausą:
PASIRINKITE * NUO vartotojų, kur naudotojo vardas = "įsilaužėlis" IR slaptažodis = ""Ši užklausa šiuo metu rezultatų negrąžins, nes nėra tokio vartotojo su šiais kredencialais, tačiau panagrinėkime likusią įterpto kodo dalį:
arba 1 = 1 #Nuosprendis arba 1 = 1 radikaliai keičia užklausos logiką, nes, kaip žinome, sąlyginės sąlygos suformuotoje užklausoje ARBA Tai grįš tiesa, kai bus įvykdyta bent viena iš dviejų išraiškų, mūsų atveju pirmoji išraiška yra vartotojo vardas = "įsilaužėlis" IR slaptažodis = "" , ir antrasis arba 1 = 1 , pastarasis visada yra teisingas, tai yra, 1 visada lygus 1, nes užklausa pateiks galiojantį rezultatą.
Galiausiai turime atsikratyti sakinio uždarančios kabutės, tam galime panaudoti komentarus SQL: #, - (dvigubas brūkšnys), O gerai /* */ . Taigi visa užklausa yra tokia:
PASIRINKITE * NUO vartotojų, kur naudotojo vardas = "įsilaužėlis" IR slaptažodis = "" arba 1 = 1 # "Viskas po # bus atsižvelgiama kaip komentaras ir nebus užklausos dalis.
Norėdami gauti teisingą rezultatą, yra daug kitų kodo variantų, kuriuos galime įterpti, pavyzdžiui: