Locked History Actions

SQLi

Žodis angliškai:

Structured Query Language injection

Santrumpa:

SQLi

Žodis lietuviškai:

SQL injekcija

Apibrėžimas:

SQL injekcija vienas dažniausių internetinių svetainių, turinčių duomenų bazes, įsilaužimo būdų. Šis metodas gali būti naudojamas informacijos iš duomenų bazės ištraukimui, arba duomenų bazės turinio keitimui. SQL injekcija yra vykdoma įterpiant į web įvesties lauką tam tikrą SQL formuluotę, kuri priverstų duomenų bazę išduoti norimą informaciją ar įvykdytų kenkėjiško vartotojo nurodytą veiksmą. Nors SQL injekcija dažniausiai yra naudojama atakose prieš interneto svetaines, tačiau taip pat gali būti panaudota prieš bet kokią SQL duomenų bazę.

SQL injekcijos tipo ataka yra laikoma viena iš 10 labiausiai grėsmingų atakų nukreiptų prieš web aplikacijas 2007-2010 metų laikotarpyje. Priklausomai nuo techninių aspektų yra skirstomos 5 SQL injekcijos sub-klasės:

  • Klasikinė SQL injekcijos ataka (Classic SQLIA);
  • Išvadinė SQL injekcijos (Inference SQL Injection);
  • Manipuliavimas SQL injekcijomis (Interacting with SQL Injection);
  • Į specifinę duomenų bazės valdymo sistemą orientuota SQL injekcijos ataka (DBMS specific SQLIA);
  • Mišri SQL injekcijos ataka (Compound SQLIA).

Taip pat įmanomos įvairios SQL injekcijų apjungimų su kitais atakų tipais apjungimai:

  • SQL injekcija + Neefektyvus autetifikavimas (SQL Injection + Insufficient authentication);
  • SQL injekcija + Paskirstyto atsisakymo aptarnauti ataka (SQL Injection + DDoS attacks);
  • SQL injekcija + DNS perėmimas (SQL Injection + DNS Hijacking);
  • SQL injekcija + XSS (SQL Injection + XSS).

Atviro kodo SQL injekcijų pažeidžiamumams nustatyti naudojami įrankiai:

  • wpoison;
  • sqlmap;
  • wapiti;
  • w3af;
  • paros;
  • squid.

Naudota literatūra:

https://www.owasp.org/index.php/SQL_injection

http://en.wikipedia.org/wiki/SQL_injection

http://www.namelesswiki.com/wiki/SQL_Injection

SQL injekcijos ir jų prevencijos būdai:

SQL injekcijos (angl. Structured Query Language Injections) – atakos forma, kai vartotojas per duomenų įvesties laukelį serveriui nusiunčia SQL užklausą, taip apgaudamas duomenų bazės sistemą, kad ši įvykdytų kenkėjišką kodą. Pavyzdžiui toks kodas galėtų ištrinti kurią nors duomenų bazės lentelę. Ši grėsmė atsiranda, kai vartotojo įvesti duomenys nėra tikrinami ar naudojamos paprastos SQL užklausos.

Išskiriami du SQL injekcijų atakų tipai: pirmos eilės (angl. first order) ir antros eilės (angl. second order). Pirmos eilės atakos metu piktavalis vartotojas gauna norimą rezultatą iškarto. Antros eilės atakos metu į duomenų bazę įterpiami kokie nors kenkėjiški duomenys, kurie lieka duomenų bazėje ilgam ir kenkia nuolatos. Duomenys, jau esantys duomenų bazėje, dažniausiai laikomi patikimais ir nėra papildomai tikrinami.

SQL injekcijų grėsmė atsiranda dėl to, kad SQL užklausos prisitaiko prie kiekvieno vartotojo pagal jo įvestus duomenis. Paprastos užklausos, be keičiamų parametrų, yra saugios.

Saugi SQL užklausa:

SELECT * FROM pets WHERE owner='Gwen' AND species='cat'

Pažeidžiama SQL užklausa:

$name = $_POST["name"]; $query = "SELECT * FROM customers WHERE username = '$name'";

Pažeidžiamoje užklausoje vartotojo įvesta reikšmė siunčiama tiesiai į SQL užklausą, taigi piktavalis užuot įvedęs tai ko iš jo prašoma gali įvesti tokią SQL užklausą:

'; DELETE FROM customers WHERE 1 or username = '

Tuomet šios dvi užklausos apsijungs ir serveris apdoros tokią užklausą:

SELECT * FROM customers WHERE username = ' '; DELETE FROM customers WHERE 1 or username = ' '

Įvykdžius tokią SQL kenkėjišką SQL užklausą bus ištrinti visi įrašai iš customers lentelės duomenų bazėje. Taigi neapsaugotos duomenų bazių užklausos tampa lengu taikiniu kenkėjams.

Iš pateiktų pavyzdžių matome, kad norint atlikti sekmingą SQL injekciją reikia žinoti duomenų bazės struktūrą. Tačiau šią informaciją gauti dažniausiai yra labai lengva, nes dažnai naudojama atviro kodo ar viešai platinama programinė įranga. Uždaro kodo programinės įrangos irgi negalima laikyti labai saugia, nes joje vistiek greičiausiai bus lentelė, talpinanti vartotojų duomenis, kuri vadinsis users ir turės stulpelius id, username, password.

Nuo SQL injekcijų galima apsisaugoti keliais būdais: nesijungti prie duomenų bazės kaip super vartotojas, naudojant parametrizuotas užklausas, tikrinti visus vartotojų įvedamus duomenis. Filtruojant vartotojo įvedamus duomenis, reikia atsižvelgti į tai, kokios reikšmės yra galimos. Jei vartotojo yra prašoma įvesti skaitinę vertę, būtina tikrinti ar jis tikrai įveda tik skaičius, jei prašoma įvesti vardą, reikia tikrinti ar įvedamos tik raidės. Taip pat galima apriboti įvedamos simbolių eilutės ilgį. Didžiausią pavojų saugumui kelia leidimas įvedinėti apostrofus, nes jie yra plačiai naudojami SQL sintaksėje. Kuo geriau bus apgalvota vartotojo įvedamų duomenų kontrolė, tuo labiau sumažės SQL injekcijų pavojus. Tačiau tokios apsaugos nevisada pakanka. Geriausiai nuo SQL injekcijų galima apsisaugoti naudojant parametrizuotas užklausos. Šios užklausos tampa prieinamos naudojant MySQL papildymą – MySQLi.

Parametrizuota saugi SQL užklausa:

$name = $_POST["name"]; $mysqli->prepare( "SELECT * FROM customers WHERE username = ?");

$stmt->bind_param("s", $name);

Parametrizuotose užklausose klaustuku yra žymimi dar nežinomi duomenys, kurie ir vadinami parametrais. Tokių užklausų esmė yra tame, kad duomenys ir programos kodas yra apdorojami atskirai. Pirmiausiai sukompiluojama SQL užklausa, o tik tada vietoj klaustukų įrašomi vartotojo įvesti duomenys. Tačiau prieš susiejant klaustukus su vartotojo įvestais duomenimis, jie yra konvertuojami į nurodytą duomenų tipą, šiuo atveju tai yra duomenų eilutė (s, angl. string) Todėl net jei vietoj duomenų vartotojas įvestų SQL užklausą, programos kodas tai traktuotų kaip paprastus duomenis, nes nuo pat pradžių buvo aiškiai apibrėžta kur yra duomenys ir kur yra programos kodas.