SQL Injection

Aplikacionet Web dhe ato Desktop që kanë akses në bazën e të dhënave mund të dërgojnë dhe të marrin të dhëna prej saj. Këto aplikime bien shpesh pre e sulmeve SQL Injection në qoftë se nuk aplikohet mbrojtja e duhur ndaj saj. Gjatë një sulmi SQL Injection, sulmuesi fut një input string në aplikacion me qëllim që të bëjë të mundur ndryshimin e komandës SQL në favor të tij. Ky lloj sulmi mund ta dëmtoj bazën e të dhënave në mënyra të ndryshme si për shembull përfitimin e aksesit të padrejtë në sistem, marrjen e të dhënave sensitive ose manipulimin e padrejtë të të dhënave. Gjithashtu mund të përdoret për të ekzekutuar komanda në nivel sistemi me qëllim që të ndalojë funksionimin e aplikacionit (sulmet Denial Of Service).

 

Disa tipe sulmesh SQL Injection

 

  • Sulm për të manipuluar të dhënat:

Një sulm për të manipuluar të dhënat, që është nga sulmet që hasen më shpesh, ndryshon komandën SQL në aplikacion duke ndryshuar për shembull kushtin WHERE të query-t, ose e zgjeron atë me komponentë të tjerë duke përdorur operatorët UNION, INTERSECT ose MINUS. Sulmi më tipik i ndryshimit të query-t është gjatë aksesit në sistem.

Supozojmë një procedurë të thjeshtë aksesi në sistem që kontrollon nëse ka përdorues me këtë postë elektronike dhe këtë fjalëkalim që vendos përdoruesi:

SELECT * FROM `users` WHERE `email` = ‘email and `password` =

‘password’.

Sulmuesi do të përpiqet ta manipuloj këtë query si më poshtë:

SELECT * FROM `users` WHERE `email` = ‘email and `password` =

‘password’ or ‘x’ = ‘x’.

 

Si rrjedhojë, sulmuesi që e di që përdoruesi ‘email’ është një përdorues i vlefshëm në sistem, por nuk di fjalëkalimin, mund të ketë akses në sistem me të gjitha të drejtat që ka ai përdorues.

  • Futja e komandave shtesë tek kodi SQL ekzistues:

Një tjetër tip sulmi SQL Injection është futja e komandave shtesë tek kodi SQL ekzistues duke shfrytëzuar gabime që shkaktohen nga procesimi i të dhënave jo të sakta. Sulmuesi mund të vendos kod në aplikacion për të ndryshuar rrjedhën e ekzekutimit të aplikacionit. Kjo mënyrë sulmi përdoret shpesh për të marrë kontrollin ose për të goditur sistemet me qëllim që të përfitojnë informacion.

  • Sulmet duke thirrur funksione:

Këto sulme krijohen duke thirrur funksione të bazës së të dhënave ose të sistemit me qëllim që të manipulohen të dhënat. Çdo funksion që ndodhet në bazën e të dhënave mund të thirret brenda një query që shërben për tjetër qëllim duke dëmtuar të dhënat në qoftë se nuk mbrohesh nga ky sulm.

 

BEGIN

SET @QUERY = "UPDATE punonjes set uStatus = 0";

PREPARE stmt1

FROM

@QUERY;

EXECUTE stmt1;

END

 

Rreziku që shoqëron sulmet SQL Injection

 

Sulmet SQL janë shumë të dëmshme dhe rreziku që vjen nga këto sulme motivon sulmuesit. Disa prej këtyre rreziqeve janë si më poshtë:

  • Sulme Denial Of Service. Sulmuesit mund të mbushin serverin me kërkesa duke bërë që ky i fundit të mos të mund ti përgjigjet përdoruesve të vlefshëm, ose të fshihen të dhëna prej tij.
  • Tejkalimi i autentikimit. Ky sulm është nga sulmet që hasen më shpesh dhe konsiston në përfitimin e aksesit nga përdorues të paautorizuar në sistem të cilët mund të bëjnë çdo lloj veprimi që dëshirojnë.
  • Përfitimi i informacionit në lidhje me strukturën e databazës. Në këtë tip sulmi, sulmuesi mbledh informacion në lidhje me tipin dhe strukturën e të dhënave në databazën e aplikacioneve Web. Ky sulm mundësohet nga fakti që faqja e gabimit e kthyer nga serveri jep informacione shpjeguese për këto të dhëna.
  • Ekzekutimi i komandave nga distanca. Kjo mënyrë u mundëson sulmuesve të ekzekutojnë komanda në databazë ose funksione dhe procedura nga distanca.

Si të mbrohemi nga sulmet SQL Injection

 

Mbrojtja nga ky sulm mund të arrihet duke aplikuar rregulla të ndryshme programimi.

  • Shprehje të parametrizuara:

Një mënyrë mbrojtjeje për shembull është duke përdorur shprehje të parametrizuara si për shembull:

$mail = $request->uMail;

$pass = $request->uPass;

$stmt = $con->prepare('SELECT * FROM punonjes WHERE uMail=? and uPass=?');

$stmt->bind_param('ss', $mail, $pass);

$stmt->execute();

$result = $stmt->get_result();

if($result){

$result = mysqli_fetch_array($result);

}

Pra në vend që të përdoren inputet e përdoruesit direkt në shprehjen që do të ekzekutohet në databazë, fillimisht ato ruhen në variabla dhe shprehja parapërcakton variablat që pret të marrë duke e shmangur kështu rrezikun e sulmeve SQL Injection.

  • Filtrimi i inputit:

Një mënyrë tjetër e mbrojtjes ndaj këtij sulmi është nëpërmjet filtrimit të inputit. Kjo teknikë përdoret për të hequr karakteret ‘escape’. Një shembull i thjeshtë është duke zëvendësuar thonjzën teke (‘) me thonjza dyshe (“). Vlen të theksohet që kjo mënyrë nuk është shumë e sigurt duke qënë se ka shumë karaktere ‘escape’ që mund të shpëtojnë.

$mail = mysqli_real_escape_string($con, $request->uMail);

$pass = mysqli_real_escape_string($con, $request->uPass);

$stmt = "SELECT * FROM punonjes WHERE uMail='$mail ' and uPass='$pass'";

$exec_stmt->mysqli_query($con, $stmt);

if($exec_stmt){

$result = mysqli_fetch_array($exec_stmt);

}

  • Përdorimi i framework:

Një mënyrë tjetër e sigurtë e aksesit të databazës me anë të query-ve të sigurta është duke përdorur modelet në framework që përdorin llogjikën MVC. Framework e mundësojnë vetë mbrojtjen ndaj këtyre sulmeve.

$result = DB::table('punonjes')->select('id', 'uType')

->where('uMail', '=', $requesr->uMail)

->where('uPass', '=', md5($request->uPass))

->where('uStatus', '=', true)

->first();

 

 

Referenca

 

  1. Elmasri, Ramez, Navathe, Shamkant B. Foundations of Database Systems. 6th ed. Pearson,
  2. https://www.wikipedia.org
  3. http://php.net

Leave a Reply

Your email address will not be published. Required fields are marked *