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.