SQL sutrumpinimo pažeidžiamumas paprastai egzistuoja MySQL duomenų bazėse. Šis pažeidžiamumas pirmą kartą buvo aprašytas CVE-2008-4106, kuris buvo susijęs su „WordPress CMS“.
Kaip veikia SQL sutrumpinimo atakos
Ši ataka veikia dėl to, kad sutrumpinamas vartotojo įvedimas duomenų bazėse naudojant „pasirinkimo“ ir „įterpimo“ funkcijas.
- Kai formos lauke pateikiama įvestis, funkcija „Pasirinkti“ patikrina, ar duomenų bazės įvestis atitinka perteklių.
- Patikrinusi perteklių, funkcija „įterpimas“ patikrina įvesties ilgį, o vartotojo įvestis sutrumpės, jei ilgis viršys.
Tarkime, kad kūrėjas sukuria lentelę „vartotojai“ atlikdamas šią užklausą:
sukurti lentelės vartotojus (user_id INT NĖRA VISO AUTO_INCREMENT,
vartotojo vardas VARCHAR (20) NE NULL,
slaptažodis VARCHAR (40) NOT NULL,
PAGRINDINIS RAKTAS (vartotojo ID)
);
Naudodamiesi šia schema, jei kūrėjas sukuria administratoriaus abonementą su šiais būdais:
vartotojo vardas = 'administratorius'slaptažodis = „secret_p4ssw0ord“
Akivaizdu, kad šie įgaliojimai nėra vieši. Duomenų bazėje yra tik viena administratoriaus paskyra, o jei užpuolikas bando užregistruoti kitą paskyrą naudodamas „admin“ vartotojo vardą, užpuolikas nepavyks dėl duomenų bazės perteklinių patikrinimų. Užpuolikas vis tiek gali apeiti tą pertekliaus patikrinimą ir pridėti kitą administratoriaus abonementą, pasinaudodamas „SQL Truncation“ pažeidžiamumu. Tarkime, kad užpuolikas užregistruoja kitą paskyrą naudodamas šį įvestį:
Vartotojo_vardas = 'adminxxxxxxxxxxxxxxxxxandandom'(x yra tarpai)
&
Slaptažodis = „RandomUser“
Duomenų bazėje bus „vartotojo vardas“ (26 simboliai) ir patikrinta, ar ji jau egzistuoja. Tada naudotojo vardo įvestis bus sutrumpinta, o „admin“ („admin“ su tarpu) bus įvesta į duomenų bazę, todėl du administratoriaus vartotojai dublikatai.
Tada užpuolikas gali sukurti „administratoriaus“ vartotoją su savo slaptažodžiu. Dabar duomenų bazėje yra du administratoriaus „vartotojo_vardas“ įrašai, tačiau skirtingi slaptažodžiai. Užpuolikas gali prisijungti naudodamas naujai sukurtus kredencialus, kad gautų administratoriaus skydą, nes tiek vartotojo vardai, tiek „admin“, ir „admin“ yra lygūs duomenų bazės lygiui. Dabar mes pažvelgsime į pavyzdinę praktinę ataką.
Atakos pavyzdys
Šiame pavyzdyje mes paimsime scenarijų iš interneto perjungimo.org. „Overthewire“ bendruomenė teikia karinius žaidimų CTF, kuriuose mes galime pritaikyti savo saugumo koncepcijas. SQL sutrumpinimo scenarijus įvyksta „natas“ žaidime 26-> 27. Mes galime pasiekti lygį naudodami šiuos veiksmus:
URL: http: // natas27.natas.laboratorijos.nuversti.orgVartotojo vardas: natas27
Slaptažodis: 55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ
Šį lygį galima rasti adresu: https: // overthewire.org / wargames / natas / natas27.HTML. Jums bus parodytas prisijungimo puslapis, kuris yra pažeidžiamas dėl SQL sutrumpinimo atakos.
Patikrinę šaltinio kodą, pamatysite, kad vartotojo vardo ilgis yra 64, kaip parodyta žemiau.
Vartotojas vardu „natas28“ jau yra. Mūsų tikslas yra sukurti kitą vartotoją, pavadintą „natas28“, naudojant SQL_truncation ataką. Taigi, įvesime natas28, po to bus 57 tarpai ir atsitiktinė abėcėlė (mūsų atveju a), vartotojo vardas ir bet koks slaptažodis. Raidė „a“ ekrano kopijoje nematoma dėl 65 simbolių ilgio vartotojo vardo. Sukūrę vartotojo abonementą, galėsite pamatytia."
Jei duomenų bazėje yra pažeidžiamumas sql_truncation, duomenų bazėje dabar turėtų būti du „natas28“ vartotojo vardai. Viename vartotojo varde bus mūsų slaptažodis. Pabandykime įvesti kredencialus prisijungimo puslapyje.
Dabar mes esame prisijungę kaip „natas28“ vartotojas.
Švelninimas
Norėdami sušvelninti šį išpuolį, turėsime atsižvelgti į kelis veiksnius.
- Neturėtume leisti dubliuoti kritinių tapatybių, tokių kaip vartotojo vardas. Šias tapatybes turėtume padaryti pirminiais raktais.
- Sutrumpinimo funkcija turėtų būti įgyvendinta visuose frontendo formų laukuose, taip pat ir backend kode, kad duomenų bazės gautų sutrumpintus įvestis.
- Griežtas režimas turėtų būti įjungtas duomenų bazės lygiu. Neįgalinus griežto režimo, duomenų bazės pateikia tik įspėjimus iš vidaus, tačiau vis tiek išsaugo pasikartojančius duomenis. Taikant griežtą režimą, duomenų bazės pateikia klaidų dubliavimosi atveju ir vengia išsaugoti duomenis.
Pavyzdžiui, patikrinkime griežtą režimą naudodami šią užklausą:
mysql> pasirinkite @@ sql_mode
Sukursime duomenų bazę ir lentelės vartotojus."
mysql> CREATE DATABASE testasUžklausa gerai, paveikta 1 eilutė (0.02 sek.)
mysql> Naudoti testą
Duomenų bazė pakeista
mysql> CREATE TABLE vartotojai (vartotojo vardas VARCHAR (10), slaptažodis VARCHAR (10));
Užklausa gerai, paveikta 0 eilučių (0.05 sek.)
Tada sukursime administratoriaus vartotoją su kredencialais, naudodami užklausą INSERT.
mysql> INSERT INTO users VALUES ('admin', 'password1');Užklausa gerai, paveikta 1 eilutė (0.01 sek.)
„Vartotojų“ lentelės informaciją galime pamatyti naudodami parinktį „pasirinkti * iš vartotojų“.
Vartotojo vardo ilgis yra 10 simbolių. Dabar mes išbandysime SQL sutrumpinimo ataką.
Kai bandome įvesti:
Vartotojo vardas = 'adminxxxxxa'(x yra tarpai)
&
Slaptažodis = 'pass2'
Gausime klaidą, o tai reiškia, kad griežtas režimas yra visiškai efektyvus.
mysql> INSERT INTO vartotojų reikšmės („admin a“, „pass2“)KLAIDA 1406 (22001): Duomenys per ilgi stulpeliui „vartotojo vardas“ 1 eilutėje
Jei nebus įjungtas griežtas režimas, duomenų bazė pateiks įspėjimus, bet vis tiek įterps duomenis į lentelę.
Išvada
Užpuolikai gali gauti prieigą prie aukštų privilegijų paskyrų, jei jūsų programoje yra pažeidžiamumas sql_trunction. Užpuolikas, naudodamas kritinius laukus, gali lengvai gauti informacijos apie vartotojo vardą ir jo duomenų bazės ilgį, tada sukurti tą patį vartotojo vardą, po minimalaus ilgio įrašyti tarpus ir atsitiktinę abėcėlę, todėl bus sukurtos kelios aukštos privilegijos paskyros. Šis pažeidžiamumas yra labai svarbus, tačiau jo galima išvengti, jei imsitės tam tikrų saugumo priemonių, pvz., Suaktyvinę griežtą vartotojo įvesties režimą ir jautrų lauką paversdami pagrindiniu duomenų bazės raktu.