SQL-injekcija
Parašytas: 2006 04 02 20:46
Kuomet nuskenavus serverį pamatote, kad čia veikia tik vienas servisas - Web serveris, jums nelieka jokios kitos išeities, kaip tik pulti Web programas(skriptus). SQL injekcija yra vienas iš atakų prieš web skriptus būdų.
SQL(Sturctured Query Language) - tai viena iš populiariausių(jeigu ne pati populiariausia) duomenų bazių valdymo sistemų kalba. Na o pati populiariausia duomenų bazių valdymo sistema yra mysql.
SQL injekcijos pažeidžiamumas gana yra gana dažnas web skriptinimo kalbose(PHP,CGI,ASP). Jis įvyksta dėl neteisingo įvedamų duomenų apdorojimo.
Sakykime turime vartotojas.php skriptą:
Taigi išvkietę skriptą: vartotjas.php?id=1 gausime varotojo su id = 1 duomenis, nes skriptas per get(arba post) gautą kintamąjį įstatys į SQL užklausą ir ji atrodys šitaip:
Pabandykime pakeisti skriptui perduodamą parametrą 1 į "1' or 1=1";--" :
Mūsų skriptas šiuos duomenis įkels į SQL užklausą:
Ši užklausa išrinks visus įrašus kurių id bus 1 arba 1=1. Taigi bus išrinkti visi įrašai.
Mūsų kintamąjame po pirmojo skaičiaus 1 padėta vienguba kabutė SQL užklausoje virsta kabute, pabaigiančia argumentą(1), o toliau sekanti dalis virsta SQL užklausa. Po išsireiškimo 1=1 einančios dvigubos kabutės skripte pavirsta užklausos baigimo simboliu(PHP kalboje duomenų eilutės ribojamos dvigubomis kabutėmis). Po jų einantis kabliataškis virsta sakinio baigimo simboliu(pagal PHP sintaksę). Na o pabaigoje einantys du -- simboliai, nurodo(pagal SQL), kad viskas, kas toje pačioje eilutėje eina po jų, yra komentaras ir tai reikia ignoruoti. Taip ignoruojami skripte parašyti simboliai ir išvengiama sintaksės klaidos. Taigi tokia mūsų suformuluota užklausa perduodama SQL serveriui grąžina visus lentelės įrašus.
Pastaba:Šis dalykas veikia tik tokiame web serveryje, kuriame išjungtas kabučių filtravimas. Apache web serveriui tai būtų nustatymas "gpc_magic_quotes=off" php.ini faile.
SQL(Sturctured Query Language) - tai viena iš populiariausių(jeigu ne pati populiariausia) duomenų bazių valdymo sistemų kalba. Na o pati populiariausia duomenų bazių valdymo sistema yra mysql.
SQL injekcijos pažeidžiamumas gana yra gana dažnas web skriptinimo kalbose(PHP,CGI,ASP). Jis įvyksta dėl neteisingo įvedamų duomenų apdorojimo.
Sakykime turime vartotojas.php skriptą:
Kodas: Pasirinkti visus
<?php
// kazkur vykdomas prisijungimas prie duomenų bazės
$id = $_GET['id'];
$query = "SELECT * FROM vartotojai WHERE id = '$id'";
$rez = mysql_query($query);
// isvedami rezultato duomenys
?>
Kodas: Pasirinkti visus
"SELECT * FROM vartotojai WHERE id ='1'";
Kodas: Pasirinkti visus
vartotojai.php?id=1' or 1=1";--
Kodas: Pasirinkti visus
"SELECT * FROM vartotojai WHERE id ='1' or 1=1";--'"
Mūsų kintamąjame po pirmojo skaičiaus 1 padėta vienguba kabutė SQL užklausoje virsta kabute, pabaigiančia argumentą(1), o toliau sekanti dalis virsta SQL užklausa. Po išsireiškimo 1=1 einančios dvigubos kabutės skripte pavirsta užklausos baigimo simboliu(PHP kalboje duomenų eilutės ribojamos dvigubomis kabutėmis). Po jų einantis kabliataškis virsta sakinio baigimo simboliu(pagal PHP sintaksę). Na o pabaigoje einantys du -- simboliai, nurodo(pagal SQL), kad viskas, kas toje pačioje eilutėje eina po jų, yra komentaras ir tai reikia ignoruoti. Taip ignoruojami skripte parašyti simboliai ir išvengiama sintaksės klaidos. Taigi tokia mūsų suformuluota užklausa perduodama SQL serveriui grąžina visus lentelės įrašus.
Pastaba:Šis dalykas veikia tik tokiame web serveryje, kuriame išjungtas kabučių filtravimas. Apache web serveriui tai būtų nustatymas "gpc_magic_quotes=off" php.ini faile.